diff options
Diffstat (limited to 'scss')
66 files changed, 7278 insertions, 0 deletions
diff --git a/scss/.csscomb.json b/scss/.csscomb.json new file mode 100644 index 000000000..40695a478 --- /dev/null +++ b/scss/.csscomb.json @@ -0,0 +1,304 @@ +{ + "always-semicolon": true, + "block-indent": 2, + "color-case": "lower", + "color-shorthand": true, + "element-case": "lower", + "eof-newline": true, + "leading-zero": false, + "remove-empty-rulesets": true, + "space-after-colon": 1, + "space-after-combinator": 1, + "space-before-selector-delimiter": 0, + "space-between-declarations": "\n", + "space-after-opening-brace": "\n", + "space-before-closing-brace": "\n", + "space-before-colon": 0, + "space-before-combinator": 1, + "space-before-opening-brace": 1, + "strip-spaces": true, + "unitless-zero": true, + "vendor-prefix-align": true, + "sort-order": [ + [ + "position", + "top", + "right", + "bottom", + "left", + "z-index", + "display", + "float", + "width", + "min-width", + "max-width", + "height", + "min-height", + "max-height", + "-webkit-box-sizing", + "-moz-box-sizing", + "box-sizing", + "-webkit-appearance", + "padding", + "padding-top", + "padding-right", + "padding-bottom", + "padding-left", + "margin", + "margin-top", + "margin-right", + "margin-bottom", + "margin-left", + "overflow", + "overflow-x", + "overflow-y", + "-webkit-overflow-scrolling", + "-ms-overflow-x", + "-ms-overflow-y", + "-ms-overflow-style", + "clip", + "clear", + "font", + "font-family", + "font-size", + "font-style", + "font-weight", + "font-variant", + "font-size-adjust", + "font-stretch", + "font-effect", + "font-emphasize", + "font-emphasize-position", + "font-emphasize-style", + "font-smooth", + "-webkit-hyphens", + "-moz-hyphens", + "hyphens", + "line-height", + "color", + "text-align", + "-webkit-text-align-last", + "-moz-text-align-last", + "-ms-text-align-last", + "text-align-last", + "text-emphasis", + "text-emphasis-color", + "text-emphasis-style", + "text-emphasis-position", + "text-decoration", + "text-indent", + "text-justify", + "text-outline", + "-ms-text-overflow", + "text-overflow", + "text-overflow-ellipsis", + "text-overflow-mode", + "text-shadow", + "text-transform", + "text-wrap", + "-webkit-text-size-adjust", + "-ms-text-size-adjust", + "letter-spacing", + "-ms-word-break", + "word-break", + "word-spacing", + "-ms-word-wrap", + "word-wrap", + "-moz-tab-size", + "-o-tab-size", + "tab-size", + "white-space", + "vertical-align", + "list-style", + "list-style-position", + "list-style-type", + "list-style-image", + "pointer-events", + "-ms-touch-action", + "touch-action", + "cursor", + "visibility", + "zoom", + "flex-direction", + "flex-order", + "flex-pack", + "flex-align", + "table-layout", + "empty-cells", + "caption-side", + "border-spacing", + "border-collapse", + "content", + "quotes", + "counter-reset", + "counter-increment", + "resize", + "-webkit-user-select", + "-moz-user-select", + "-ms-user-select", + "-o-user-select", + "user-select", + "nav-index", + "nav-up", + "nav-right", + "nav-down", + "nav-left", + "background", + "background-color", + "background-image", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.gradient", + "filter:progid:DXImageTransform.Microsoft.gradient", + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader", + "filter", + "background-repeat", + "background-attachment", + "background-position", + "background-position-x", + "background-position-y", + "-webkit-background-clip", + "-moz-background-clip", + "background-clip", + "background-origin", + "-webkit-background-size", + "-moz-background-size", + "-o-background-size", + "background-size", + "border", + "border-color", + "border-style", + "border-width", + "border-top", + "border-top-color", + "border-top-style", + "border-top-width", + "border-right", + "border-right-color", + "border-right-style", + "border-right-width", + "border-bottom", + "border-bottom-color", + "border-bottom-style", + "border-bottom-width", + "border-left", + "border-left-color", + "border-left-style", + "border-left-width", + "border-radius", + "border-top-left-radius", + "border-top-right-radius", + "border-bottom-right-radius", + "border-bottom-left-radius", + "-webkit-border-image", + "-moz-border-image", + "-o-border-image", + "border-image", + "-webkit-border-image-source", + "-moz-border-image-source", + "-o-border-image-source", + "border-image-source", + "-webkit-border-image-slice", + "-moz-border-image-slice", + "-o-border-image-slice", + "border-image-slice", + "-webkit-border-image-width", + "-moz-border-image-width", + "-o-border-image-width", + "border-image-width", + "-webkit-border-image-outset", + "-moz-border-image-outset", + "-o-border-image-outset", + "border-image-outset", + "-webkit-border-image-repeat", + "-moz-border-image-repeat", + "-o-border-image-repeat", + "border-image-repeat", + "outline", + "outline-width", + "outline-style", + "outline-color", + "outline-offset", + "-webkit-box-shadow", + "-moz-box-shadow", + "box-shadow", + "filter:progid:DXImageTransform.Microsoft.Alpha(Opacity", + "-ms-filter:\\'progid:DXImageTransform.Microsoft.Alpha", + "opacity", + "-ms-interpolation-mode", + "-webkit-transition", + "-moz-transition", + "-ms-transition", + "-o-transition", + "transition", + "-webkit-transition-delay", + "-moz-transition-delay", + "-ms-transition-delay", + "-o-transition-delay", + "transition-delay", + "-webkit-transition-timing-function", + "-moz-transition-timing-function", + "-ms-transition-timing-function", + "-o-transition-timing-function", + "transition-timing-function", + "-webkit-transition-duration", + "-moz-transition-duration", + "-ms-transition-duration", + "-o-transition-duration", + "transition-duration", + "-webkit-transition-property", + "-moz-transition-property", + "-ms-transition-property", + "-o-transition-property", + "transition-property", + "-webkit-transform", + "-moz-transform", + "-ms-transform", + "-o-transform", + "transform", + "-webkit-transform-origin", + "-moz-transform-origin", + "-ms-transform-origin", + "-o-transform-origin", + "transform-origin", + "-webkit-animation", + "-moz-animation", + "-ms-animation", + "-o-animation", + "animation", + "-webkit-animation-name", + "-moz-animation-name", + "-ms-animation-name", + "-o-animation-name", + "animation-name", + "-webkit-animation-duration", + "-moz-animation-duration", + "-ms-animation-duration", + "-o-animation-duration", + "animation-duration", + "-webkit-animation-play-state", + "-moz-animation-play-state", + "-ms-animation-play-state", + "-o-animation-play-state", + "animation-play-state", + "-webkit-animation-timing-function", + "-moz-animation-timing-function", + "-ms-animation-timing-function", + "-o-animation-timing-function", + "animation-timing-function", + "-webkit-animation-delay", + "-moz-animation-delay", + "-ms-animation-delay", + "-o-animation-delay", + "animation-delay", + "-webkit-animation-iteration-count", + "-moz-animation-iteration-count", + "-ms-animation-iteration-count", + "-o-animation-iteration-count", + "animation-iteration-count", + "-webkit-animation-direction", + "-moz-animation-direction", + "-ms-animation-direction", + "-o-animation-direction", + "animation-direction" + ] + ] +} diff --git a/scss/.csslintrc b/scss/.csslintrc new file mode 100644 index 000000000..19ceb82e9 --- /dev/null +++ b/scss/.csslintrc @@ -0,0 +1,20 @@ +{ + "adjoining-classes": false, + "box-sizing": false, + "box-model": false, + "compatible-vendor-prefixes": false, + "fallback-colors": false, + "floats": false, + "font-sizes": false, + "gradients": false, + "important": false, + "known-properties": false, + "outline-none": false, + "qualified-headings": false, + "regex-selectors": false, + "shorthand": false, + "text-indent": false, + "unique-headings": false, + "universal-selector": false, + "unqualified-attributes": false +} diff --git a/scss/_alert.scss b/scss/_alert.scss new file mode 100644 index 000000000..685ca314b --- /dev/null +++ b/scss/_alert.scss @@ -0,0 +1,67 @@ +// +// Alerts +// -------------------------------------------------- + + +// Base styles +// ------------------------- + +.alert { + padding: $alert-padding; + margin-bottom: $line-height-computed; + border: 1px solid transparent; + @include border-radius($alert-border-radius); + + // Headings for larger alerts + h4 { + margin-top: 0; + // Specified for the h4 to prevent conflicts of changing $headings-color + color: inherit; + } + // Provide class for links that match alerts + .alert-link { + font-weight: $alert-link-font-weight; + } + + // Improve alignment and spacing of inner content + > p, + > ul { + margin-bottom: 0; + } + > p + p { + margin-top: 5px; + } +} + +// Dismissible alerts +// +// Expand the right padding and account for the close button's positioning. + +.alert-dismissible { + padding-right: ($alert-padding + 20); + + // Adjust close link position + .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; + } +} + +// Alternate styles +// +// Generate contextual modifier classes for colorizing the alert. + +.alert-success { + @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text); +} +.alert-info { + @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text); +} +.alert-warning { + @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text); +} +.alert-danger { + @include alert-variant($alert-danger-bg, $alert-danger-border,$alert-danger-text); +} diff --git a/scss/_animation.scss b/scss/_animation.scss new file mode 100644 index 000000000..85156135d --- /dev/null +++ b/scss/_animation.scss @@ -0,0 +1,34 @@ +// +// Component animations +// -------------------------------------------------- + +.fade { + opacity: 0; + transition: opacity .15s linear; + + &.in { + opacity: 1; + } +} + +.collapse { + display: none; + visibility: hidden; + + &.in { + display: block; + visibility: visible; + } + // tr&.in { display: table-row; } + // tbody&.in { display: table-row-group; } +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + transition: height .35s ease; + transition-property: height, visibility; + transition-duration: .35s; + transition-timing-function: ease; +} diff --git a/scss/_badge.scss b/scss/_badge.scss new file mode 100644 index 000000000..f3c7442ea --- /dev/null +++ b/scss/_badge.scss @@ -0,0 +1,56 @@ +// +// Badges +// -------------------------------------------------- + + +// Base class +.badge { + position: relative; + top: -.1em; + display: inline-block; + padding-left: .6em; + padding-right: .6em; + font-size: .75em; + font-weight: $badge-font-weight; + color: $badge-color; + text-align: center; + white-space: nowrap; + background-color: $badge-bg; + @include border-radius($badge-border-radius); + + // Empty badges collapse automatically + &:empty { + display: none; + } + + &.pull-left, + &.pull-right { + top: .2em; + } + + // Account for badges in navs + .list-group-item.active > &, + .nav-pills > .active > a > & { + color: $badge-active-color; + background-color: $badge-active-bg; + } + .list-group-item > & { + float: right; + } + .list-group-item > & + & { + margin-right: 5px; + } + .nav-pills > li > a > & { + margin-left: 3px; + } +} + +// Hover state, but only for links +a.badge { + &:hover, + &:focus { + color: $badge-link-hover-color; + text-decoration: none; + cursor: pointer; + } +} diff --git a/scss/_breadcrumb.scss b/scss/_breadcrumb.scss new file mode 100644 index 000000000..9af8c4330 --- /dev/null +++ b/scss/_breadcrumb.scss @@ -0,0 +1,27 @@ +// +// Breadcrumbs +// -------------------------------------------------- + + +.breadcrumb { + padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal; + margin-bottom: $line-height-computed; + list-style: none; + background-color: $breadcrumb-bg; + @include border-radius($border-radius-base); + + > li { + display: inline-block; + + + li:before { + content: "#{breadcrumb-divider}\00a0"; // Unicode space added since inline-block means non-collapsing white-space + padding-left: .5rem; + padding-right: .5rem; + color: $breadcrumb-divider-color; + } + } + + > .active { + color: $breadcrumb-active-color; + } +} diff --git a/scss/_button-group.scss b/scss/_button-group.scss new file mode 100644 index 000000000..abf28efeb --- /dev/null +++ b/scss/_button-group.scss @@ -0,0 +1,250 @@ +// +// Button groups +// -------------------------------------------------- + +// Make the div behave like a button +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; // match .btn alignment given font-size hack above + + > .btn { + position: relative; + float: left; + + // Bring the "active" button to the front + &:hover, + &:focus, + &:active, + &.active { + z-index: 2; + } + } +} + +// Prevent double borders when buttons are next to each other +.btn-group { + .btn + .btn, + .btn + .btn-group, + .btn-group + .btn, + .btn-group + .btn-group { + margin-left: -1px; + } +} + +// Optional: Group multiple button groups together for a toolbar +.btn-toolbar { + margin-left: -5px; // Offset the first child's margin + @include clearfix(); + + .btn-group, + .input-group { + float: left; + } + + > .btn, + > .btn-group, + > .input-group { + margin-left: 5px; + } +} + +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} + +// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match +.btn-group > .btn:first-child { + margin-left: 0; + + &:not(:last-child):not(.dropdown-toggle) { + @include border-right-radius(0); + } +} +// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + @include border-left-radius(0); +} + +// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group) +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child { + > .btn:last-child, + > .dropdown-toggle { + @include border-right-radius(0); + } +} +.btn-group > .btn-group:last-child > .btn:first-child { + @include border-left-radius(0); +} + +// On active and open, don't show outline +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + + +// Sizing +// +// Remix the default button sizing classes into new ones for easier manipulation. + +.btn-group-xs > .btn { @extend .btn-xs; } +.btn-group-sm > .btn { @extend .btn-sm; } +.btn-group-lg > .btn { @extend .btn-lg; } + + +// Split button dropdowns +// ---------------------- + +// Give the line between buttons some depth +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; +} + +// The clickable button for toggling the menu +// Remove the gradient and set the same inset shadow as the :active state +.btn-group.open .dropdown-toggle { + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + + // Show no shadow for `.btn-link` since it has no other button styles. + &.btn-link { + @include box-shadow(none); + } +} + + +// Reposition the caret +.btn .caret { + margin-left: 0; +} +// Carets in other button sizes +.btn-lg .caret { + border-width: $caret-width-large $caret-width-large 0; + border-bottom-width: 0; +} +// Upside down carets for .dropup +.dropup .btn-lg .caret { + border-width: 0 $caret-width-large $caret-width-large; +} + + +// Vertical button groups +// ---------------------- + +.btn-group-vertical { + > .btn, + > .btn-group, + > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; + } + + // Clear floats so dropdown menus can be properly placed + > .btn-group { + @include clearfix(); + + > .btn { + float: none; + } + } + + > .btn + .btn, + > .btn + .btn-group, + > .btn-group + .btn, + > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; + } +} + +.btn-group-vertical > .btn { + &:not(:first-child):not(:last-child) { + border-radius: 0; + } + &:first-child:not(:last-child) { + border-top-right-radius: $border-radius-base; + @include border-bottom-radius(0); + } + &:last-child:not(:first-child) { + border-bottom-left-radius: $border-radius-base; + @include border-top-radius(0); + } +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) { + > .btn:last-child, + > .dropdown-toggle { + @include border-bottom-radius(0); + } +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + @include border-top-radius(0); +} + + +// Justified button groups +// ---------------------- + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; + + > .btn, + > .btn-group { + float: none; + display: table-cell; + width: 1%; + } + + > .btn-group .btn { + width: 100%; + } + + > .btn-group .dropdown-menu { + left: auto; + } +} + + +// Checkbox and radio options +// +// In order to support the browser's form validation feedback, powered by the +// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use +// `display: none;` or `visibility: hidden;` as that also hides the popover. +// Simply visually hiding the inputs via `opacity` would leave them clickable in +// certain cases which is prevented by using `clip` and `pointer-events`. +// This way, we ensure a DOM element is visible to position the popover from. +// +// See https://github.com/twbs/bootstrap/pull/12794 and +// https://github.com/twbs/bootstrap/pull/14559 for more information. + +[data-toggle="buttons"] { + > .btn, + > .btn-group > .btn { + input[type="radio"], + input[type="checkbox"] { + position: absolute; + clip: rect(0,0,0,0); + pointer-events: none; + } + } +} diff --git a/scss/_buttons.scss b/scss/_buttons.scss new file mode 100644 index 000000000..ed332c023 --- /dev/null +++ b/scss/_buttons.scss @@ -0,0 +1,156 @@ +// +// Buttons +// -------------------------------------------------- + + +// Base styles +// -------------------------------------------------- + +.btn { + display: inline-block; + margin-bottom: 0; // For input.btn + font-weight: $btn-font-weight; + text-align: center; + vertical-align: middle; + touch-action: manipulation; + cursor: pointer; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: $border-width solid transparent; + white-space: nowrap; + @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $border-radius-base); + user-select: none; + transition: all .2s ease-in-out; + + &, + &:active, + &.active { + &:focus, + &.focus { + @include tab-focus(); + } + } + + &:hover, + &:focus, + &.focus { + text-decoration: none; + } + + &:active, + &.active { + outline: 0; + background-image: none; + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + + &.disabled, + &[disabled], + fieldset[disabled] & { + cursor: $cursor-disabled; + pointer-events: none; // Future-proof disabling of clicks + opacity: .65; + @include box-shadow(none); + } +} + + +// Alternate buttons +// -------------------------------------------------- + +.btn-primary { + @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border); +} +.btn-secondary { + @include button-variant($btn-secondary-color, $btn-secondary-bg, $btn-secondary-border); +} +.btn-info { + @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border); +} +.btn-success { + @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border); +} +.btn-warning { + @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border); +} +.btn-danger { + @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border); +} + + +// Link buttons +// ------------------------- + +// Make a button look and behave like a link +.btn-link { + color: $link-color; + font-weight: normal; + border-radius: 0; + + &, + &:active, + &.active, + &[disabled], + fieldset[disabled] & { + background-color: transparent; + @include box-shadow(none); + } + &, + &:hover, + &:focus, + &:active { + border-color: transparent; + } + &:hover, + &:focus { + color: $link-hover-color; + text-decoration: underline; + background-color: transparent; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $btn-link-disabled-color; + text-decoration: none; + } + } +} + + +// Button Sizes +// -------------------------------------------------- + +.btn-lg { + // line-height: ensure even-numbered height of button next to large input + @include button-size($padding-lg-vertical, $padding-lg-horizontal, $font-size-lg, $line-height-lg, $border-radius-lg); +} +.btn-sm { + // line-height: ensure proper height of button next to small input + @include button-size($padding-sm-vertical, $padding-sm-horizontal, $font-size-sm, $line-height-sm, $border-radius-sm); +} +.btn-xs { + @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-xs, $line-height-sm, $border-radius-sm); +} + + +// Block button +// -------------------------------------------------- + +.btn-block { + display: block; + width: 100%; +} + +// Vertically space out multiple block buttons +.btn-block + .btn-block { + margin-top: 5px; +} + +// Specificity overrides +input[type="submit"], +input[type="reset"], +input[type="button"] { + &.btn-block { + width: 100%; + } +} diff --git a/scss/_card.scss b/scss/_card.scss new file mode 100644 index 000000000..cbbbde38c --- /dev/null +++ b/scss/_card.scss @@ -0,0 +1,196 @@ +// +// Base styles +// + +.card { + position: relative; + padding: 1.25rem; + margin-bottom: 1.25rem; + border: .075rem solid #eee; +} +.card-title { + margin-top: 0; + margin-bottom: .75rem; +} +.card-text:last-child { + margin-bottom: 0; +} +.card-actions { + .card-link + .card-link { + margin-left: .75rem; + } +} +.card-link:hover { + text-decoration: none; +} + + +// +// Optional textual caps +// + +.card-header { + padding: .75rem 1.25rem; + margin: -1.25rem -1.25rem 1.25rem; + border-bottom: .075rem solid #eee; + @include border-radius(.25rem .25rem 0 0); +} +.card-footer { + padding: .75rem 1.25rem; + margin: 1.25rem -1.25rem -1.25rem; + border-top: .075rem solid #eee; + @include border-radius(0 0 .25rem .25rem); +} + + +// +// Background variations +// + +.card-primary { + background-color: $brand-primary; + border-color: $brand-primary; +} +.card-success { + background-color: $brand-success; + border-color: $brand-success; +} +.card-info { + background-color: $brand-info; + border-color: $brand-info; +} +.card-warning { + background-color: $brand-warning; + border-color: $brand-warning; +} +.card-danger { + background-color: $brand-danger; + border-color: $brand-danger; +} + + +// +// Inverse text within a card for use with dark backgrounds +// + +.card-inverse { + .card-header, + .card-footer { + border-bottom: .075rem solid rgba(255,255,255,.2); + } + .card-header, + .card-footer, + .card-title, + .card-blockquote { + color: #fff; + } + .card-link, + .card-text, + .card-blockquote > footer { + color: rgba(255,255,255,.65); + } + .card-link:hover, + .card-link:focus { + color: #fff; + } +} + + +// +// Blockquote +// + +.card-blockquote { + border-left: 0; + padding: 0; + margin-bottom: 0; +} + +// Card image +.card-img { + margin: -1.325rem; + @include border-radius(.25rem); +} +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1.25rem; +} + + + +// Card image caps +.card-img-top { + margin: -1.325rem -1.325rem 1.25rem; + @include border-radius(.25rem .25rem 0 0); +} +.card-img-bottom { + margin: 1.25rem -1.325rem -1.325rem; + @include border-radius(0 0 .25rem .25rem); +} + + +// +// Card set +// + +.card-set { + display: table; + table-layout: fixed; + border-spacing: 1.25rem 0; + + .card { + float: none; + display: table-cell; + max-width: none; + } +} +.card-set-wrapper { + margin-left: -1.25rem; + margin-right: -1.25rem; +} + + +// +// Card groups +// + +.card-group { + display: table; + width: 100%; + table-layout: fixed; + + .card { + float: none; + display: table-cell; + max-width: none; + + + .card { + border-left: 0; + margin-left: 0; + } + } +} + + +// +// Card +// + +.card-columns { + -webkit-column-count: 3; + -moz-column-count: 3; + column-count: 3; + -webkit-column-gap: 1rem; + -moz-column-gap: 1rem; + column-gap: 1rem; + + .card { + display: inline-block; + width: 100%; // Don't let them exceed the column width + /*margin-bottom: 1rem;*/ + } +} diff --git a/scss/_carousel.scss b/scss/_carousel.scss new file mode 100644 index 000000000..6085d7a63 --- /dev/null +++ b/scss/_carousel.scss @@ -0,0 +1,251 @@ +// +// Carousel +// -------------------------------------------------- + + +// Wrapper for the slide container and indicators +.carousel { + position: relative; +} + +.carousel-inner { + position: relative; + overflow: hidden; + width: 100%; + + > .item { + display: none; + position: relative; + transition: .6s ease-in-out left; + + // Account for jankitude on images + > img, + > a > img { + @extend .img-responsive; + line-height: 1; + } + + // WebKit CSS3 transforms for supported devices + @media all and (transform-3d), (-webkit-transform-3d) { + transition: transform .6s ease-in-out; + backface-visibility: hidden; + perspective: 1000; + + &.next, + &.active.right { + transform: translate3d(100%, 0, 0); + left: 0; + } + &.prev, + &.active.left { + transform: translate3d(-100%, 0, 0); + left: 0; + } + &.next.left, + &.prev.right, + &.active { + transform: translate3d(0, 0, 0); + left: 0; + } + } + } + + > .active, + > .next, + > .prev { + display: block; + } + + > .active { + left: 0; + } + + > .next, + > .prev { + position: absolute; + top: 0; + width: 100%; + } + + > .next { + left: 100%; + } + > .prev { + left: -100%; + } + > .next.left, + > .prev.right { + left: 0; + } + + > .active.left { + left: -100%; + } + > .active.right { + left: 100%; + } + +} + +// Left/right controls for nav +// --------------------------- + +.carousel-control { + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: $carousel-control-width; + opacity: $carousel-control-opacity; + font-size: $carousel-control-font-size; + color: $carousel-control-color; + text-align: center; + text-shadow: $carousel-text-shadow; + // We can't have this transition here because WebKit cancels the carousel + // animation if you trip this while in the middle of another animation. + + // Set gradients for backgrounds + &.left { + @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001)); + } + &.right { + left: auto; + right: 0; + @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5)); + } + + // Hover/focus state + &:hover, + &:focus { + outline: 0; + color: $carousel-control-color; + text-decoration: none; + opacity: .9; + } + + // Toggles + .icon-prev, + .icon-next { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + width: 20px; + height: 20px; + margin-top: -10px; + font-family: serif; + line-height: 1; + } + .icon-prev { + left: 50%; + margin-left: -10px; + } + .icon-next { + right: 50%; + margin-right: -10px; + } + .icon-prev { + &:before { + content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) + } + } + .icon-next { + &:before { + content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) + } + } +} + +// Optional indicator pips +// +// Add an unordered list with the following class and add a list item for each +// slide your carousel holds. + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + margin-left: -30%; + padding-left: 0; + list-style: none; + text-align: center; + + li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + border: 1px solid $carousel-indicator-border-color; + border-radius: 10px; + cursor: pointer; + + // IE9 hack for event handling + // + // Internet Explorer 9 does not support clicks on elements without a set + // `background-color`. We cannot use `filter` since that's not viewed as a + // background color by the browser. Thus, a hack is needed. + background-color: rgba(0,0,0,0); // IE9 + } + .active { + margin: 0; + width: 12px; + height: 12px; + background-color: $carousel-indicator-active-bg; + } +} + +// Optional captions +// ----------------------------- +// Hidden by default for smaller viewports +.carousel-caption { + position: absolute; + left: 15%; + right: 15%; + bottom: 20px; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: $carousel-caption-color; + text-align: center; + text-shadow: $carousel-text-shadow; + + & .btn { + text-shadow: none; // No shadow for button elements in carousel-caption + } +} + + +// Scale up controls for tablets and up +@include media-sm { + // Scale up the controls a smidge + .carousel-control { + .icon-prev, + .icon-next { + width: 30px; + height: 30px; + margin-top: -15px; + font-size: 30px; + } + .icon-prev { + margin-left: -15px; + } + .icon-next { + margin-right: -15px; + } + } + + // Show and left align the captions + .carousel-caption { + left: 20%; + right: 20%; + padding-bottom: 30px; + } + + // Move up the indicators + .carousel-indicators { + bottom: 20px; + } +} diff --git a/scss/_close.scss b/scss/_close.scss new file mode 100644 index 000000000..76e4d5c29 --- /dev/null +++ b/scss/_close.scss @@ -0,0 +1,33 @@ +// +// Close icons +// -------------------------------------------------- + + +.close { + float: right; + font-size: ($font-size-base * 1.5); + font-weight: $close-font-weight; + line-height: 1; + color: $close-color; + text-shadow: $close-text-shadow; + opacity: .2; + + &:hover, + &:focus { + color: $close-color; + text-decoration: none; + cursor: pointer; + opacity: .5; + } + + // Additional properties for button version + // iOS requires the button element instead of an anchor tag. + // If you want the anchor version, it requires `href="#"`. + &button { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; + } +} diff --git a/scss/_code.scss b/scss/_code.scss new file mode 100644 index 000000000..b495d4f20 --- /dev/null +++ b/scss/_code.scss @@ -0,0 +1,66 @@ +// +// Code (inline and block) +// -------------------------------------------------- + + +// Inline and block code styles +code, +kbd, +pre, +samp { + font-family: $font-family-monospace; +} + +// Inline code +code { + padding: .2rem .4rem; + font-size: 90%; + color: $code-color; + background-color: $code-bg; + @include border-radius($border-radius-base); +} + +// User input typically entered via keyboard +kbd { + padding: .2rem .4rem; + font-size: 90%; + color: $kbd-color; + background-color: $kbd-bg; + @include border-radius($border-radius-sm); + @include box-shadow(inset 0 -.1rem 0 rgba(0,0,0,.25)); + + kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + @include box-shadow(none); + } +} + +// Blocks of code +pre { + display: block; + padding: 1.5rem; + margin-top: 0; + margin-bottom: 1rem; + font-size: 90%; + line-height: $line-height-base; + color: $pre-color; + background-color: $pre-bg; + @include border-radius($border-radius-base); + + // Account for some code outputs that place code tags in pre tags + code { + padding: 0; + font-size: inherit; + color: inherit; + background-color: transparent; + border-radius: 0; + } +} + +// Enable scrollable blocks of code +.pre-scrollable { + max-height: $pre-scrollable-max-height; + overflow-y: scroll; +} diff --git a/scss/_dropdown.scss b/scss/_dropdown.scss new file mode 100644 index 000000000..c9f57ba2d --- /dev/null +++ b/scss/_dropdown.scss @@ -0,0 +1,208 @@ +// +// Dropdown menus +// -------------------------------------------------- + +// The dropdown wrapper (div) +.dropdown { + position: relative; +} + +.dropdown-toggle { + // Generate the caret automatically + &:after { + display: inline-block; + width: 0; + height: 0; + content: ""; + margin-left: .25rem; + vertical-align: middle; + border-top: $caret-width-base solid; + border-right: $caret-width-base solid transparent; + border-left: $caret-width-base solid transparent; + } + + // Prevent the focus on the dropdown toggle when closing dropdowns + &:focus { + outline: 0; + } +} + +// The dropdown menu (ul) +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: $zindex-dropdown; + display: none; // none by default, but block on "open" of the menu + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; // override default ul + list-style: none; + font-size: $font-size-base; + text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer) + background-color: $dropdown-bg; + border: 1px solid $dropdown-border; + @include border-radius($border-radius-base); + @include box-shadow(0 6px 12px rgba(0,0,0,.175)); + background-clip: padding-box; + + // Dividers (basically an hr) within the dropdown + .divider { + @include nav-divider($dropdown-divider-bg); + } + + // Links within the dropdown menu + > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: $line-height-base; + color: $dropdown-link-color; + white-space: nowrap; // prevent links from randomly breaking onto new lines + } +} + +// Hover/Focus state +.dropdown-menu > li > a { + &:hover, + &:focus { + text-decoration: none; + color: $dropdown-link-hover-color; + background-color: $dropdown-link-hover-bg; + } +} + +// Active state +.dropdown-menu > .active > a { + &, + &:hover, + &:focus { + color: $dropdown-link-active-color; + text-decoration: none; + outline: 0; + background-color: $dropdown-link-active-bg; + } +} + +// Disabled state +// +// Gray out text and ensure the hover/focus state remains gray + +.dropdown-menu > .disabled > a { + &, + &:hover, + &:focus { + color: $dropdown-link-disabled-color; + } + + // Nuke hover/focus effects + &:hover, + &:focus { + text-decoration: none; + background-color: transparent; + background-image: none; // Remove CSS gradient + @include reset-filter(); + cursor: $cursor-disabled; + } +} + +// Open state for the dropdown +.open { + // Show the menu + > .dropdown-menu { + display: block; + } + + // Remove the outline when :focus is triggered + > a { + outline: 0; + } +} + +// Menu positioning +// +// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown +// menu with the parent. +.dropdown-menu-right { + left: auto; // Reset the default from `.dropdown-menu` + right: 0; +} +// With v3, we enabled auto-flipping if you have a dropdown within a right +// aligned nav component. To enable the undoing of that, we provide an override +// to restore the default dropdown menu alignment. +// +// This is only for left-aligning a dropdown menu within a `.navbar-right` or +// `.pull-right` nav component. +.dropdown-menu-left { + left: 0; + right: auto; +} + +// Dropdown section headers +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: $font-size-sm; + line-height: $line-height-base; + color: $dropdown-header-color; + white-space: nowrap; // as with > li > a +} + +// Backdrop to catch body clicks on mobile, etc. +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: ($zindex-dropdown - 10); +} + +// Right aligned dropdowns +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +// Allow for dropdowns to go bottom up (aka, dropup-menu) +// +// Just add .dropup after the standard .dropdown class and you're set, bro. +// TODO: abstract this so that the navbar fixed styles are not placed here? + +.dropup, +.navbar-fixed-bottom .dropdown { + // Reverse the caret + .caret { + border-top: 0; + border-bottom: $caret-width-base solid; + content: ""; + } + // Different positioning for bottom up menu + .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; + } +} + + +// Component alignment +// +// Reiterate per navbar.less and the modified component alignment there. +// +// TODO: remove? + +// @include media-sm { +// .navbar-right { +// .dropdown-menu { +// .dropdown-menu-right(); +// } +// // Necessary for overrides of the default right aligned menu. +// // Will remove come v4 in all likelihood. +// .dropdown-menu-left { +// .dropdown-menu-left(); +// } +// } +// } diff --git a/scss/_forms.scss b/scss/_forms.scss new file mode 100644 index 000000000..351e66a02 --- /dev/null +++ b/scss/_forms.scss @@ -0,0 +1,556 @@ +// +// Forms +// -------------------------------------------------- + + +// Normalize non-controls +// +// Restyle and baseline non-control form elements. + +fieldset { + padding: 0; + margin: 0; + border: 0; + // Chrome and Firefox set a `min-width: min-content;` on fieldsets, + // so we reset that to ensure it behaves more like a standard block element. + // See https://github.com/twbs/bootstrap/issues/12359. + min-width: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: $line-height-computed; + font-size: ($font-size-base * 1.5); + line-height: inherit; + color: $legend-color; + border: 0; + border-bottom: 1px solid $legend-border-color; +} + +label { + display: inline-block; + margin-bottom: 5px; + font-weight: bold; +} + + +// Normalize form controls +// +// While most of our form styles require extra classes, some basic normalization +// is required to ensure optimum display with or without those classes to better +// address browser inconsistencies. + +// Override content-box in Normalize (* isn't specific enough) +input[type="search"] { + box-sizing: border-box; +} + +// Position radios and checkboxes better +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; // IE9 + line-height: normal; +} + +// Set the height of file controls to match text inputs +input[type="file"] { + display: block; +} + +// Make range inputs behave like textual form controls +input[type="range"] { + display: block; + width: 100%; +} + +// Make multiple select elements height not fixed +select[multiple], +select[size] { + height: auto; +} + +// Focus for file, radio, and checkbox +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + @include tab-focus(); +} + +// Adjust output element +output { + display: block; + padding-top: ($padding-base-vertical + 1); + font-size: $font-size-base; + line-height: $line-height-base; + color: $input-color; +} + + +// +// Common form controls +// + +// Shared size and type resets for form controls. Apply `.form-control` to any +// of the following form controls: +// +// select +// textarea +// input[type="text"] +// input[type="password"] +// input[type="datetime"] +// input[type="datetime-local"] +// input[type="date"] +// input[type="month"] +// input[type="time"] +// input[type="week"] +// input[type="number"] +// input[type="email"] +// input[type="url"] +// input[type="search"] +// input[type="tel"] +// input[type="color"] + +.form-control { + display: block; + width: 100%; + height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border) + padding: $padding-base-vertical $padding-base-horizontal; + font-size: $font-size-base; + line-height: $line-height-base; + color: $input-color; + background-color: $input-bg; + background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 + border: 1px solid $input-border; + @include border-radius($input-border-radius); + @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + + // Customize the `:focus` state to imitate native WebKit styles. + @include form-control-focus(); + + // Placeholder + &::placeholder { + color: $input-color-placeholder; + } + + // Disabled and read-only inputs + // + // HTML5 says that controls under a fieldset > legend:first-child won't be + // disabled if the fieldset is disabled. Due to implementation difficulty, we + // don't honor that edge case; we style them as disabled anyway. + &[disabled], + &[readonly], + fieldset[disabled] & { + cursor: $cursor-disabled; + background-color: $input-bg-disabled; + opacity: 1; // iOS fix for unreadable disabled content + } + + // Reset height for `textarea`s + &textarea { + height: auto; + padding-top: $padding-base-horizontal; + padding-bottom: $padding-base-horizontal; + } +} + + +// Search inputs in iOS +// +// This overrides the extra rounded corners on search inputs in iOS so that our +// `.form-control` class can properly style them. Note that this cannot simply +// be added to `.form-control` as it's not specific enough. For details, see +// https://github.com/twbs/bootstrap/issues/11586. + +input[type="search"] { + -webkit-appearance: none; +} + + +// Special styles for iOS temporal inputs +// +// In Mobile Safari, setting `display: block` on temporal inputs causes the +// text within the input to become vertically misaligned. As a workaround, we +// set a pixel line-height that matches the given height of the input, but only +// for Safari. + +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"], + input[type="time"], + input[type="datetime-local"], + input[type="month"] { + line-height: $input-height-base; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm { + line-height: $input-height-sm; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg { + line-height: $input-height-lg; + } +} + + +// Form groups +// +// Designed to help with the organization and spacing of vertical forms. For +// horizontal forms, use the predefined grid classes. + +.form-group { + margin-bottom: 15px; +} + + +// Checkboxes and radios +// +// Indent the labels to position radios/checkboxes as hanging controls. + +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; + + label { + min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; + } +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-left: -20px; + margin-top: 4px \9; +} + +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing +} + +// Radios and checkboxes on same line +.radio-inline, +.checkbox-inline { + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + vertical-align: middle; + font-weight: normal; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; // space out consecutive inline controls +} + +// Apply same disabled cursor tweak as for inputs +// Some special care is needed because <label>s don't inherit their parent's `cursor`. +// +// Note: Neither radios nor checkboxes can be readonly. +input[type="radio"], +input[type="checkbox"] { + &[disabled], + &.disabled, + fieldset[disabled] & { + cursor: $cursor-disabled; + } +} +// These classes are used directly on <label>s +.radio-inline, +.checkbox-inline { + &.disabled, + fieldset[disabled] & { + cursor: $cursor-disabled; + } +} +// These classes are used on elements with <label> descendants +.radio, +.checkbox { + &.disabled, + fieldset[disabled] & { + label { + cursor: $cursor-disabled; + } + } +} + + +// Static form control text +// +// Apply class to a `p` element to make any string of text align with labels in +// a horizontal form layout. + +.form-control-static { + // Size it appropriately next to real form controls + padding-top: ($padding-base-vertical + 1); + padding-bottom: ($padding-base-vertical + 1); + // Remove default margin from `p` + margin-bottom: 0; + + &.input-lg, + &.input-sm { + padding-left: 0; + padding-right: 0; + } +} + + +// Form control sizing +// +// Build on `.form-control` with modifier classes to decrease or increase the +// height and font-size of form controls. +// +// The `.form-group-* form-control` variations are sadly duplicated to avoid the +// issue documented in https://github.com/twbs/bootstrap/issues/15074. + +@include input-size('.input-sm', $input-height-sm, $padding-sm-vertical, $padding-sm-horizontal, $font-size-sm, $line-height-sm, $input-border-radius-sm); + +.form-group-sm { + @include input-size('.form-control', $input-height-sm, $padding-sm-vertical, $padding-sm-horizontal, $font-size-sm, $line-height-sm, $input-border-radius-sm); +} + +@include input-size('.input-lg', $input-height-lg, $padding-lg-vertical, $padding-lg-horizontal, $font-size-lg, $line-height-lg, $input-border-radius-lg); + +.form-group-lg { + @include input-size('.form-control', $input-height-lg, $padding-lg-vertical, $padding-lg-horizontal, $font-size-lg, $line-height-lg, $input-border-radius-lg); +} + + +// Form control feedback states +// +// Apply contextual and semantic states to individual form controls. + +.has-feedback { + // Enable absolute positioning + position: relative; + + // Ensure icons don't overlap text + .form-control { + padding-right: ($input-height-base * 1.25); + } +} +// Feedback icon +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; // Ensure icon is above input groups + display: block; + width: $input-height-base; + height: $input-height-base; + line-height: $input-height-base; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback { + width: $input-height-lg; + height: $input-height-lg; + line-height: $input-height-lg; +} +.input-sm + .form-control-feedback { + width: $input-height-sm; + height: $input-height-sm; + line-height: $input-height-sm; +} + +// Form validation states +.has-success { + @include form-control-validation($state-success-text, $state-success-text, $state-success-bg); +} +.has-warning { + @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg); +} +.has-error { + @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg); +} + +// Reposition feedback icon if input has visible label above +.has-feedback label { + + & ~ .form-control-feedback { + top: ($line-height-computed + 5); // Height of the `label` and its margin + } + &.sr-only ~ .form-control-feedback { + top: 0; + } +} + + +// Help text +// +// Apply to any element you wish to create light text for placement immediately +// below a form control. Use for general help, formatting, or instructional text. + +.help-block { + display: block; // account for any element using help-block + margin-top: 5px; + margin-bottom: 10px; + color: lighten($text-color, 25%); // lighten the text some for contrast +} + + +// Inline forms +// +// Make forms appear inline(-block) by adding the `.form-inline` class. Inline +// forms begin stacked on extra small (mobile) devices and then go inline when +// viewports reach <768px. +// +// Requires wrapping inputs and labels with `.form-group` for proper display of +// default HTML form controls and our custom form controls (e.g., input groups). +// +// Heads up! This is mixin-ed into `.navbar-form` in navbars.less. + +.form-inline { + + // Kick in the inline + @include media-sm { + // Inline-block all the things for "inline" + .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + + // In navbar-form, allow folks to *not* use `.form-group` + .form-control { + display: inline-block; + width: auto; // Prevent labels from stacking above inputs in `.form-group` + vertical-align: middle; + } + + // Make static controls behave like regular ones + .form-control-static { + display: inline-block; + } + + .input-group { + display: inline-table; + vertical-align: middle; + + .input-group-addon, + .input-group-btn, + .form-control { + width: auto; + } + } + + // Input groups need that 100% width though + .input-group > .form-control { + width: 100%; + } + + .control-label { + margin-bottom: 0; + vertical-align: middle; + } + + // Remove default margin on radios/checkboxes that were used for stacking, and + // then undo the floating of radios and checkboxes to match (which also avoids + // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969). + .radio, + .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + + label { + padding-left: 0; + } + } + .radio input[type="radio"], + .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + + // Re-override the feedback icon. + .has-feedback .form-control-feedback { + top: 0; + } + } +} + + +// Horizontal forms +// +// Horizontal forms are built on grid classes and allow you to create forms with +// labels on the left and inputs on the right. + +.form-horizontal { + + // Consistent vertical alignment of radios and checkboxes + // + // Labels also get some reset styles, but that is scoped to a media query below. + .radio, + .checkbox, + .radio-inline, + .checkbox-inline { + margin-top: 0; + margin-bottom: 0; + padding-top: ($padding-base-vertical + .1); // Default padding plus a border + } + // Account for padding we're adding to ensure the alignment and of help text + // and other content below items + .radio, + .checkbox { + min-height: ($line-height-computed + ($padding-base-vertical + .1)); + } + + // Make form groups behave like rows + .form-group { + @include make-row(); + } + + // Reset spacing and right align labels, but scope to media queries so that + // labels on narrow viewports stack the same as a default form example. + @include media-sm { + .control-label { + text-align: right; + margin-bottom: 0; + padding-top: ($padding-base-vertical + .1); // Default padding plus a border + } + } + + // Validation states + // + // Reposition the icon because it's now within a grid column and columns have + // `position: relative;` on them. Also accounts for the grid gutter padding. + .has-feedback .form-control-feedback { + right: ($grid-gutter-width / 2); + } + + // Form group sizes + // + // Quick utility class for applying `.input-lg` and `.input-sm` styles to the + // inputs and labels within a `.form-group`. + .form-group-lg { + @media (min-width: $screen-sm-min) { + .control-label { + padding-top: $padding-lg-vertical; + } + } + } + .form-group-sm { + @media (min-width: $screen-sm-min) { + .control-label { + padding-top: ($padding-sm-vertical + .1); + } + } + } +} diff --git a/scss/_grid.scss b/scss/_grid.scss new file mode 100644 index 000000000..57a2dd006 --- /dev/null +++ b/scss/_grid.scss @@ -0,0 +1,84 @@ +// +// Grid system +// -------------------------------------------------- + + +// Container widths +// +// Set the container width, and override it for fixed navbars in media queries. + +.container { + @include make-container(); + + @media (min-width: $screen-sm-min) { + max-width: $container-sm; + } + @media (min-width: $screen-md-min) { + max-width: $container-md; + } + @media (min-width: $screen-lg-min) { + max-width: $container-lg; + } +} + + +// Fluid container +// +// Utilizes the mixin meant for fixed width containers, but without any defined +// width for fluid, full width layouts. + +.container-fluid { + @include make-container(); +} + + +// Row +// +// Rows contain and clear the floats of your columns. + +.row { + @include make-row(); +} + + +// Columns +// +// Common styles for small and large grid columns + +@include make-grid-columns(); + + +// Extra small grid +// +// Columns, offsets, pushes, and pulls for extra small devices like +// smartphones. + +@include make-grid(xs); + + +// Small grid +// +// Columns, offsets, pushes, and pulls for the small device range, from phones +// to tablets. + +@include media-sm { + @include make-grid(sm); +} + + +// Medium grid +// +// Columns, offsets, pushes, and pulls for the desktop device range. + +@include media-md { + @include make-grid(md); +} + + +// Large grid +// +// Columns, offsets, pushes, and pulls for the large desktop device range. + +@include media-lg { + @include make-grid(lg); +} diff --git a/scss/_input-group.scss b/scss/_input-group.scss new file mode 100644 index 000000000..6b9c6bc5e --- /dev/null +++ b/scss/_input-group.scss @@ -0,0 +1,166 @@ +// +// Input groups +// -------------------------------------------------- + +// Base styles +// ------------------------- +.input-group { + position: relative; // For dropdowns + display: table; + border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table + + // Undo padding and float of grid classes + &[class*="col-"] { + float: none; + padding-left: 0; + padding-right: 0; + } + + .form-control { + // Ensure that the input is always above the *appended* addon button for + // proper border colors. + position: relative; + z-index: 2; + + // IE9 fubars the placeholder attribute in text inputs and the arrows on + // select elements in input groups. To fix it, we float the input. Details: + // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855 + float: left; + + width: 100%; + margin-bottom: 0; + } +} + +// Sizing options +// +// Remix the default form control sizing classes into new ones for easier +// manipulation. + +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + @extend .input-lg; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + @extend .input-sm; +} + + +// Display as table-cell +// ------------------------- +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; + + &:not(:first-child):not(:last-child) { + @include border-radius(0); + } +} +// Addon and addon wrapper for buttons +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; // Match the inputs +} + +// Text input groups +// ------------------------- +.input-group-addon { + padding: $padding-base-vertical $padding-base-horizontal; + font-size: $font-size-base; + font-weight: normal; + line-height: 1; + color: $input-color; + text-align: center; + background-color: $input-group-addon-bg; + border: 1px solid $input-group-addon-border-color; + @include border-radius($border-radius-base); + + // Sizing + &.input-sm { + padding: $padding-sm-vertical $padding-sm-horizontal; + font-size: $font-size-sm; + @include border-radius($border-radius-sm); + } + &.input-lg { + padding: $padding-lg-vertical $padding-lg-horizontal; + font-size: $font-size-lg; + @include border-radius($border-radius-lg); + } + + // Nuke default margins from checkboxes and radios to vertically center within. + input[type="radio"], + input[type="checkbox"] { + margin-top: 0; + } +} + +// Reset rounded corners +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + @include border-right-radius(0); +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + @include border-left-radius(0); +} +.input-group-addon:last-child { + border-left: 0; +} + +// Button input groups +// ------------------------- +.input-group-btn { + position: relative; + // Jankily prevent input button groups from wrapping with `white-space` and + // `font-size` in combination with `inline-block` on buttons. + font-size: 0; + white-space: nowrap; + + // Negative margin for spacing, position for bringing hovered/focused/actived + // element above the siblings. + > .btn { + position: relative; + + .btn { + margin-left: -1px; + } + // Bring the "active" button to the front + &:hover, + &:focus, + &:active { + z-index: 2; + } + } + + // Negative margin to only have a 1px border between the two + &:first-child { + > .btn, + > .btn-group { + margin-right: -1px; + } + } + &:last-child { + > .btn, + > .btn-group { + margin-left: -1px; + } + } +} diff --git a/scss/_jumbotron.scss b/scss/_jumbotron.scss new file mode 100644 index 000000000..9b6c3b003 --- /dev/null +++ b/scss/_jumbotron.scss @@ -0,0 +1,44 @@ +// +// Jumbotron +// -------------------------------------------------- + + +.jumbotron { + padding: $jumbotron-padding ($jumbotron-padding / 2); + margin-bottom: $jumbotron-padding; + color: $jumbotron-color; + background-color: $jumbotron-bg; + + .container &, + .container-fluid & { + @include border-radius($border-radius-lg); // Only round corners at higher resolutions if contained in a container + } + + .container { + max-width: 100%; + } +} + +.jumbotron-heading { + color: $jumbotron-heading-color; +} + +.jumbotron-hr { + border-top-color: darken($jumbotron-bg, 10%); +} + +@include media-sm { + .jumbotron { + padding: ($jumbotron-padding * 1.6) 0; + + .container &, + .container-fluid & { + padding-left: ($jumbotron-padding * 2); + padding-right: ($jumbotron-padding * 2); + } + } + + .jumbotron-heading { + font-size: ($font-size-base * 4.5); + } +} diff --git a/scss/_labels.scss b/scss/_labels.scss new file mode 100644 index 000000000..55d562f8a --- /dev/null +++ b/scss/_labels.scss @@ -0,0 +1,64 @@ +// +// Labels +// -------------------------------------------------- + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: $label-color; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + @include border-radius(); + + // Empty labels collapse automatically + &:empty { + display: none; + } + + // Quick fix for labels in buttons + .btn & { + position: relative; + top: -1px; + } +} + +// Add hover effects, but only for links +a.label { + &:hover, + &:focus { + color: $label-link-hover-color; + text-decoration: none; + cursor: pointer; + } +} + +// Colors +// Contextual variations (linked labels get darker on :hover) + +.label-default { + @include label-variant($label-default-bg); +} + +.label-primary { + @include label-variant($label-primary-bg); +} + +.label-success { + @include label-variant($label-success-bg); +} + +.label-info { + @include label-variant($label-info-bg); +} + +.label-warning { + @include label-variant($label-warning-bg); +} + +.label-danger { + @include label-variant($label-danger-bg); +} diff --git a/scss/_list-group.scss b/scss/_list-group.scss new file mode 100644 index 000000000..26b23ff87 --- /dev/null +++ b/scss/_list-group.scss @@ -0,0 +1,124 @@ +// +// List groups +// -------------------------------------------------- + + +// Base class +// +// Easily usable on <ul>, <ol>, or <div>. + +.list-group { + // No need to set list-style: none; since .list-group-item is block level + margin-bottom: 20px; + padding-left: 0; // reset padding because ul and ol +} + + +// Individual list items +// +// Use on `li`s or `div`s within the `.list-group` parent. + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + // Place the border on the list items and negative margin up for better styling + margin-bottom: -1px; + background-color: $list-group-bg; + border: 1px solid $list-group-border; + + // Round the first and last items + &:first-child { + @include border-top-radius($list-group-border-radius); + } + &:last-child { + margin-bottom: 0; + @include border-bottom-radius($list-group-border-radius); + } +} + + +// Linked list items +// +// Use anchor elements instead of `li`s or `div`s to create linked list items. +// Includes an extra `.active` modifier class for showing selected items. + +a.list-group-item { + color: $list-group-link-color; + + .list-group-item-heading { + color: $list-group-link-heading-color; + } + + // Hover state + &:hover, + &:focus { + text-decoration: none; + color: $list-group-link-hover-color; + background-color: $list-group-hover-bg; + } +} + +.list-group-item { + // Disabled state + &.disabled, + &.disabled:hover, + &.disabled:focus { + background-color: $list-group-disabled-bg; + color: $list-group-disabled-color; + cursor: $cursor-disabled; + + // Force color to inherit for custom content + .list-group-item-heading { + color: inherit; + } + .list-group-item-text { + color: $list-group-disabled-text-color; + } + } + + // Active class on item itself, not parent + &.active, + &.active:hover, + &.active:focus { + z-index: 2; // Place active items above their siblings for proper border styling + color: $list-group-active-color; + background-color: $list-group-active-bg; + border-color: $list-group-active-border; + + // Force color to inherit for custom content + .list-group-item-heading, + .list-group-item-heading > small, + .list-group-item-heading > .small { + color: inherit; + } + .list-group-item-text { + color: $list-group-active-text-color; + } + } +} + + +// Contextual variants +// +// Add modifier classes to change text and background color on individual items. +// Organizationally, this must come after the `:hover` states. + +@include list-group-item-variant(success, $state-success-bg, $state-success-text); +@include list-group-item-variant(info, $state-info-bg, $state-info-text); +@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text); +@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text); + + +// Custom content options +// +// Extra classes for creating well-formatted content within `.list-group-item`s. + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} diff --git a/scss/_media.scss b/scss/_media.scss new file mode 100644 index 000000000..ee1a600ea --- /dev/null +++ b/scss/_media.scss @@ -0,0 +1,57 @@ +.media { + // Proper spacing between instances of .media + margin-top: 15px; + + &:first-child { + margin-top: 0; + } +} + +.media, +.media-body { + zoom: 1; + overflow: hidden; +} + +.media-object { + display: block; +} + +.media-right, +.media > .pull-right { + padding-left: 10px; +} + +.media-left, +.media > .pull-left { + padding-right: 10px; +} + +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} + +.media-middle { + vertical-align: middle; +} + +.media-bottom { + vertical-align: bottom; +} + +// Reset margins on headings for tighter default spacing +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} + +// Media list variation +// +// Undo default ul/ol styles +.media-list { + padding-left: 0; + list-style: none; +} diff --git a/scss/_mixins.scss b/scss/_mixins.scss new file mode 100644 index 000000000..9d3d289c4 --- /dev/null +++ b/scss/_mixins.scss @@ -0,0 +1,59 @@ +// Mixins +// -------------------------------------------------- + +// Toggles +// +// Used in conjuntion with global variables to enable certain theme features. + +@mixin border-radius($radius: $border-radius-base) { + @if $enable-rounded { + border-radius: $radius; + } +} + +@mixin box-shadow($shadow...) { + @if $enable-shadows { + box-shadow: $shadow; + } +} + +@mixin transition($transition...) { + @if $enable-transitions { + transition: $transition; + } +} + +// Utilities +@import "mixins/media-queries"; +@import "mixins/hide-text"; +@import "mixins/image"; +@import "mixins/label"; +@import "mixins/reset-filter"; +@import "mixins/resize"; +@import "mixins/responsive-visibility"; +@import "mixins/size"; +@import "mixins/tab-focus"; +@import "mixins/text-emphasis"; +@import "mixins/text-overflow"; + +// // Components +@import "mixins/alert"; +@import "mixins/buttons"; +@import "mixins/pagination"; +@import "mixins/list-group"; +@import "mixins/nav-divider"; +@import "mixins/forms"; +@import "mixins/progress"; +@import "mixins/table-row"; + +// // Skins +@import "mixins/background-variant"; +@import "mixins/border-radius"; +@import "mixins/gradients"; + +// // Layout +@import "mixins/clearfix"; +@import "mixins/center-block"; +// @import "mixins/navbar-align"; +@import "mixins/grid-framework"; +@import "mixins/grid"; diff --git a/scss/_modal.scss b/scss/_modal.scss new file mode 100644 index 000000000..fe8a09262 --- /dev/null +++ b/scss/_modal.scss @@ -0,0 +1,147 @@ +// +// Modals +// -------------------------------------------------- + +// .modal-open - body class for killing the scroll +// .modal - container to scroll within +// .modal-dialog - positioning shell for the actual modal +// .modal-content - actual modal w/ bg and corners and shit + +// Kill the scroll on the body +.modal-open { + overflow: hidden; +} + +// Container that the modal scrolls within +.modal { + display: none; + overflow: hidden; + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: $zindex-modal; + -webkit-overflow-scrolling: touch; + + // Prevent Chrome on Windows from adding a focus outline. For details, see + // https://github.com/twbs/bootstrap/pull/10951. + outline: 0; + + // When fading in the modal, animate it to slide down + &.fade .modal-dialog { + transform: translate(0, -25%); + transform: transition .3s ease-out; + } + &.in .modal-dialog { transform: translate(0, 0); } +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} + +// Shell div to position the modal with bottom padding +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} + +// Actual modal +.modal-content { + position: relative; + background-color: $modal-content-bg; + border: 1px solid $modal-content-border-color; + border-radius: $border-radius-lg; + @include box-shadow(0 3px 9px rgba(0,0,0,.5)); + background-clip: padding-box; + // Remove focus outline from opened modal + outline: 0; +} + +// Modal background +.modal-backdrop { + position: absolute; + top: 0; + right: 0; + left: 0; + background-color: $modal-backdrop-bg; + // Fade for backdrop + &.fade { opacity: 0; } + &.in { opacity: $modal-backdrop-opacity; } +} + +// Modal header +// Top section of the modal w/ title and dismiss +.modal-header { + padding: $modal-title-padding; + border-bottom: 1px solid $modal-header-border-color; + min-height: ($modal-title-padding + $modal-title-line-height); +} +// Close icon +.modal-header .close { + margin-top: -2px; +} + +// Title text within header +.modal-title { + margin: 0; + line-height: $modal-title-line-height; +} + +// Modal body +// Where all modal content resides (sibling of .modal-header and .modal-footer) +.modal-body { + position: relative; + padding: $modal-inner-padding; +} + +// Footer (for actions) +.modal-footer { + padding: $modal-inner-padding; + text-align: right; // right align buttons + border-top: 1px solid $modal-footer-border-color; + @include clearfix(); // clear it in case folks use .pull-* classes on buttons + + // Properly space out buttons + .btn + .btn { + margin-left: 5px; + margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs + } + // but override that for button groups + .btn-group .btn + .btn { + margin-left: -1px; + } + // and override it for block buttons as well + .btn-block + .btn-block { + margin-left: 0; + } +} + +// Measure scrollbar width for padding body during modal show/hide +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} + +// Scale up the modal +@media (min-width: $screen-sm-min) { + // Automatically set modal's width for larger viewports + .modal-dialog { + width: $modal-md; + margin: 30px auto; + } + .modal-content { + @include box-shadow(0 5px 15px rgba(0,0,0,.5)); + } + + // Modal sizes + .modal-sm { width: $modal-sm; } +} + +@media (min-width: $screen-md-min) { + .modal-lg { width: $modal-lg; } +} diff --git a/scss/_nav.scss b/scss/_nav.scss new file mode 100644 index 000000000..7f4fc45fc --- /dev/null +++ b/scss/_nav.scss @@ -0,0 +1,168 @@ +// +// Navs +// -------------------------------------------------- + +.nav { + margin-bottom: 0; + @extend .list-unstyled; + @include clearfix(); +} + +.nav-item { + position: relative; + display: inline-block; +} + +.nav-link { + display: inline-block; + padding: $nav-link-padding; + line-height: $line-height-base; + + &:hover, + &:focus { + text-decoration: none; + background-color: $nav-link-hover-bg; + } + + // Disabled state sets text to gray and nukes hover/tab effects + .disabled > &, + &.disabled { + color: $nav-disabled-link-color; + + &, + &:hover, + &:focus { + color: $nav-disabled-link-hover-color; + background-color: transparent; + cursor: $cursor-disabled; + } + } +} + + +// +// Tabs +// + +.nav-tabs { + border-bottom: 1px solid $nav-tabs-border-color; + + .nav-item { + float: left; + // Make the list-items overlay the bottom border + margin-bottom: -1px; + + + .nav-item { + margin-left: .2rem; + } + } + + .nav-link { + display: block; + border: 1px solid transparent; + @include border-radius($border-radius-base $border-radius-base 0 0); + + &:hover, + &:focus { + border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color; + } + } + + .open > .nav-link, + .active > .nav-link, + .nav-link.open, + .nav-link.active { + &, + &:hover, + &:focus { + color: $nav-tabs-active-link-hover-color; + background-color: $nav-tabs-active-link-hover-bg; + border-color: $nav-tabs-active-link-hover-border-color $nav-tabs-active-link-hover-border-color transparent; + } + } + + .disabled > .nav-link, + .nav-link.disabled { + &, + &:hover, + &:focus { + color: $nav-disabled-link-color; + background-color: transparent; + border-color: transparent; + } + } +} + + +// +// Pills +// + +.nav-pills { + .nav-item { + float: left; + + + .nav-item { + margin-left: .2rem; + } + } + + .nav-link { + display: block; + @include border-radius($nav-pills-border-radius); + } + + .open > .nav-link, + .active > .nav-link, + .nav-link.open, + .nav-link.active { + &, + &:hover, + &:focus { + color: $component-active-color; + background-color: $component-active-bg; + cursor: default; + } + } +} + +.nav-stacked { + .nav-item { + float: none; + display: block; + + + .nav-item { + margin-top: .2rem; + margin-left: 0; + } + } +} + + +// +// Tabbable tabs +// + +// Hide tabbable panes to start, show them when `.active` +.tab-content { + > .tab-pane { + display: none; + visibility: hidden; + } + > .active { + display: block; + visibility: visible; + } +} + + +// +// Dropdowns +// + +.nav-tabs .dropdown-menu { + // Make dropdown border overlap tab border + margin-top: -1px; + // Remove the top rounded corners here since there is a hard edge above the menu + @include border-top-radius(0); +} diff --git a/scss/_navbar.scss b/scss/_navbar.scss new file mode 100644 index 000000000..04c7c4dd0 --- /dev/null +++ b/scss/_navbar.scss @@ -0,0 +1,574 @@ +// +// Navbars +// -------------------------------------------------- + + +// Wrapper and base class +// +// Provide a static navbar from which we expand to create full-width, fixed, and +// other navbar variations. + +.navbar { + position: relative; + padding: $spacer; + /*min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)*/ + margin-bottom: $navbar-margin-bottom; + /*border: 1px solid transparent;*/ + + // Prevent floats from breaking the navbar + @include clearfix(); + + @media (min-width: $grid-float-breakpoint) { + @include border-radius($navbar-border-radius); + } +} + + +// +// Navbar alignment options +// +// Display the navbar across the entirety of the page or fixed it to the top or +// bottom of the page. + +// Static top (unfixed, but 100% wide) navbar +.navbar-static-top { + z-index: $zindex-navbar; + border-width: 0 0 1px; + + @media (min-width: $grid-float-breakpoint) { + @include border-radius(0); + } +} + +// Fix the top/bottom navbars when screen real estate supports it +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: $zindex-navbar-fixed; + + // Undo the rounded corners + @media (min-width: $grid-float-breakpoint) { + @include border-radius(0); + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; // override .navbar defaults + border-width: 1px 0 0; +} + + +// Brand/project name + +.navbar-brand { + float: left; + padding: .55rem .75rem; + margin-right: $spacer; + margin-bottom: 0; // For headings + font-size: $font-size-lg; + line-height: $line-height-computed; + /*height: $navbar-height;*/ + + > a:hover, + > a:focus { + text-decoration: none; + } + + > img { + display: block; + } +} + + +// Navbar toggle +// +// Custom button for toggling the `.navbar-collapse`, powered by the collapse +// JavaScript plugin. + +.navbar-toggler { + float: left; + padding: .55rem .75rem; + margin-right: $spacer; + margin-bottom: 0; // For headings + font-size: $font-size-lg; + line-height: $line-height-computed; + background: none; + border: 0; + + &:hover, + &:focus { + text-decoration: none; + } +} + + +// Navbar nav links +// +// Builds on top of the `.nav` components with its own modifier class to make +// the nav the full height of the horizontal nav (above 768px). + +// .navbar-nav { +// margin: ($navbar-padding-vertical / 2) -$navbar-padding-horizontal; + +// > li > a { +// padding-top: 10px; +// padding-bottom: 10px; +// line-height: $line-height-computed; +// } + +// @media (max-width: $grid-float-breakpoint-max) { +// // Dropdowns get custom display when collapsed +// .open .dropdown-menu { +// position: static; +// float: none; +// width: auto; +// margin-top: 0; +// background-color: transparent; +// border: 0; +// @include box-shadow(none); + +// > li > a, +// .dropdown-header { +// padding: 5px 15px 5px 25px; +// } + +// > li > a { +// line-height: $line-height-computed; + +// &:hover, +// &:focus { +// background-image: none; +// } +// } +// } +// } + +// // Uncollapse the nav +// @media (min-width: $grid-float-breakpoint) { +// float: left; +// margin: 0; + +// > li { +// float: left; + +// > a { +// padding-top: $navbar-padding-vertical; +// padding-bottom: $navbar-padding-vertical; +// } +// } +// } +// } + + +// Navbar form +// +// Extension of the `.form-inline` with some extra flavor for optimum display in +// our navbars. + +.navbar-form { + margin-left: -$navbar-padding-horizontal; + margin-right: -$navbar-padding-horizontal; + padding: 10px $navbar-padding-horizontal; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + @include box-shadow(inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)); + + // Mixin behavior for optimum display + @extend .form-inline; + + .form-group { + @media (max-width: $grid-float-breakpoint-max) { + margin-bottom: 5px; + + &:last-child { + margin-bottom: 0; + } + } + } + + // Vertically center in expanded, horizontal navbar + // @include navbar-vertical-align($input-height-base); + + // Undo 100% width for pull classes + @media (min-width: $grid-float-breakpoint) { + width: auto; + border: 0; + margin-left: 0; + margin-right: 0; + padding-top: 0; + padding-bottom: 0; + @include box-shadow(none); + } +} + + +// Dropdown menus + +// Menu position and menu carets +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + @include border-top-radius(0); +} +// Menu position and menu caret support for dropups via extra dropup class +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + @include border-top-radius($navbar-border-radius); + @include border-bottom-radius(0); +} + + +// Buttons in navbars +// +// Vertically center a button within a navbar (when *not* in a form). + +// .navbar-btn { +// @include navbar-vertical-align($input-height-base); + +// &.btn-sm { +// @include navbar-vertical-align($input-height-sm); +// } +// &.btn-xs { +// @include navbar-vertical-align(22); +// } +// } + + +// Text in navbars +// +// Add a class to make any element properly align itself vertically within the navbars. + +.navbar-text { + // @include navbar-vertical-align($line-height-computed); + + @media (min-width: $grid-float-breakpoint) { + float: left; + margin-left: $navbar-padding-horizontal; + margin-right: $navbar-padding-horizontal; + } +} + + +// Component alignment +// +// Repurpose the pull utilities as their own navbar utilities to avoid specificity +// issues with parents and chaining. Only do this when the navbar is uncollapsed +// though so that navbar contents properly stack and align in mobile. +// +// Declared after the navbar components to ensure more specificity on the margins. + +@media (min-width: $grid-float-breakpoint) { + .navbar-left { + @extend .pull-left; + } + .navbar-right { + @extend .pull-right; + margin-right: -$navbar-padding-horizontal; + + ~ .navbar-right { + margin-right: 0; + } + } +} + + +// Alternate navbars +// -------------------------------------------------- + +// Default navbar +.navbar-default { + background-color: $navbar-default-bg; + border-color: $navbar-default-border; + + .navbar-brand { + color: $navbar-default-brand-color; + &:hover, + &:focus { + color: $navbar-default-brand-hover-color; + background-color: $navbar-default-brand-hover-bg; + } + } + + .navbar-text { + color: $navbar-default-color; + } + + .navbar-nav { + > li > a { + color: $navbar-default-link-color; + + &:hover, + &:focus { + color: $navbar-default-link-hover-color; + background-color: $navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-active-color; + background-color: $navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-disabled-color; + background-color: $navbar-default-link-disabled-bg; + } + } + } + + .navbar-toggle { + border-color: $navbar-default-toggle-border-color; + &:hover, + &:focus { + background-color: $navbar-default-toggle-hover-bg; + } + .icon-bar { + background-color: $navbar-default-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: $navbar-default-border; + } + + // Dropdown menu items + .navbar-nav { + // Remove background color from open dropdown + > .open > a { + &, + &:hover, + &:focus { + background-color: $navbar-default-link-active-bg; + color: $navbar-default-link-active-color; + } + } + + @media (max-width: $grid-float-breakpoint-max) { + // Dropdowns get custom display when collapsed + .open .dropdown-menu { + > li > a { + color: $navbar-default-link-color; + &:hover, + &:focus { + color: $navbar-default-link-hover-color; + background-color: $navbar-default-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-active-color; + background-color: $navbar-default-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-default-link-disabled-color; + background-color: $navbar-default-link-disabled-bg; + } + } + } + } + } + + + // Links in navbars + // + // Add a class to ensure links outside the navbar nav are colored correctly. + + .navbar-link { + color: $navbar-default-link-color; + &:hover { + color: $navbar-default-link-hover-color; + } + } + + .btn-link { + color: $navbar-default-link-color; + &:hover, + &:focus { + color: $navbar-default-link-hover-color; + } + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $navbar-default-link-disabled-color; + } + } + } +} + +// Inverse navbar + +.navbar-inverse { + background-color: $navbar-inverse-bg; + border-color: $navbar-inverse-border; + + .navbar-toggler, + .navbar-brand > a, + .nav-pills > .nav-item > .nav-link { + color: $navbar-inverse-link-color; + + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + } + } + .nav-pills > .nav-item > .nav-link { + &:hover, + &:focus { + color: $navbar-inverse-link-active-color; + background-color: $navbar-inverse-link-active-bg; + } + } + .nav-pills > .active > .nav-link, + .nav-pills > .nav-link.active { + color: $navbar-inverse-link-active-color; + background-color: $navbar-inverse-link-active-bg; + } + + + .navbar-brand { + color: $navbar-inverse-brand-color; + &:hover, + &:focus { + color: $navbar-inverse-brand-hover-color; + background-color: $navbar-inverse-brand-hover-bg; + } + } + + .navbar-text { + color: $navbar-inverse-color; + } + + .navbar-nav { + > li > a { + color: $navbar-inverse-link-color; + + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + background-color: $navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-active-color; + background-color: $navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-disabled-color; + background-color: $navbar-inverse-link-disabled-bg; + } + } + } + + // Darken the responsive nav toggle + .navbar-toggle { + border-color: $navbar-inverse-toggle-border-color; + &:hover, + &:focus { + background-color: $navbar-inverse-toggle-hover-bg; + } + .icon-bar { + background-color: $navbar-inverse-toggle-icon-bar-bg; + } + } + + .navbar-collapse, + .navbar-form { + border-color: darken($navbar-inverse-bg, 7%); + } + + // Dropdowns + .navbar-nav { + > .open > a { + &, + &:hover, + &:focus { + background-color: $navbar-inverse-link-active-bg; + color: $navbar-inverse-link-active-color; + } + } + + @media (max-width: $grid-float-breakpoint-max) { + // Dropdowns get custom display + .open .dropdown-menu { + > .dropdown-header { + border-color: $navbar-inverse-border; + } + .divider { + background-color: $navbar-inverse-border; + } + > li > a { + color: $navbar-inverse-link-color; + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + background-color: $navbar-inverse-link-hover-bg; + } + } + > .active > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-active-color; + background-color: $navbar-inverse-link-active-bg; + } + } + > .disabled > a { + &, + &:hover, + &:focus { + color: $navbar-inverse-link-disabled-color; + background-color: $navbar-inverse-link-disabled-bg; + } + } + } + } + } + + .navbar-link { + color: $navbar-inverse-link-color; + &:hover { + color: $navbar-inverse-link-hover-color; + } + } + + .btn-link { + color: $navbar-inverse-link-color; + + &:hover, + &:focus { + color: $navbar-inverse-link-hover-color; + } + + &[disabled], + fieldset[disabled] & { + &:hover, + &:focus { + color: $navbar-inverse-link-disabled-color; + } + } + } +} diff --git a/scss/_normalize.scss b/scss/_normalize.scss new file mode 100644 index 000000000..62a085a48 --- /dev/null +++ b/scss/_normalize.scss @@ -0,0 +1,427 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +// +// 1. Set default font family to sans-serif. +// 2. Prevent iOS text size adjust after orientation change, without disabling +// user zoom. +// + +html { + font-family: sans-serif; // 1 + -ms-text-size-adjust: 100%; // 2 + -webkit-text-size-adjust: 100%; // 2 +} + +// +// Remove default margin. +// + +body { + margin: 0; +} + +// HTML5 display definitions +// ========================================================================== + +// +// Correct `block` display not defined for any HTML5 element in IE 8/9. +// Correct `block` display not defined for `details` or `summary` in IE 10/11 +// and Firefox. +// Correct `block` display not defined for `main` in IE 11. +// + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +// +// 1. Correct `inline-block` display not defined in IE 8/9. +// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. +// + +audio, +canvas, +progress, +video { + display: inline-block; // 1 + vertical-align: baseline; // 2 +} + +// +// Prevent modern browsers from displaying `audio` without controls. +// Remove excess height in iOS 5 devices. +// + +audio:not([controls]) { + display: none; + height: 0; +} + +// +// Address `[hidden]` styling not present in IE 8/9/10. +// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. +// + +[hidden], +template { + display: none; +} + +// Links +// ========================================================================== + +// +// Remove the gray background color from active links in IE 10. +// + +a { + background-color: transparent; +} + +// +// Improve readability when focused and also mouse hovered in all browsers. +// + +a:active, +a:hover { + outline: 0; +} + +// Text-level semantics +// ========================================================================== + +// +// Address styling not present in IE 8/9/10/11, Safari, and Chrome. +// + +abbr[title] { + border-bottom: 1px dotted; +} + +// +// Address style set to `bolder` in Firefox 4+, Safari, and Chrome. +// + +b, +strong { + font-weight: bold; +} + +// +// Address styling not present in Safari and Chrome. +// + +dfn { + font-style: italic; +} + +// +// Address variable `h1` font-size and margin within `section` and `article` +// contexts in Firefox 4+, Safari, and Chrome. +// + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +// +// Address styling not present in IE 8/9. +// + +mark { + background: #ff0; + color: #000; +} + +// +// Address inconsistent and variable font size in all browsers. +// + +small { + font-size: 80%; +} + +// +// Prevent `sub` and `sup` affecting `line-height` in all browsers. +// + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +// Embedded content +// ========================================================================== + +// +// Remove border when inside `a` element in IE 8/9/10. +// + +img { + border: 0; +} + +// +// Correct overflow not hidden in IE 9/10/11. +// + +svg:not(:root) { + overflow: hidden; +} + +// Grouping content +// ========================================================================== + +// +// Address margin not present in IE 8/9 and Safari. +// + +figure { + margin: 1em 40px; +} + +// +// Address differences between Firefox and other browsers. +// + +hr { + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; +} + +// +// Contain overflow in all browsers. +// + +pre { + overflow: auto; +} + +// +// Address odd `em`-unit font size rendering in all browsers. +// + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +// Forms +// ========================================================================== + +// +// Known limitation: by default, Chrome and Safari on OS X allow very limited +// styling of `select`, unless a `border` property is set. +// + +// +// 1. Correct color not being inherited. +// Known issue: affects color of disabled elements. +// 2. Correct font properties not being inherited. +// 3. Address margins set differently in Firefox 4+, Safari, and Chrome. +// + +button, +input, +optgroup, +select, +textarea { + color: inherit; // 1 + font: inherit; // 2 + margin: 0; // 3 +} + +// +// Address `overflow` set to `hidden` in IE 8/9/10/11. +// + +button { + overflow: visible; +} + +// +// Address inconsistent `text-transform` inheritance for `button` and `select`. +// All other form control elements do not inherit `text-transform` values. +// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. +// Correct `select` style inheritance in Firefox. +// + +button, +select { + text-transform: none; +} + +// +// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` +// and `video` controls. +// 2. Correct inability to style clickable `input` types in iOS. +// 3. Improve usability and consistency of cursor style between image-type +// `input` and others. +// + +button, +html input[type="button"], // 1 +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; // 2 + cursor: pointer; // 3 +} + +// +// Re-set default cursor for disabled elements. +// + +button[disabled], +html input[disabled] { + cursor: default; +} + +// +// Remove inner padding and border in Firefox 4+. +// + +button::-moz-focus-inner, +input::-moz-focus-inner { + border: 0; + padding: 0; +} + +// +// Address Firefox 4+ setting `line-height` on `input` using `!important` in +// the UA stylesheet. +// + +input { + line-height: normal; +} + +// +// It's recommended that you don't attempt to style these elements. +// Firefox's implementation doesn't respect box-sizing, padding, or width. +// +// 1. Address box sizing set to `content-box` in IE 8/9/10. +// 2. Remove excess padding in IE 8/9/10. +// + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; // 1 + padding: 0; // 2 +} + +// +// Fix the cursor style for Chrome's increment/decrement buttons. For certain +// `font-size` values of the `input`, it causes the cursor style of the +// decrement button to change from `default` to `text`. +// + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +// +// 1. Address `appearance` set to `searchfield` in Safari and Chrome. +// 2. Address `box-sizing` set to `border-box` in Safari and Chrome +// (include `-moz` to future-proof). +// + +input[type="search"] { + -webkit-appearance: textfield; // 1 + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; // 2 + box-sizing: content-box; +} + +// +// Remove inner padding and search cancel button in Safari and Chrome on OS X. +// Safari (but not Chrome) clips the cancel button when the search input has +// padding (and `textfield` appearance). +// + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +// +// Define consistent border, margin, and padding. +// + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding: 0.35em 0.625em 0.75em; +} + +// +// 1. Correct `color` not being inherited in IE 8/9/10/11. +// 2. Remove padding so people aren't caught out if they zero out fieldsets. +// + +legend { + border: 0; // 1 + padding: 0; // 2 +} + +// +// Remove default vertical scrollbar in IE 8/9/10/11. +// + +textarea { + overflow: auto; +} + +// +// Don't inherit the `font-weight` (applied by a rule above). +// NOTE: the default cannot safely be changed in Chrome and Safari on OS X. +// + +optgroup { + font-weight: bold; +} + +// Tables +// ========================================================================== + +// +// Remove most spacing between table cells. +// + +table { + border-collapse: collapse; + border-spacing: 0; +} + +td, +th { + padding: 0; +} diff --git a/scss/_pager.scss b/scss/_pager.scss new file mode 100644 index 000000000..2a346879d --- /dev/null +++ b/scss/_pager.scss @@ -0,0 +1,56 @@ +// +// Pager pagination +// -------------------------------------------------- + + +.pager { + padding-left: 0; + margin: $line-height-computed 0; + list-style: none; + text-align: center; + @include clearfix(); + + li { + display: inline; + + > a, + > span { + display: inline-block; + padding: 5px 14px; + background-color: $pager-bg; + border: 1px solid $pager-border; + border-radius: $pager-border-radius; + } + + > a:hover, + > a:focus { + text-decoration: none; + background-color: $pager-hover-bg; + } + } + + .next { + > a, + > span { + float: right; + } + } + + .previous { + > a, + > span { + float: left; + } + } + + .disabled { + > a, + > a:hover, + > a:focus, + > span { + color: $pager-disabled-color; + background-color: $pager-bg; + cursor: $cursor-disabled; + } + } +} diff --git a/scss/_pagination.scss b/scss/_pagination.scss new file mode 100644 index 000000000..b0b91c96c --- /dev/null +++ b/scss/_pagination.scss @@ -0,0 +1,89 @@ +// +// Pagination (multiple pages) +// -------------------------------------------------- +.pagination { + display: inline-block; + padding-left: 0; + margin: $line-height-computed 0; + @include border-radius(); + + > li { + display: inline; // Remove list-style and block-level defaults + + > a, + > span { + position: relative; + float: left; // Collapse white-space + padding: $padding-base-vertical $padding-base-horizontal; + line-height: $line-height-base; + text-decoration: none; + color: $pagination-color; + background-color: $pagination-bg; + border: 1px solid $pagination-border; + margin-left: -1px; + } + &:first-child { + > a, + > span { + margin-left: 0; + @include border-left-radius($border-radius-base); + } + } + &:last-child { + > a, + > span { + @include border-right-radius($border-radius-base); + } + } + } + + > li > a, + > li > span { + &:hover, + &:focus { + color: $pagination-hover-color; + background-color: $pagination-hover-bg; + border-color: $pagination-hover-border; + } + } + + > .active > a, + > .active > span { + &, + &:hover, + &:focus { + z-index: 2; + color: $pagination-active-color; + background-color: $pagination-active-bg; + border-color: $pagination-active-border; + cursor: default; + } + } + + > .disabled { + > span, + > span:hover, + > span:focus, + > a, + > a:hover, + > a:focus { + color: $pagination-disabled-color; + background-color: $pagination-disabled-bg; + border-color: $pagination-disabled-border; + cursor: $cursor-disabled; + } + } +} + +// Sizing +// -------------------------------------------------- + +// Large +.pagination-lg { + @include pagination-size($padding-lg-vertical, $padding-lg-horizontal, $font-size-lg, $border-radius-lg); +} + +// Small +.pagination-sm { + @include pagination-size($padding-sm-vertical, $padding-sm-horizontal, $font-size-sm, $border-radius-sm); +} diff --git a/scss/_popover.scss b/scss/_popover.scss new file mode 100644 index 000000000..c3f9ac165 --- /dev/null +++ b/scss/_popover.scss @@ -0,0 +1,130 @@ +// +// Popovers +// -------------------------------------------------- + + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: $zindex-popover; + display: none; + max-width: $popover-max-width; + padding: 1px; + // Reset font and text propertes given new insertion method + font-family: $font-family-base; + font-size: $font-size-base; + font-weight: normal; + line-height: $line-height-base; + text-align: left; + background-color: $popover-bg; + background-clip: padding-box; + border: 1px solid $popover-border-color; + @include border-radius($border-radius-lg); + @include box-shadow(0 5px 10px rgba(0,0,0,.2)); + + // Overrides for proper insertion + white-space: normal; + + // Offset the popover to account for the popover arrow + &.top { margin-top: -$popover-arrow-width; } + &.right { margin-left: $popover-arrow-width; } + &.bottom { margin-top: $popover-arrow-width; } + &.left { margin-left: -$popover-arrow-width; } +} + +.popover-title { + margin: 0; // reset heading margin + padding: 8px 14px; + font-size: $font-size-base; + background-color: $popover-title-bg; + border-bottom: 1px solid darken($popover-title-bg, 5%); + @include border-radius(($border-radius-lg - 1) ($border-radius-lg - 1) 0 0); +} + +.popover-content { + padding: 9px 14px; +} + +// Arrows +// +// .arrow is outer, .arrow:after is inner + +.popover > .arrow { + &, + &:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + } +} +.popover > .arrow { + border-width: $popover-arrow-outer-width; +} +.popover > .arrow:after { + border-width: $popover-arrow-width; + content: ""; +} + +.popover { + &.top > .arrow { + left: 50%; + margin-left: -$popover-arrow-outer-width; + border-bottom-width: 0; + border-top-color: $popover-arrow-outer-color; + bottom: -$popover-arrow-outer-width; + &:after { + content: " "; + bottom: 1px; + margin-left: -$popover-arrow-width; + border-bottom-width: 0; + border-top-color: $popover-arrow-color; + } + } + &.right > .arrow { + top: 50%; + left: -$popover-arrow-outer-width; + margin-top: -$popover-arrow-outer-width; + border-left-width: 0; + border-right-color: $popover-arrow-outer-color; + &:after { + content: " "; + left: 1px; + bottom: -$popover-arrow-width; + border-left-width: 0; + border-right-color: $popover-arrow-color; + } + } + &.bottom > .arrow { + left: 50%; + margin-left: -$popover-arrow-outer-width; + border-top-width: 0; + border-bottom-color: $popover-arrow-outer-color; + top: -$popover-arrow-outer-width; + &:after { + content: " "; + top: 1px; + margin-left: -$popover-arrow-width; + border-top-width: 0; + border-bottom-color: $popover-arrow-color; + } + } + + &.left > .arrow { + top: 50%; + right: -$popover-arrow-outer-width; + margin-top: -$popover-arrow-outer-width; + border-right-width: 0; + border-left-color: $popover-arrow-outer-color; + &:after { + content: " "; + right: 1px; + border-right-width: 0; + border-left-color: $popover-arrow-color; + bottom: -$popover-arrow-width; + } + } +} diff --git a/scss/_print.scss b/scss/_print.scss new file mode 100644 index 000000000..94ca58f12 --- /dev/null +++ b/scss/_print.scss @@ -0,0 +1,107 @@ +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ + +// ========================================================================== +// Print styles. +// Inlined to avoid the additional HTTP request: h5bp.com/r +// ========================================================================== + +@media print { + *, + *:before, + *:after { + background: transparent !important; + color: #000 !important; // Black prints faster: h5bp.com/s + box-shadow: none !important; + text-shadow: none !important; + } + + a, + a:visited { + text-decoration: underline; + } + + a[href]:after { + content: " (" attr(href) ")"; + } + + abbr[title]:after { + content: " (" attr(title) ")"; + } + + // Don't show links that are fragment identifiers, + // or use the `javascript:` pseudo protocol + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + + thead { + display: table-header-group; // h5bp.com/t + } + + tr, + img { + page-break-inside: avoid; + } + + img { + max-width: 100% !important; + } + + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + + h2, + h3 { + page-break-after: avoid; + } + + // Bootstrap specific changes start + // + // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245 + // Once fixed, we can just straight up remove this. + select { + background: #fff !important; + } + + // Bootstrap components + .navbar { + display: none; + } + .btn, + .dropup > .btn { + > .caret { + border-top-color: #000 !important; + } + } + .label { + border: 1px solid #000; + } + + .table { + border-collapse: collapse !important; + + td, + th { + background-color: #fff !important; + } + } + .table-bordered { + th, + td { + border: 1px solid #ddd !important; + } + } + + // Bootstrap specific changes end +} diff --git a/scss/_progress.scss b/scss/_progress.scss new file mode 100644 index 000000000..ccfda15f5 --- /dev/null +++ b/scss/_progress.scss @@ -0,0 +1,166 @@ +/*csslint empty-rules: false, important: true*/ + +// +// Progress bars +// -------------------------------------------------- + + +// +// Progress animations +// + +@-webkit-keyframes progress-bar-stripes { + from { background-position: $line-height-computed 0; } + to { background-position: 0 0; } +} + +@keyframes progress-bar-stripes { + from { background-position: $line-height-computed 0; } + to { background-position: 0 0; } +} + + +// +// Basic progress bar +// + +.progress { + display: block; + width: 100%; + height: $line-height-computed; + margin-bottom: $line-height-computed; +} +.progress[value] { + // Reset the default appearance + appearance: none; + // Remove Firefox and Opera border + border: 0; + // IE10 uses `color` to set the bar background-color + color: #0074d9; +} +.progress[value]::-webkit-progress-bar { + background-color: #eee; + @include border-radius($border-radius-base); + @include box-shadow(inset 0 .1rem .1rem rgba(0,0,0,.1)); +} +.progress[value]::-webkit-progress-value::before { + content: attr(value); +} +.progress[value]::-webkit-progress-value { + background-color: #0074d9; + border-top-left-radius: $border-radius-base; + border-bottom-left-radius: $border-radius-base; +} +.progress[value="100"]::-webkit-progress-value { + border-top-right-radius: $border-radius-base; + border-bottom-right-radius: $border-radius-base; +} + +// Firefox styles must be entirely separate or it busts Webkit styles. +// +// Commented out for now because linter. +// +// $-moz-document url-prefix() { +// .progress[value] { +// background-color: #eee; +// .border-radius($border-radius-base); +// .box-shadow(inset 0 .1rem .1rem rgba(0,0,0,.1)); +// } +// .progress[value]::-moz-progress-bar { +// background-color: #0074d9; +// border-top-left-radius: $border-radius-base; +// border-bottom-left-radius: $border-radius-base; +// } +// .progress[value="0"]::-moz-progress-bar { +// color: $gray-light; +// min-width: 2rem; +// background-color: transparent; +// background-image: none; +// } +// .progress[value="100"]::-moz-progress-bar { +// border-top-right-radius: $border-radius-base; +// border-bottom-right-radius: $border-radius-base; +// } +// } + +// IE9 hacks to accompany custom markup. We don't need to scope this via media queries, but I feel better doing it anyway. +@media screen and ("min-width:0\0") { + .progress { + background-color: #eee; + @include border-radius($border-radius-base); + @include box-shadow(inset 0 .1rem .1rem rgba(0,0,0,.1)); + } + .progress-bar { + display: inline-block; + height: $line-height-computed; + text-indent: -999rem; // Simulate hiding of value as in native `<progress>` + background-color: #0074d9; + border-top-left-radius: $border-radius-base; + border-bottom-left-radius: $border-radius-base; + } + .progress[width^="0"] { + color: $gray-light; + min-width: 2rem; + background-color: transparent; + background-image: none; + } + .progress[width="100%"] { + border-top-right-radius: $border-radius-base; + border-bottom-right-radius: $border-radius-base; + } +} + + +// +// Striped +// + +.progress-striped[value]::-webkit-progress-value { + @include gradient-striped(); + background-size: $line-height-computed $line-height-computed; +} +.progress-striped[value]::-moz-progress-bar { + @include gradient-striped(); + background-size: $line-height-computed $line-height-computed; +} +@media screen and ("min-width:0\0") { + .progress-bar-striped { + @include gradient-striped(); + background-size: $line-height-computed $line-height-computed; + } +} + + +// +// Animated +// + +.progress-animated[value]::-webkit-progress-value { + animation: progress-bar-stripes 2s linear infinite; +} +.progress-animated[value]::-moz-progress-bar { + animation: progress-bar-stripes 2s linear infinite; +} +@media screen and ("min-width:0\0") { + .progress-animated .progress-bar-striped { + animation: progress-bar-stripes 2s linear infinite; + } +} + + +// +// Variations +// + +.progress-success { + @include progress-variant($progress-bar-success-bg); +} +.progress-info { + @include progress-variant($progress-bar-info-bg); +} +.progress-warning { + @include progress-variant($progress-bar-warning-bg); +} +.progress-danger { + @include progress-variant($progress-bar-danger-bg); +} diff --git a/scss/_responsive-embed.scss b/scss/_responsive-embed.scss new file mode 100644 index 000000000..c1fa8f848 --- /dev/null +++ b/scss/_responsive-embed.scss @@ -0,0 +1,35 @@ +// Embeds responsive +// +// Credit: Nicolas Gallagher and SUIT CSS. + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; + + .embed-responsive-item, + iframe, + embed, + object, + video { + position: absolute; + top: 0; + left: 0; + bottom: 0; + height: 100%; + width: 100%; + border: 0; + } + + // Modifier class for 16:9 aspect ratio + &.embed-responsive-16by9 { + padding-bottom: 56.25%; + } + + // Modifier class for 4:3 aspect ratio + &.embed-responsive-4by3 { + padding-bottom: 75%; + } +} diff --git a/scss/_scaffolding.scss b/scss/_scaffolding.scss new file mode 100644 index 000000000..4736c82b2 --- /dev/null +++ b/scss/_scaffolding.scss @@ -0,0 +1,147 @@ +// +// Scaffolding +// -------------------------------------------------- + + +// Reset the box-sizing +// +// Heads up! This reset may cause conflicts with some third-party widgets. +// For recommendations on resolving such conflicts, see +// http://getbootstrap.com/getting-started/#third-box-sizing +*, +*:before, +*:after { + box-sizing: border-box; +} + + +// Body reset + +html { + font-size: ($font-size-root)px; + -webkit-tap-highlight-color: rgba(0,0,0,0); +} + +body { + font-family: $font-family-base; + font-size: $font-size-base; + line-height: $line-height-base; + color: $text-color; + background-color: $body-bg; +} + +// Reset fonts for relevant elements +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + + +// Links + +a { + color: $link-color; + text-decoration: none; + + &:hover, + &:focus { + color: $link-hover-color; + text-decoration: $link-hover-decoration; + } + + &:focus { + @include tab-focus(); + } +} + + +// Figures +// +// We reset this here because previously Normalize had no `figure` margins. This +// ensures we don't break anyone's use of the element. + +figure { + margin: 0; +} + + +// Images + +img { + vertical-align: middle; +} + +// Responsive images (ensure images don't scale beyond their parents) +.img-responsive { + @include img-responsive(); +} + +// Rounded corners +.img-rounded { + @include border-radius($border-radius-lg); +} + +// Image thumbnails +.img-thumbnail { + padding: $thumbnail-padding; + line-height: $line-height-base; + background-color: $thumbnail-bg; + border: 1px solid $thumbnail-border; + border-radius: $thumbnail-border-radius; + transition: all .2s ease-in-out; + @include box-shadow(0 1px 2px rgba(0,0,0,.075)); + + // Keep them at most 100% wide + @include img-responsive(inline-block); +} + +// Perfect circle +.img-circle { + border-radius: 50%; // set radius in percents +} + + +// Horizontal rules + +hr { + margin-top: $line-height-computed; + margin-bottom: $line-height-computed; + border: 0; + border-top: 1px solid $hr-border; +} + + +// Only display content to screen readers +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + margin: -1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// Credit: HTML5 Boilerplate + +.sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/scss/_tables.scss b/scss/_tables.scss new file mode 100644 index 000000000..a47aa8e9c --- /dev/null +++ b/scss/_tables.scss @@ -0,0 +1,314 @@ +// +// Tables +// -------------------------------------------------- + +table { + background-color: $table-bg; +} +caption { + padding-top: $table-cell-padding; + padding-bottom: $table-cell-padding; + color: $text-muted; + text-align: left; +} +th { + text-align: left; +} + + +// Baseline styles + +.table { + width: 100%; + max-width: 100%; + margin-bottom: $line-height-computed; + // Cells + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: $table-cell-padding; + line-height: $line-height-base; + vertical-align: top; + border-top: 1px solid $table-border-color; + } + } + } + // Bottom align for column headings + > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid $table-border-color; + } + // Remove top border from thead by default +// > caption + thead, +// > colgroup + thead, +// > thead:first-child { +// > tr:first-child { +// > th, +// > td { +// border-top: 0; +// } +// } +// } + // Account for multiple tbody instances + > tbody + tbody { + border-top: 2px solid $table-border-color; + } + + // Nesting +// .table { +// background-color: $body-bg; +// } +} + + +// Condensed table w/ half padding + +.table-sm { + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + padding: $table-sm-cell-padding; + } + } + } +} + + +// Bordered version +// +// Add borders all around the table and between all the columns. + +.table-bordered { + border: 1px solid $table-border-color; + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border: 1px solid $table-border-color; + } + } + } + > thead > tr { + > th, + > td { + border-bottom-width: 2px; + } + } +} + + +// Zebra-striping +// +// Default zebra-stripe styles (alternating gray and transparent backgrounds) + +.table-striped { + > tbody > tr:nth-child(odd) { + background-color: $table-bg-accent; + } +} + + +// Hover effect +// +// Placed here since it has to come after the potential zebra striping + +.table-hover { + > tbody > tr:hover { + background-color: $table-bg-hover; + } +} + + +// Table cell sizing +// +// Reset default table behavior + +table col[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-column; +} +table { + td, + th { + &[class*="col-"] { + position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623) + float: none; + display: table-cell; + } + } +} + + +// Table backgrounds +// +// Exact selectors below required to override `.table-striped` and prevent +// inheritance to nested tables. + +// Generate the contextual variants +@include table-row-variant(active, $table-bg-active); +@include table-row-variant(success, $state-success-bg); +@include table-row-variant(info, $state-info-bg); +@include table-row-variant(warning, $state-warning-bg); +@include table-row-variant(danger, $state-danger-bg); + + +// Responsive tables +// +// Wrap your tables in `.table-responsive` and we'll make them mobile friendly +// by enabling horizontal scrolling. Only applies <768px. Everything above that +// will display normally. + +.table-responsive { + overflow-x: auto; + min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837) + + @media screen and (max-width: $screen-xs-max) { + width: 100%; + margin-bottom: ($line-height-computed * 0.75); + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid $table-border-color; + + // Tighten up spacing + > .table { + margin-bottom: 0; + + // Ensure the content doesn't wrap + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + white-space: nowrap; + } + } + } + } + + // Special overrides for the bordered tables + > .table-bordered { + border: 0; + + // Nuke the appropriate borders so that the parent can handle them + > thead, + > tbody, + > tfoot { + > tr { + > th:first-child, + > td:first-child { + border-left: 0; + } + > th:last-child, + > td:last-child { + border-right: 0; + } + } + } + + // Only nuke the last row's bottom-border in `tbody` and `tfoot` since + // chances are there will be only one `tr` in a `thead` and that would + // remove the border altogether. + > tbody, + > tfoot { + > tr:last-child { + > th, + > td { + border-bottom: 0; + } + } + } + + } + } +} + + +.table > .thead-inverse { + > tr > th { + color: #fff; + background-color: $gray-dark; + } +} +.table > .thead-default { + > tr > th { + color: $gray; + background-color: $gray-lighter; + } +} + +.table-inverse { + color: $gray-lighter; + background-color: $gray-dark; + + &.table-bordered { + border: 0; + } + + > thead, + > tbody { + > tr { + > th, + > td { + border-color: $gray; + } + } + } +} + + +.table-reflow { + + thead { + float: left; + } + + tbody { + display: block; + white-space: nowrap; + } + + > thead, + > tbody, + > tfoot { + > tr { + > th, + > td { + border-top: 1px solid $table-border-color; + border-left: 1px solid $table-border-color; + + &:last-child { + border-right: 1px solid $table-border-color; + } + } + } + + &:last-child { + > tr:last-child { + > th, + > td { + border-bottom: 1px solid $table-border-color; + } + } + } + } + + tr { + float: left; + + th, + td { + display: block !important; + border: 1px solid $table-border-color; + } + } +} diff --git a/scss/_tooltip.scss b/scss/_tooltip.scss new file mode 100644 index 000000000..e738f8ddc --- /dev/null +++ b/scss/_tooltip.scss @@ -0,0 +1,103 @@ +// +// Tooltips +// -------------------------------------------------- + + +// Base class +.tooltip { + position: absolute; + z-index: $zindex-tooltip; + display: block; + visibility: visible; + // Reset font and text propertes given new insertion method + font-family: $font-family-base; + font-size: $font-size-sm; + font-weight: normal; + line-height: 1.4; + opacity: 0; + + &.in { opacity: $tooltip-opacity; } + &.top { margin-top: -3px; padding: $tooltip-arrow-width 0; } + &.right { margin-left: 3px; padding: 0 $tooltip-arrow-width; } + &.bottom { margin-top: 3px; padding: $tooltip-arrow-width 0; } + &.left { margin-left: -3px; padding: 0 $tooltip-arrow-width; } +} + +// Wrapper for the tooltip content +.tooltip-inner { + max-width: $tooltip-max-width; + padding: 3px 8px; + color: $tooltip-color; + text-align: center; + text-decoration: none; + background-color: $tooltip-bg; + @include border-radius($border-radius-base); +} + +// Arrows +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1 +.tooltip { + &.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width 0; + border-top-color: $tooltip-arrow-color; + } + &.top-left .tooltip-arrow { + bottom: 0; + right: $tooltip-arrow-width; + margin-bottom: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width 0; + border-top-color: $tooltip-arrow-color; + } + &.top-right .tooltip-arrow { + bottom: 0; + left: $tooltip-arrow-width; + margin-bottom: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width 0; + border-top-color: $tooltip-arrow-color; + } + &.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0; + border-right-color: $tooltip-arrow-color; + } + &.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -$tooltip-arrow-width; + border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width; + border-left-color: $tooltip-arrow-color; + } + &.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -$tooltip-arrow-width; + border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; + border-bottom-color: $tooltip-arrow-color; + } + &.bottom-left .tooltip-arrow { + top: 0; + right: $tooltip-arrow-width; + margin-top: -$tooltip-arrow-width; + border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; + border-bottom-color: $tooltip-arrow-color; + } + &.bottom-right .tooltip-arrow { + top: 0; + left: $tooltip-arrow-width; + margin-top: -$tooltip-arrow-width; + border-width: 0 $tooltip-arrow-width $tooltip-arrow-width; + border-bottom-color: $tooltip-arrow-color; + } +} diff --git a/scss/_type.scss b/scss/_type.scss new file mode 100644 index 000000000..4269b4526 --- /dev/null +++ b/scss/_type.scss @@ -0,0 +1,233 @@ +// +// Typography +// -------------------------------------------------- + + +// Headings +// ------------------------- + +h1, h2, h3, h4, h5, h6, +.h1, .h2, .h3, .h4, .h5, .h6 { + margin-top: 0; + font-family: $headings-font-family; + font-weight: $headings-font-weight; + line-height: $headings-line-height; + color: $headings-color; + + small, + .small { + font-weight: normal; + line-height: 1; + color: $headings-small-color; + } +} + +h1, .h1, +h2, .h2, +h3, .h3 { + margin-bottom: ($line-height-computed / 2); + + small, + .small { + font-size: 65%; + } +} +h4, .h4, +h5, .h5, +h6, .h6 { + margin-bottom: ($line-height-computed / 2); + + small, + .small { + font-size: 75%; + } +} + +h1, .h1 { font-size: $font-size-h1; } +h2, .h2 { font-size: $font-size-h2; } +h3, .h3 { font-size: $font-size-h3; } +h4, .h4 { font-size: $font-size-h4; } +h5, .h5 { font-size: $font-size-h5; } +h6, .h6 { font-size: $font-size-h6; } + + +// Body text +// ------------------------- + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + + +// Emphasis & misc +// ------------------------- + +// Ex: (12px small font / 14px base font) * 100% = about 85% +small, +.small { + font-size: floor((100% * $font-size-sm / $font-size-base)); +} + +mark, +.mark { + background-color: $state-warning-bg; + padding: .2em; +} + + +// Page header +// ------------------------- + +// .page-header { +// padding-bottom: (($line-height-computed / 2) - 1); +// margin: ($line-height-computed * 2) 0 @line-height-computed; +// border-bottom: 1px solid @page-header-border-color; +// } + + +// Lists +// ------------------------- + +// Unordered and Ordered lists +ul, +ol { + margin-top: 0; + margin-bottom: ($line-height-computed / 2); + ul, + ol { + margin-bottom: 0; + } +} + +// List options + +// Unstyled keeps list items block level, just removes default browser padding and list-style +.list-unstyled { + padding-left: 0; + list-style: none; +} + +// Inline turns list items into inline-block +.list-inline { + @extend list-unstyled(); + margin-left: -5px; + + > li { + display: inline-block; + padding-left: 5px; + padding-right: 5px; + } +} + +// Description Lists +dl { + margin-top: 0; // Remove browser default + margin-bottom: $line-height-computed; +} +dt, +dd { + line-height: $line-height-base; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; // Undo browser default +} + +// Horizontal description lists +// +// Defaults to being stacked without any of the below styles applied, until the +// grid breakpoint is reached (default of ~768px). + +.dl-horizontal { + dd { + @include clearfix(); // Clear the floated `dt` if an empty `dd` is present + } + + @media (min-width: $grid-float-breakpoint) { + dt { + float: left; + width: ($dl-horizontal-offset - 20); + clear: left; + text-align: right; + @include text-overflow(); + } + dd { + margin-left: $dl-horizontal-offset; + } + } +} + + +// Misc +// ------------------------- + +// Abbreviations and acronyms +abbr[title], +// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257 +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted $abbr-border-color; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} + +// Blockquotes +blockquote { + padding: ($line-height-computed / 2) $line-height-computed; + margin: 0 0 $line-height-computed; + font-size: $blockquote-font-size; + border-left: 5px solid $blockquote-border-color; + + p, + ul, + ol { + &:last-child { + margin-bottom: 0; + } + } + + footer { + display: block; + font-size: 80%; // back to default font-size + line-height: $line-height-base; + color: $blockquote-small-color; + + &:before { + content: '\2014 \00A0'; // em dash, nbsp + } + } +} + +// Opposite alignment of blockquote +.blockquote-reverse { + padding-right: 15px; + padding-left: 0; + border-right: 5px solid $blockquote-border-color; + border-left: 0; + text-align: right; + + // Account for citation + footer { + &:before { content: ''; } + &:after { + content: '\00A0 \2014'; // nbsp, em dash + } + } +} + +// Addresses +address { + margin-bottom: $line-height-computed; + font-style: normal; + line-height: $line-height-base; +} diff --git a/scss/_utilities-responsive.scss b/scss/_utilities-responsive.scss new file mode 100644 index 000000000..ef9b52ce0 --- /dev/null +++ b/scss/_utilities-responsive.scss @@ -0,0 +1,148 @@ +// +// Responsive: Utility classes +// -------------------------------------------------- + + +// IE10 in Windows (Phone) 8 +// +// Support for responsive views via media queries is kind of borked in IE10, for +// Surface/desktop in split view and for Windows Phone 8. This particular fix +// must be accompanied by a snippet of JavaScript to sniff the user agent and +// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at +// our Getting Started page for more information on this bug. +// +// For more information, see the following: +// +// Issue: https://github.com/twbs/bootstrap/issues/10497 +// Docs: http://getbootstrap.com/getting-started/#support-ie10-width +// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/ +// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/ + +@-ms-viewport { + width: device-width; +} + + +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} + +.visible-xs-block { + @include media-xs { + display: block !important; + } +} +.visible-xs-inline { + @include media-xs { + display: inline !important; + } +} +.visible-xs-inline-block { + @include media-xs { + display: inline-block !important; + } +} + +.visible-sm-block { + @include media-sm-max { + display: block !important; + } +} +.visible-sm-inline { + @include media-sm-max { + display: inline !important; + } +} +.visible-sm-inline-block { + @include media-sm-max { + display: inline-block !important; + } +} + +.visible-md-block { + @include media-md-max { + display: block !important; + } +} +.visible-md-inline { + @include media-md-max { + display: inline !important; + } +} +.visible-md-inline-block { + @include media-md-max { + display: inline-block !important; + } +} + +.visible-lg-block { + @include media-lg { + display: block !important; + } +} +.visible-lg-inline { + @include media-lg { + display: inline !important; + } +} +.visible-lg-inline-block { + @include media-lg { + display: inline-block !important; + } +} + +@include media-sm-max { + @include responsive-invisibility('.hidden-sm'); +} + +@include media-md-max { + @include responsive-invisibility('.hidden-md'); +} + +@include media-lg { + @include responsive-invisibility('.hidden-lg'); +} + + +// Print utilities +// +// Media queries are placed on the inside to be mixin-friendly. + +.visible-print-block { + display: none !important; + + @media print { + display: block !important; + } +} +.visible-print-inline { + display: none !important; + + @media print { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; + + @media print { + display: inline-block !important; + } +} + +.hidden-print { + @media print { + @include responsive-invisibility('.hidden-print'); + } +} diff --git a/scss/_utilities.scss b/scss/_utilities.scss new file mode 100644 index 000000000..8cc6fa1ef --- /dev/null +++ b/scss/_utilities.scss @@ -0,0 +1,122 @@ +// +// Utility classes +// -------------------------------------------------- + + +// Floats +.clearfix { + @include clearfix(); +} +.center-block { + @include center-block(); +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} + + +// Inverse +.inverse { + color: $gray-lighter; + background-color: $gray-dark; +} + +// Spacing +.p-a { + padding: $spacer; +} +.p-h { + padding-left: $spacer; + padding-right: $spacer; +} +.p-v { + padding-top: $spacer; + padding-bottom: $spacer; +} + +// Positioning +.pos-f-t { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: $zindex-navbar-fixed; +} + + +// Toggling content +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + @include text-hide(); +} + + +// Hide from screenreaders and browsers +// +// Credit: HTML5 Boilerplate +.hidden { + display: none !important; + visibility: hidden !important; +} + + +// For Affix plugin +.affix { + position: fixed; +} + +// Alignment +.text-left { text-align: left; } +.text-right { text-align: right; } +.text-center { text-align: center; } +.text-justify { text-align: justify; } +.text-nowrap { white-space: nowrap; } + +// Transformation +.text-lowercase { text-transform: lowercase; } +.text-uppercase { text-transform: uppercase; } +.text-capitalize { text-transform: capitalize; } + +// Contextual colors + +.text-muted { + color: $text-muted; +} + +@include text-emphasis-variant('.text-primary', $brand-primary); + +@include text-emphasis-variant('.text-success', $state-success-text); + +@include text-emphasis-variant('.text-info', $state-info-text); + +@include text-emphasis-variant('.text-warning', $state-warning-text); + +@include text-emphasis-variant('.text-danger', $state-danger-text); + +// Contextual backgrounds +// For now we'll leave these alongside the text classes until v4 when we can +// safely shift things around (per SemVer rules). + +.bg-primary { + // Given the contrast here, this is the only class to have its color inverted + // automatically. + color: #fff; +} + +@include bg-variant('.bg-primary', $brand-primary); + +@include bg-variant('.bg-success', $state-success-bg); + +@include bg-variant('.bg-info', $state-info-bg); + +@include bg-variant('.bg-warning', $state-warning-bg); + +@include bg-variant('.bg-danger', $state-danger-bg); diff --git a/scss/_variables.scss b/scss/_variables.scss new file mode 100644 index 000000000..92b2a5fa1 --- /dev/null +++ b/scss/_variables.scss @@ -0,0 +1,777 @@ +// +// Variables +// -------------------------------------------------- + + +//== Colors +// +//## Gray and brand colors for use across Bootstrap. + +$gray-dark: #373a3c; +$gray-darker: $gray-dark; // TODO: remove +$gray: #55595c; +$gray-light: #818a91; +$gray-lighter: #eceeef; +$gray-lightest: #f7f7f9; + +$brand-primary: #0275d8; +$brand-success: #5cb85c; +$brand-info: #5bc0de; +$brand-warning: #f0ad4e; +$brand-danger: #d9534f; + + +//== Scaffolding +// +//## Settings for some of the most global styles. + +//** Background color for `<body>`. +$body-bg: #fff; +//** Global text color on `<body>`. +$text-color: $gray-dark; + +//** Global textual link color. +$link-color: $brand-primary; +//** Link hover color set via `darken()` function. +$link-hover-color: darken($link-color, 15%); +//** Link hover decoration. +$link-hover-decoration: underline; + + +//== Global settings +// +//## Quickly modify global styling by enabling or disabling features. + +$enable-rounded: true !default; +$enable-shadows: true !default; +$enable-gradients: true !default; +$enable-transitions: true !default; + +$spacer: 1rem; +$border-width: .075rem; + +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. + +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif; +$font-family-serif: Georgia, "Times New Roman", Times, serif; +//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`. +$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace; +$font-family-base: $font-family-sans-serif; + +//** Pixel value used to responsively scale all typography. Applied to the `<html>` element. +$font-size-root: 16; +//** Sets the `<body>` and more to the root pixel value. +$font-size-base: 1rem; +$font-size-lg: 1.25rem; +$font-size-sm: .85rem; +$font-size-xs: .75rem; + +$font-size-h1: 3rem; +$font-size-h2: 2.5rem; +$font-size-h3: 2rem; +$font-size-h4: 1.5rem; +$font-size-h5: 1.25rem; +$font-size-h6: 1rem; + +//** Unit-less `line-height` for use in components like buttons. +$line-height-base: 1.5; +//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc. +$line-height-computed: ($font-size-root * $line-height-base); + +//** By default, this inherits from the `<body>`. +$headings-font-family: inherit; +$headings-font-weight: 500; +$headings-line-height: 1.1; +$headings-color: inherit; + + +//== Components +// +//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start). + +$padding-base-vertical: .5rem; +$padding-base-horizontal: .75rem; + +$padding-lg-vertical: .75rem; +$padding-lg-horizontal: 1.5rem; + +$padding-sm-vertical: .3rem; +$padding-sm-horizontal: .75rem; + +$padding-xs-vertical: .2rem; +$padding-xs-horizontal: .5rem; + +$line-height-lg: 1.33; +$line-height-sm: 1.5; + +$border-radius-base: .25rem; +$border-radius-lg: .3rem; +$border-radius-sm: .2rem; + +//** Global color for active items (e.g., navs or dropdowns). +$component-active-color: #fff; +//** Global background color for active items (e.g., navs or dropdowns). +$component-active-bg: $brand-primary; + +//** Width of the `border` for generating carets that indicator dropdowns. +$caret-width-base: .3em; +//** Carets increase slightly in size for larger components. +$caret-width-large: $caret-width-base; + + +//== Tables +// +//## Customizes the `.table` component with basic values, each used across all table variations. + +//** Padding for `<th>`s and `<td>`s. +$table-cell-padding: .75rem; +//** Padding for cells in `.table-sm`. +$table-sm-cell-padding: .3rem; + +//** Default background color used for all tables. +$table-bg: transparent; +//** Background color used for `.table-striped`. +$table-bg-accent: #f9f9f9; +//** Background color used for `.table-hover`. +$table-bg-hover: #f5f5f5; +$table-bg-active: $table-bg-hover; + +//** Border color for table and cell borders. +$table-border-color: $gray-lighter; + + +//== Buttons +// +//## For each of Bootstrap's buttons, define text, background and border color. + +$btn-font-weight: normal; + +$btn-primary-color: #fff; +$btn-primary-bg: $brand-primary; +$btn-primary-border: darken($btn-primary-bg, 5%); + +$btn-secondary-color: $gray-dark; +$btn-secondary-bg: #fff; +$btn-secondary-border: $gray-lighter; + +$btn-info-color: #fff; +$btn-info-bg: $brand-info; +$btn-info-border: darken($btn-info-bg, 5%); + +$btn-success-color: #fff; +$btn-success-bg: $brand-success; +$btn-success-border: darken($btn-success-bg, 5%); + +$btn-warning-color: #fff; +$btn-warning-bg: $brand-warning; +$btn-warning-border: darken($btn-warning-bg, 5%); + +$btn-danger-color: #fff; +$btn-danger-bg: $brand-danger; +$btn-danger-border: darken($btn-danger-bg, 5%); + +$btn-link-disabled-color: $gray-light; + + +//== Forms +// +//## + +//** `<input>` background color +$input-bg: #fff; +//** `<input disabled>` background color +$input-bg-disabled: $gray-lighter; + +//** Text color for `<input>`s +$input-color: $gray; +//** `<input>` border color +$input-border: #ccc; + +// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4 +//** Default `.form-control` border radius +$input-border-radius: $border-radius-base; +//** Large `.form-control` border radius +$input-border-radius-lg: $border-radius-lg; +//** Small `.form-control` border radius +$input-border-radius-sm: $border-radius-sm; + +//** Border color for inputs on focus +$input-border-focus: #66afe9; +$input-box-shadow-focus: rgba(102,175,233,.6); + +//** Placeholder text color +$input-color-placeholder: #999; + +//** Default `.form-control` height +$input-height-base: (($font-size-base * $line-height-base) + ($padding-base-vertical * 2) + ($border-width * 2)); +//** Large `.form-control` height +$input-height-lg: (($font-size-lg * $line-height-lg) + ($padding-lg-vertical * 2) + ($border-width * 2)); +//** Small `.form-control` height +$input-height-sm: (($font-size-sm * $line-height-sm) + ($padding-sm-vertical * 2) + ($border-width * 2)); + +$legend-color: $gray-dark; +$legend-border-color: #e5e5e5; + +//** Background color for textual input addons +$input-group-addon-bg: $gray-lighter; +//** Border color for textual input addons +$input-group-addon-border-color: $input-border; + +//** Disabled cursor for form controls and buttons. +$cursor-disabled: not-allowed; + + +//== Dropdowns +// +//## Dropdown menu container and contents. + +//** Background for the dropdown menu. +$dropdown-bg: #fff; +//** Dropdown menu `border-color`. +$dropdown-border: rgba(0,0,0,.15); +//** Divider color for between dropdown items. +$dropdown-divider-bg: #e5e5e5; + +//** Dropdown link text color. +$dropdown-link-color: $gray-dark; +//** Hover color for dropdown links. +$dropdown-link-hover-color: darken($gray-dark, 5%); +//** Hover background for dropdown links. +$dropdown-link-hover-bg: #f5f5f5; + +//** Active dropdown menu item text color. +$dropdown-link-active-color: $component-active-color; +//** Active dropdown menu item background color. +$dropdown-link-active-bg: $component-active-bg; + +//** Disabled dropdown menu item background color. +$dropdown-link-disabled-color: $gray-light; + +//** Text color for headers within dropdown menus. +$dropdown-header-color: $gray-light; + + +//-- Z-index master list +// +// Warning: Avoid customizing these values. They're used for a bird's eye view +// of components dependent on the z-axis and are designed to all work together. +// +// Note: These variables are not generated into the Customizer. + +$zindex-navbar: 1000; +$zindex-dropdown: 1000; +$zindex-popover: 1060; +$zindex-tooltip: 1070; +$zindex-navbar-fixed: 1030; +$zindex-modal: 1040; + + +//== Media queries breakpoints +// +//## Define the minimum and maximum dimensions at which your layout will change, adapting to different screen sizes. + +// Large screen / wide desktop +$screen-lg-min: 75em; + +// Medium screen / desktop +$screen-md-min: 62em; +$screen-md-max: ($screen-lg-min - .1); + +// Small screen / tablet +$screen-sm-min: 48em; +$screen-sm-max: ($screen-md-min - .1); + +// Extra small screen / phone +$screen-xs-max: ($screen-sm-min - .1); + + +//== Grid system +// +//## Define your custom responsive grid. + +//** Number of columns in the grid. +$grid-columns: 12; +//** Padding between columns. Gets divided in half for the left and right. +$grid-gutter-width: 1.5rem; +// Navbar collapse +//** Point at which the navbar becomes uncollapsed. +$grid-float-breakpoint: $screen-sm-min; +//** Point at which the navbar begins collapsing. +$grid-float-breakpoint-max: ($grid-float-breakpoint - 1); + + +//== Container sizes +// +//## Define the maximum width of `.container` for different screen sizes. + +//** For `$screen-sm-min` and up. +$container-sm: 45rem; // 720 + +//** For `$screen-md-min` and up. +$container-md: 60rem; // 960 + +//** For `$screen-lg-min` and up. +$container-lg: 72.25rem; // 1140 + + +//== Navbar +// +//## + +// Basics of a navbar +// $navbar-height: 50px; +$navbar-margin-bottom: $line-height-computed; +$navbar-border-radius: $border-radius-base; +$navbar-padding-horizontal: $spacer; +$navbar-padding-vertical: ($spacer / 2); +$navbar-collapse-max-height: 340px; + +$navbar-default-color: #777; +$navbar-default-bg: #f8f8f8; +$navbar-default-border: darken($navbar-default-bg, 6.5%); + +// Navbar links +$navbar-default-link-color: #777; +$navbar-default-link-hover-color: #333; +$navbar-default-link-hover-bg: transparent; +$navbar-default-link-active-color: #555; +$navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%); +$navbar-default-link-disabled-color: #ccc; +$navbar-default-link-disabled-bg: transparent; + +// Navbar brand label +$navbar-default-brand-color: $navbar-default-link-color; +$navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%); +$navbar-default-brand-hover-bg: transparent; + +// Navbar toggle +$navbar-default-toggle-hover-bg: #ddd; +$navbar-default-toggle-icon-bar-bg: #888; +$navbar-default-toggle-border-color: #ddd; + + +// Inverted navbar +// Reset inverted navbar basics +$navbar-inverse-color: lighten($gray-light, 12%); +$navbar-inverse-bg: #373a3c; +$navbar-inverse-border: darken($navbar-inverse-bg, 10%); + +// Inverted navbar links +$navbar-inverse-link-color: lighten($gray-light, 15%); +$navbar-inverse-link-hover-color: #fff; +$navbar-inverse-link-hover-bg: transparent; +$navbar-inverse-link-active-color: $navbar-inverse-link-hover-color; +$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%); +$navbar-inverse-link-disabled-color: #444; +$navbar-inverse-link-disabled-bg: transparent; + +// Inverted navbar brand label +$navbar-inverse-brand-color: $navbar-inverse-link-color; +$navbar-inverse-brand-hover-color: #fff; +$navbar-inverse-brand-hover-bg: transparent; + +// Inverted navbar toggle +$navbar-inverse-toggle-hover-bg: #333; +$navbar-inverse-toggle-icon-bar-bg: #fff; +$navbar-inverse-toggle-border-color: #333; + + +//== Navs +// +//## + +//=== Shared nav styles +$nav-link-padding: .6em 1em; +$nav-link-hover-bg: $gray-lighter; + +$nav-disabled-link-color: $gray-light; +$nav-disabled-link-hover-color: $gray-light; + +//== Tabs +$nav-tabs-border-color: #ddd; + +$nav-tabs-link-hover-border-color: $gray-lighter; + +$nav-tabs-active-link-hover-bg: $body-bg; +$nav-tabs-active-link-hover-color: $gray; +$nav-tabs-active-link-hover-border-color: #ddd; + +$nav-tabs-justified-link-border-color: #ddd; +$nav-tabs-justified-active-link-border-color: $body-bg; + +//== Pills +$nav-pills-border-radius: $border-radius-base; +$nav-pills-active-link-hover-bg: $component-active-bg; +$nav-pills-active-link-hover-color: $component-active-color; + + +//== Pagination +// +//## + +$pagination-color: $link-color; +$pagination-bg: #fff; +$pagination-border: #ddd; + +$pagination-hover-color: $link-hover-color; +$pagination-hover-bg: $gray-lighter; +$pagination-hover-border: #ddd; + +$pagination-active-color: #fff; +$pagination-active-bg: $brand-primary; +$pagination-active-border: $brand-primary; + +$pagination-disabled-color: $gray-light; +$pagination-disabled-bg: #fff; +$pagination-disabled-border: #ddd; + + +//== Pager +// +//## + +$pager-bg: $pagination-bg; +$pager-border: $pagination-border; +$pager-border-radius: 15px; + +$pager-hover-bg: $pagination-hover-bg; + +$pager-active-bg: $pagination-active-bg; +$pager-active-color: $pagination-active-color; + +$pager-disabled-color: $pagination-disabled-color; + + +//== Jumbotron +// +//## + +$jumbotron-padding: 2rem; +$jumbotron-color: inherit; +$jumbotron-bg: $gray-lighter; +$jumbotron-heading-color: inherit; +// $jumbotron-font-size: ceil(($font-size-base * 1.5)); + + +//== Form states and alerts +// +//## Define colors for form feedback states and, by default, alerts. + +$state-success-text: #3c763d; +$state-success-bg: #dff0d8; +$state-success-border: darken($state-success-bg, 5%); + +$state-info-text: #31708f; +$state-info-bg: #d9edf7; +$state-info-border: darken($state-info-bg, 7%); + +$state-warning-text: #8a6d3b; +$state-warning-bg: #fcf8e3; +$state-warning-border: darken($state-warning-bg, 5%); + +$state-danger-text: #a94442; +$state-danger-bg: #f2dede; +$state-danger-border: darken($state-danger-bg, 5%); + + +//== Tooltips +// +//## + +//** Tooltip max width +$tooltip-max-width: 200px; +//** Tooltip text color +$tooltip-color: #fff; +//** Tooltip background color +$tooltip-bg: #000; +$tooltip-opacity: .9; + +//** Tooltip arrow width +$tooltip-arrow-width: 5px; +//** Tooltip arrow color +$tooltip-arrow-color: $tooltip-bg; + + +//== Popovers +// +//## + +//** Popover body background color +$popover-bg: #fff; +//** Popover maximum width +$popover-max-width: 276px; +//** Popover border color +$popover-border-color: rgba(0,0,0,.2); +//** Popover fallback border color +$popover-fallback-border-color: #ccc; + +//** Popover title background color +$popover-title-bg: darken($popover-bg, 3%); + +//** Popover arrow width +$popover-arrow-width: 10px; +//** Popover arrow color +$popover-arrow-color: $popover-bg; + +//** Popover outer arrow width +$popover-arrow-outer-width: ($popover-arrow-width + 1); +//** Popover outer arrow color +$popover-arrow-outer-color: fadein($popover-border-color, 5%); +//** Popover outer arrow fallback color +$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%); + + +//== Labels +// +//## + +//** Default label background color +$label-default-bg: $gray-light; +//** Primary label background color +$label-primary-bg: $brand-primary; +//** Success label background color +$label-success-bg: $brand-success; +//** Info label background color +$label-info-bg: $brand-info; +//** Warning label background color +$label-warning-bg: $brand-warning; +//** Danger label background color +$label-danger-bg: $brand-danger; + +//** Default label text color +$label-color: #fff; +//** Default text color of a linked label +$label-link-hover-color: #fff; + + +//== Modals +// +//## + +//** Padding applied to the modal body +$modal-inner-padding: 15px; + +//** Padding applied to the modal title +$modal-title-padding: 15px; +//** Modal title line-height +$modal-title-line-height: $line-height-base; + +//** Background color of modal content area +$modal-content-bg: #fff; +//** Modal content border color +$modal-content-border-color: rgba(0,0,0,.2); + +//** Modal backdrop background color +$modal-backdrop-bg: #000; +//** Modal backdrop opacity +$modal-backdrop-opacity: .5; +//** Modal header border color +$modal-header-border-color: #e5e5e5; +//** Modal footer border color +$modal-footer-border-color: $modal-header-border-color; + +$modal-lg: 900px; +$modal-md: 600px; +$modal-sm: 300px; + + +//== Alerts +// +//## Define alert colors, border radius, and padding. + +$alert-padding: 15px; +$alert-border-radius: $border-radius-base; +$alert-link-font-weight: bold; + +$alert-success-bg: $state-success-bg; +$alert-success-text: $state-success-text; +$alert-success-border: $state-success-border; + +$alert-info-bg: $state-info-bg; +$alert-info-text: $state-info-text; +$alert-info-border: $state-info-border; + +$alert-warning-bg: $state-warning-bg; +$alert-warning-text: $state-warning-text; +$alert-warning-border: $state-warning-border; + +$alert-danger-bg: $state-danger-bg; +$alert-danger-text: $state-danger-text; +$alert-danger-border: $state-danger-border; + + +//== Progress bars +// +//## + +//** Background color of the whole progress component +$progress-bg: #f5f5f5; +//** Progress bar text color +$progress-bar-color: #fff; +//** Variable for setting rounded corners on progress bar. +$progress-border-radius: $border-radius-base; + +//** Default progress bar color +$progress-bar-bg: $brand-primary; +//** Success progress bar color +$progress-bar-success-bg: $brand-success; +//** Warning progress bar color +$progress-bar-warning-bg: $brand-warning; +//** Danger progress bar color +$progress-bar-danger-bg: $brand-danger; +//** Info progress bar color +$progress-bar-info-bg: $brand-info; + + +//== List group +// +//## + +//** Background color on `.list-group-item` +$list-group-bg: #fff; +//** `.list-group-item` border color +$list-group-border: #ddd; +//** List group border radius +$list-group-border-radius: $border-radius-base; + +//** Background color of single list items on hover +$list-group-hover-bg: #f5f5f5; +//** Text color of active list items +$list-group-active-color: $component-active-color; +//** Background color of active list items +$list-group-active-bg: $component-active-bg; +//** Border color of active list elements +$list-group-active-border: $list-group-active-bg; +//** Text color for content within active list items +$list-group-active-text-color: lighten($list-group-active-bg, 40%); + +//** Text color of disabled list items +$list-group-disabled-color: $gray-light; +//** Background color of disabled list items +$list-group-disabled-bg: $gray-lighter; +//** Text color for content within disabled list items +$list-group-disabled-text-color: $list-group-disabled-color; + +$list-group-link-color: #555; +$list-group-link-hover-color: $list-group-link-color; +$list-group-link-heading-color: #333; + + +//== Thumbnails +// +//## + +//** Padding around the thumbnail image +$thumbnail-padding: .25rem; +//** Thumbnail background color +$thumbnail-bg: $body-bg; +//** Thumbnail border color +$thumbnail-border: #ddd; +//** Thumbnail border radius +$thumbnail-border-radius: $border-radius-base; + + +//== Badges +// +//## + +$badge-color: #fff; +//** Linked badge text color on hover +$badge-link-hover-color: #fff; +$badge-bg: $gray-light; + +//** Badge text color in active nav link +$badge-active-color: $link-color; +//** Badge background color in active nav link +$badge-active-bg: #fff; + +$badge-font-weight: bold; +$badge-line-height: 1; +$badge-border-radius: 2em; + + +//== Breadcrumbs +// +//## + +$breadcrumb-padding-vertical: .75rem; +$breadcrumb-padding-horizontal: 1rem; + +//** Breadcrumb background color +$breadcrumb-bg: $gray-lighter; +//** Text color for the generated divider between breadcrumb items +$breadcrumb-divider-color: $gray-light; +//** Text color of current page in the breadcrumb +$breadcrumb-active-color: $gray-light; +//** Textual divider for between breadcrumb elements +$breadcrumb-divider: "/"; + + +//== Carousel +// +//## + +$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6); + +$carousel-control-color: #fff; +$carousel-control-width: 15%; +$carousel-control-opacity: .5; +$carousel-control-font-size: 20px; + +$carousel-indicator-active-bg: #fff; +$carousel-indicator-border-color: #fff; + +$carousel-caption-color: #fff; + + +//== Close +// +//## + +$close-font-weight: bold; +$close-color: #000; +$close-text-shadow: 0 1px 0 #fff; + + +//== Code +// +//## + +$code-color: #d44950; +$code-bg: #f7f7f9; + +$kbd-color: #fff; +$kbd-bg: #333; + +$pre-bg: #f7f7f9; +$pre-color: $gray-dark; +$pre-border-color: #ccc; +$pre-scrollable-max-height: 340px; + + +//== Type +// +//## + +//** Horizontal offset for forms and lists. +$component-offset-horizontal: 180px; +//** Text muted color +$text-muted: $gray-light; +//** Abbreviations and acronyms border color +$abbr-border-color: $gray-light; +//** Headings small color +$headings-small-color: $gray-light; +//** Blockquote small color +$blockquote-small-color: $gray-light; +//** Blockquote font size +$blockquote-font-size: ($font-size-base * 1.25); +//** Blockquote border color +$blockquote-border-color: $gray-lighter; +//** Page header border color +$page-header-border-color: $gray-lighter; +//** Width of horizontal description list titles +$dl-horizontal-offset: $component-offset-horizontal; +//** Horizontal line color. +$hr-border: $gray-lighter; diff --git a/scss/bootstrap.scss b/scss/bootstrap.scss new file mode 100644 index 000000000..6c8445ee5 --- /dev/null +++ b/scss/bootstrap.scss @@ -0,0 +1,47 @@ +// Core variables and mixins +@import "variables"; +@import "mixins"; + +// // Reset and dependencies +@import "normalize"; +@import "print"; + +// Core CSS +@import "scaffolding"; +@import "type"; +@import "code"; +@import "grid"; +@import "tables"; +@import "forms"; +@import "buttons"; + +// // Components +@import "animation"; +@import "dropdown"; +@import "button-group"; +@import "input-group"; +@import "nav"; +@import "navbar"; +@import "card"; +@import "breadcrumb"; +@import "pagination"; +@import "pager"; +@import "labels"; +@import "badge"; +@import "jumbotron"; +@import "alert"; +@import "progress"; +@import "media"; +@import "list-group"; +@import "responsive-embed"; +@import "close"; + +// Components w/ JavaScript +@import "modal"; +@import "tooltip"; +@import "popover"; +@import "carousel"; + +// Utility classes +@import "utilities"; +@import "utilities-responsive"; diff --git a/scss/mixins/_alert.scss b/scss/mixins/_alert.scss new file mode 100644 index 000000000..3faf0b5a5 --- /dev/null +++ b/scss/mixins/_alert.scss @@ -0,0 +1,14 @@ +// Alerts + +@mixin alert-variant($background, $border, $text-color) { + background-color: $background; + border-color: $border; + color: $text-color; + + hr { + border-top-color: darken($border, 5%); + } + .alert-link { + color: darken($text-color, 10%); + } +} diff --git a/scss/mixins/_background-variant.scss b/scss/mixins/_background-variant.scss new file mode 100644 index 000000000..4993bd2b8 --- /dev/null +++ b/scss/mixins/_background-variant.scss @@ -0,0 +1,11 @@ +// Contextual backgrounds + +// [converter] $parent hack +@mixin bg-variant($parent, $color) { + #{$parent} { + background-color: $color; + } + a#{$parent}:hover { + background-color: darken($color, 10%); + } +} diff --git a/scss/mixins/_border-radius.scss b/scss/mixins/_border-radius.scss new file mode 100644 index 000000000..0b76c3004 --- /dev/null +++ b/scss/mixins/_border-radius.scss @@ -0,0 +1,21 @@ +// Single side border-radius + +@mixin border-top-radius($radius) { + border-top-right-radius: $radius; + border-top-left-radius: $radius; +} + +@mixin border-right-radius($radius) { + border-bottom-right-radius: $radius; + border-top-right-radius: $radius; +} + +@mixin border-bottom-radius($radius) { + border-bottom-right-radius: $radius; + border-bottom-left-radius: $radius; +} + +@mixin border-left-radius($radius) { + border-bottom-left-radius: $radius; + border-top-left-radius: $radius; +} diff --git a/scss/mixins/_buttons.scss b/scss/mixins/_buttons.scss new file mode 100644 index 000000000..7233b4dc2 --- /dev/null +++ b/scss/mixins/_buttons.scss @@ -0,0 +1,56 @@ +// Button variants +// +// Easily pump out default styles, as well as :hover, :focus, :active, +// and disabled options for all buttons + +@mixin button-variant($color, $background, $border) { + color: $color; + background-color: $background; + border-color: $border; +// $shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); +// .box-shadow($shadow); + + &:hover, + &:focus, + &.focus, + &:active, + &.active, + .open > &.dropdown-toggle { + color: $color; + background-color: darken($background, 10%); + border-color: darken($border, 12%); + } + &:active, + &.active, + .open > &.dropdown-toggle { + // Remove the gradient for the pressed/active state + background-image: none; + @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); + } + &.disabled, + &[disabled], + fieldset[disabled] & { + &, + &:hover, + &:focus, + &.focus, + &:active, + &.active { + background-color: $background; + border-color: $border; + } + } + + .badge { + color: $background; + background-color: $color; + } +} + +// Button sizes +@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) { + padding: $padding-vertical $padding-horizontal; + font-size: $font-size; + line-height: $line-height; + @include border-radius($border-radius); +} diff --git a/scss/mixins/_center-block.scss b/scss/mixins/_center-block.scss new file mode 100644 index 000000000..e06fb5e27 --- /dev/null +++ b/scss/mixins/_center-block.scss @@ -0,0 +1,7 @@ +// Center-align a block level element + +@mixin center-block() { + display: block; + margin-left: auto; + margin-right: auto; +} diff --git a/scss/mixins/_clearfix.scss b/scss/mixins/_clearfix.scss new file mode 100644 index 000000000..dc3e2ab42 --- /dev/null +++ b/scss/mixins/_clearfix.scss @@ -0,0 +1,22 @@ +// Clearfix +// +// For modern browsers +// 1. The space content is one way to avoid an Opera bug when the +// contenteditable attribute is included anywhere else in the document. +// Otherwise it causes space to appear at the top and bottom of elements +// that are clearfixed. +// 2. The use of `table` rather than `block` is only necessary if using +// `:before` to contain the top-margins of child elements. +// +// Source: http://nicolasgallagher.com/micro-clearfix-hack/ + +@mixin clearfix() { + &:before, + &:after { + content: " "; // 1 + display: table; // 2 + } + &:after { + clear: both; + } +} diff --git a/scss/mixins/_forms.scss b/scss/mixins/_forms.scss new file mode 100644 index 000000000..0c057e874 --- /dev/null +++ b/scss/mixins/_forms.scss @@ -0,0 +1,88 @@ +// Form validation states +// +// Used in _forms.scss to generate the form validation CSS for warnings, errors, +// and successes. + +@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) { + // Color the label and help text + .help-block, + .control-label, + .radio, + .checkbox, + .radio-inline, + .checkbox-inline, + &.radio label, + &.checkbox label, + &.radio-inline label, + &.checkbox-inline label { + color: $text-color; + } + // Set the border and box shadow on specific inputs to match + .form-control { + border-color: $border-color; + @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work + + &:focus { + border-color: darken($border-color, 10%); + $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%); + @include box-shadow($shadow); + } + } + // Set validation states also for addons + .input-group-addon { + color: $text-color; + border-color: $border-color; + background-color: $background-color; + } + // Optional feedback icon + .form-control-feedback { + color: $text-color; + } +} + +// Form control focus state +// +// Generate a customized focus state and for any input with the specified color, +// which defaults to the `@input-border-focus` variable. +// +// We highly encourage you to not customize the default value, but instead use +// this to tweak colors on an as-needed basis. This aesthetic change is based on +// WebKit's default styles, but applicable to a wider range of browsers. Its +// usability and accessibility should be taken into account with any change. +// +// Example usage: change the default blue border and shadow to white for better +// contrast against a dark gray background. +@mixin form-control-focus() { + &:focus { + border-color: $input-border-focus; + outline: 0; + $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $input-box-shadow-focus; + @include box-shadow($shadow); + } +} + +// Form control sizing +// +// Relative text size, padding, and border-radii changes for form controls. For +// horizontal sizing, wrap controls in the predefined grid classes. `<select>` +// element gets special love because it's special, and that's a fact! + +@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) { + #{$parent} { + height: $input-height; + padding: $padding-vertical $padding-horizontal; + font-size: $font-size; + line-height: $line-height; + @include border-radius($border-radius); + } + + select#{$parent} { + height: $input-height; + line-height: $input-height; + } + + textarea#{$parent}, + select[multiple]#{$parent} { + height: auto; + } +} diff --git a/scss/mixins/_gradients.scss b/scss/mixins/_gradients.scss new file mode 100644 index 000000000..05118c8b6 --- /dev/null +++ b/scss/mixins/_gradients.scss @@ -0,0 +1,56 @@ +// Gradients + +// Horizontal gradient, from left to right +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +// Color stops are not available in IE9 and below. +@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) { + background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 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+ + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down +} + +// Vertical gradient, from top to bottom +// +// Creates two color stops, start and end, by specifying a color and position for each color stop. +// Color stops are not available in IE9 and below. +@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) { + background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent); // Opera 12 + 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+ + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down +} + +@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) { + background-repeat: repeat-x; + background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+ + background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12 + background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ +} +@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) { + background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color); + background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color); + background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color); + background-repeat: no-repeat; + 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 +} +@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) { + background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color); + background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color); + background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color); + background-repeat: no-repeat; + 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 +} +@mixin gradient-radial($inner-color: #555, $outer-color: #333) { + background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color); + background-image: radial-gradient(circle, $inner-color, $outer-color); + background-repeat: no-repeat; +} +@mixin gradient-striped($color: rgba(255,255,255,.15), $angle: 45deg) { + background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); + background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); + background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent); +}
\ No newline at end of file diff --git a/scss/mixins/_grid-framework.scss b/scss/mixins/_grid-framework.scss new file mode 100644 index 000000000..13c27c374 --- /dev/null +++ b/scss/mixins/_grid-framework.scss @@ -0,0 +1,81 @@ +// Framework grid generation +// +// Used only by Bootstrap to generate the correct number of grid classes given +// any value of `$grid-columns`. + +// [converter] This is defined recursively in LESS, but Sass supports real loops +@mixin make-grid-columns($i: 1, $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}") { + @for $i from (1 + 1) through $grid-columns { + $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}"; + } + #{$list} { + position: relative; + // Prevent columns from collapsing when empty + min-height: 1px; + // Inner gutter via padding + padding-left: ($grid-gutter-width / 2); + padding-right: ($grid-gutter-width / 2); + } +} + + +// [converter] This is defined recursively in LESS, but Sass supports real loops +@mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") { + @for $i from (1 + 1) through $grid-columns { + $list: "#{$list}, .col-#{$class}-#{$i}"; + } + #{$list} { + float: left; + } +} + + +@mixin calc-grid-column($index, $class, $type) { + @if ($type == width) and ($index > 0) { + .col-#{$class}-#{$index} { + width: percentage(($index / $grid-columns)); + } + } + @if ($type == push) and ($index > 0) { + .col-#{$class}-push-#{$index} { + left: percentage(($index / $grid-columns)); + } + } + @if ($type == push) and ($index == 0) { + .col-#{$class}-push-0 { + left: auto; + } + } + @if ($type == pull) and ($index > 0) { + .col-#{$class}-pull-#{$index} { + right: percentage(($index / $grid-columns)); + } + } + @if ($type == pull) and ($index == 0) { + .col-#{$class}-pull-0 { + right: auto; + } + } + @if ($type == offset) { + .col-#{$class}-offset-#{$index} { + margin-left: percentage(($index / $grid-columns)); + } + } +} + +// [converter] This is defined recursively in LESS, but Sass supports real loops +@mixin loop-grid-columns($columns, $class, $type) { + @for $i from 0 through $columns { + @include calc-grid-column($i, $class, $type); + } +} + + +// Create grid for specific class +@mixin make-grid($class) { + @include float-grid-columns($class); + @include loop-grid-columns($grid-columns, $class, width); + @include loop-grid-columns($grid-columns, $class, pull); + @include loop-grid-columns($grid-columns, $class, push); + @include loop-grid-columns($grid-columns, $class, offset); +}
\ No newline at end of file diff --git a/scss/mixins/_grid.scss b/scss/mixins/_grid.scss new file mode 100644 index 000000000..aceaeeb4c --- /dev/null +++ b/scss/mixins/_grid.scss @@ -0,0 +1,41 @@ +/// Grid system +// +// Generate semantic grid columns with these mixins. + +@mixin make-container($gutter: $grid-gutter-width) { + margin-right: auto; + margin-left: auto; + padding-left: ($gutter / 2); + padding-right: ($gutter / 2); + @include clearfix(); +} + +@mixin make-row($gutter: $grid-gutter-width) { + margin-left: ($gutter / -2); + margin-right: ($gutter / -2); + @include clearfix(); +} + +@mixin make-col($gutter: $grid-gutter-width) { + position: relative; + float: left; + min-height: 1px; + padding-left: ($gutter / 2); + padding-right: ($gutter / 2); +} + +@mixin make-col-span($columns) { + width: percentage(($columns / $grid-columns)); +} + +@mixin make-col-offset($columns) { + margin-left: percentage(($columns / $grid-columns)); +} + +@mixin make-col-push($columns) { + left: percentage(($columns / $grid-columns)); +} + +@mixin make-col-pull($columns) { + right: percentage(($columns / $grid-columns)); +} diff --git a/scss/mixins/_hide-text.scss b/scss/mixins/_hide-text.scss new file mode 100644 index 000000000..daed5fb7a --- /dev/null +++ b/scss/mixins/_hide-text.scss @@ -0,0 +1,8 @@ +// CSS image replacement +@mixin text-hide() { + font: "0/0" a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} diff --git a/scss/mixins/_image.scss b/scss/mixins/_image.scss new file mode 100644 index 000000000..f25e0ab21 --- /dev/null +++ b/scss/mixins/_image.scss @@ -0,0 +1,35 @@ +// Image Mixins +// - Responsive image +// - Retina image + + +// Responsive image +// +// Keep images from scaling beyond the width of their parents. + +@mixin img-responsive($display: block) { + display: $display; + max-width: 100%; // Part 1: Set a maximum relative to the parent + height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching +} + + +// Retina image +// +// Short retina mixin for setting background-image and -size. Note that the +// spelling of `min--moz-device-pixel-ratio` is intentional. + +@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) { + background-image: url("#{file-1x}"); + + @media + only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and ( min--moz-device-pixel-ratio: 2), + only screen and ( -o-min-device-pixel-ratio: 2/1), + only screen and ( min-device-pixel-ratio: 2), + only screen and ( min-resolution: 192dpi), + only screen and ( min-resolution: 2dppx) { + background-image: url("#{file-2x}"); + background-size: $width-1x $height-1x; + } +} diff --git a/scss/mixins/_label.scss b/scss/mixins/_label.scss new file mode 100644 index 000000000..eda6dfd29 --- /dev/null +++ b/scss/mixins/_label.scss @@ -0,0 +1,12 @@ +// Labels + +@mixin label-variant($color) { + background-color: $color; + + &[href] { + &:hover, + &:focus { + background-color: darken($color, 10%); + } + } +} diff --git a/scss/mixins/_list-group.scss b/scss/mixins/_list-group.scss new file mode 100644 index 000000000..0683d340c --- /dev/null +++ b/scss/mixins/_list-group.scss @@ -0,0 +1,30 @@ +// List Groups + +@mixin list-group-item-variant($state, $background, $color) { + .list-group-item-#{state} { + color: $color; + background-color: $background; + } + + a.list-group-item-#{state} { + color: $color; + + .list-group-item-heading { + color: inherit; + } + + &:hover, + &:focus { + color: $color; + background-color: darken($background, 5%); + } + + &.active, + &.active:hover, + &.active:focus { + color: #fff; + background-color: $color; + border-color: $color; + } + } +} diff --git a/scss/mixins/_media-queries.scss b/scss/mixins/_media-queries.scss new file mode 100644 index 000000000..b4e16ed88 --- /dev/null +++ b/scss/mixins/_media-queries.scss @@ -0,0 +1,25 @@ +// Media query mixins + +@mixin media-xs() { + @media (max-width: $screen-xs-max) { @content } +} + +@mixin media-sm() { + @media (min-width: $screen-sm-min) { @content } +} + +@mixin media-sm-max() { + @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) { @content } +} + +@mixin media-md() { + @media (min-width: $screen-md-min) { @content } +} + +@mixin media-md-max() { + @media (min-width: $screen-md-min) and (max-width: $screen-md-max) { @content } +} + +@mixin media-lg() { + @media (min-width: $screen-lg-min) { @content } +} diff --git a/scss/mixins/_nav-divider.scss b/scss/mixins/_nav-divider.scss new file mode 100644 index 000000000..2e6da02a4 --- /dev/null +++ b/scss/mixins/_nav-divider.scss @@ -0,0 +1,10 @@ +// Horizontal dividers +// +// Dividers (basically an hr) within dropdowns and nav lists + +@mixin nav-divider($color: #e5e5e5) { + height: 1px; + margin: (($line-height-computed / 2) - 1) 0; + overflow: hidden; + background-color: $color; +} diff --git a/scss/mixins/_navbar-align.scss b/scss/mixins/_navbar-align.scss new file mode 100644 index 000000000..c454a4ffe --- /dev/null +++ b/scss/mixins/_navbar-align.scss @@ -0,0 +1,9 @@ +// Navbar vertical align +// +// Vertically center elements in the navbar. +// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin. + +// @mixin navbar-vertical-align($element-height) { +// margin-top: (($navbar-height - $element-height) / 2); +// margin-bottom: (($navbar-height - $element-height) / 2); +// } diff --git a/scss/mixins/_pagination.scss b/scss/mixins/_pagination.scss new file mode 100644 index 000000000..43fff6863 --- /dev/null +++ b/scss/mixins/_pagination.scss @@ -0,0 +1,23 @@ +// Pagination + +@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $border-radius) { + > li { + > a, + > span { + padding: $padding-vertical $padding-horizontal; + font-size: $font-size; + } + &:first-child { + > a, + > span { + @include border-left-radius($border-radius); + } + } + &:last-child { + > a, + > span { + @include border-right-radius($border-radius); + } + } + } +} diff --git a/scss/mixins/_progress.scss b/scss/mixins/_progress.scss new file mode 100644 index 000000000..9c3212ae8 --- /dev/null +++ b/scss/mixins/_progress.scss @@ -0,0 +1,17 @@ +// Progress bars + +@mixin progress-variant($color) { + &[value]::-webkit-progress-value { + background-color: $color; + } + + &[value]::-moz-progress-bar { + background-color: $color; + } + + @media screen and ("min-width:0\0") { + .progress-bar { + background-color: $color; + } + } +} diff --git a/scss/mixins/_reset-filter.scss b/scss/mixins/_reset-filter.scss new file mode 100644 index 000000000..a7c7f22c5 --- /dev/null +++ b/scss/mixins/_reset-filter.scss @@ -0,0 +1,8 @@ +// Reset filters for IE +// +// When you need to remove a gradient background, do not forget to use this to reset +// the IE filter for IE9 and below. + +@mixin reset-filter() { + filter: "progid:DXImageTransform.Microsoft.gradient(enabled = false)"; +} diff --git a/scss/mixins/_resize.scss b/scss/mixins/_resize.scss new file mode 100644 index 000000000..83fa63791 --- /dev/null +++ b/scss/mixins/_resize.scss @@ -0,0 +1,6 @@ +// Resize anything + +@mixin resizable($direction) { + resize: $direction; // Options: horizontal, vertical, both + overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible` +} diff --git a/scss/mixins/_responsive-visibility.scss b/scss/mixins/_responsive-visibility.scss new file mode 100644 index 000000000..9867db013 --- /dev/null +++ b/scss/mixins/_responsive-visibility.scss @@ -0,0 +1,21 @@ +// Responsive utilities + +// +// More easily include all the states for responsive-utilities.less. +// [converter] $parent hack +@mixin responsive-visibility($parent) { + #{$parent} { + display: block !important; + } + table#{$parent} { display: table; } + tr#{$parent} { display: table-row !important; } + th#{$parent}, + td#{$parent} { display: table-cell !important; } +} + +// [converter] $parent hack +@mixin responsive-invisibility($parent) { + #{$parent} { + display: none !important; + } +} diff --git a/scss/mixins/_size.scss b/scss/mixins/_size.scss new file mode 100644 index 000000000..abbe2463c --- /dev/null +++ b/scss/mixins/_size.scss @@ -0,0 +1,10 @@ +// Sizing shortcuts + +@mixin size($width, $height) { + width: $width; + height: $height; +} + +@mixin square($size) { + @include size($size, $size); +} diff --git a/scss/mixins/_tab-focus.scss b/scss/mixins/_tab-focus.scss new file mode 100644 index 000000000..7df0ae7ca --- /dev/null +++ b/scss/mixins/_tab-focus.scss @@ -0,0 +1,9 @@ +// WebKit-style focus + +@mixin tab-focus() { + // Default + outline: thin dotted; + // WebKit + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} diff --git a/scss/mixins/_table-row.scss b/scss/mixins/_table-row.scss new file mode 100644 index 000000000..136795081 --- /dev/null +++ b/scss/mixins/_table-row.scss @@ -0,0 +1,28 @@ +// Tables + +@mixin table-row-variant($state, $background) { + // Exact selectors below required to override `.table-striped` and prevent + // inheritance to nested tables. + .table > thead > tr, + .table > tbody > tr, + .table > tfoot > tr { + > td.#{$state}, + > th.#{$state}, + &.#{$state} > td, + &.#{$state} > th { + background-color: $background; + } + } + + // Hover states for `.table-hover` + // Note: this is not available for cells or rows within `thead` or `tfoot`. + .table-hover > tbody > tr { + > td.#{$state}:hover, + > th.#{$state}:hover, + &.#{$state}:hover > td, + &:hover > .#{$state}, + &.#{$state}:hover > th { + background-color: darken($background, 5%); + } + } +} diff --git a/scss/mixins/_text-emphasis.scss b/scss/mixins/_text-emphasis.scss new file mode 100644 index 000000000..4424a38d4 --- /dev/null +++ b/scss/mixins/_text-emphasis.scss @@ -0,0 +1,10 @@ +// Typography + +@mixin text-emphasis-variant($parent, $color) { + #{$parent} { + color: $color; + } + a#{$parent}:hover { + color: darken($color, 10%); + } +} diff --git a/scss/mixins/_text-overflow.scss b/scss/mixins/_text-overflow.scss new file mode 100644 index 000000000..3be7baa8b --- /dev/null +++ b/scss/mixins/_text-overflow.scss @@ -0,0 +1,8 @@ +// Text overflow +// Requires inline-block or block for proper styling + +@mixin text-overflow() { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +}
\ No newline at end of file |
