// // Mixins // -------------------------------------------------- // UTILITY MIXINS // -------------------------------------------------- // Clearfix // -------- // For clearing floats like a boss h5bp.com/q .clearfix { &:before, &:after { display: table; content: ""; // Fixes Opera/contenteditable bug: // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952 line-height: 0; } &:after { clear: both; } } // Webkit-style focus // ------------------ .tab-focus() { // Default outline: thin dotted #333; // Webkit outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } // FORMS // -------------------------------------------------- // Mixin for form field states .formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) { // Set the text color > label, .help-block, .help-inline { color: @textColor; } // Style inputs accordingly .checkbox, .radio, input, select, textarea { color: @textColor; border-color: @borderColor; box-shadow: inset 0 1px 1px rgba(0,0,0,.075); // Redeclare so transitions work &:focus { border-color: darken(@borderColor, 10%); // Write out in full since the lighten() function isn't easily escaped box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%); } } // Give a small background color for input-prepend/-append .input-prepend .add-on, .input-append .add-on { color: @textColor; background-color: @backgroundColor; border-color: @textColor; } } // BACKGROUNDS // -------------------------------------------------- // Gradient Bar Colors for buttons and alerts .gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { color: @textColor; text-shadow: @textShadow; #gradient > .vertical(@primaryColor, @secondaryColor); border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%); border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%); } // Gradients #gradient { .vertical(@startColor: #555, @endColor: #333) { background-color: mix(@startColor, @endColor, 60%); background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10 background-repeat: repeat-x; } } // COMPONENT MIXINS // -------------------------------------------------- // Horizontal dividers // ------------------------- // Dividers (basically an hr) within dropdowns and nav lists .nav-divider(@top: #e5e5e5, @bottom: @white) { height: 1px; margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px overflow: hidden; background-color: @top; border-bottom: 1px solid @bottom; } // Button backgrounds // ------------------ .buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) { color: @textColor; text-shadow: @textShadow; #gradient > .vertical(@startColor, @endColor); border-color: @endColor @endColor darken(@endColor, 15%); border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%); // in these cases the gradient won't cover the background, so we override &:hover, &:active, &.active, &.disabled, &[disabled] { color: @textColor; background-color: @endColor; } } // Grid System // ----------- // Table columns .tableColumns(@columnSpan: 1) { float: none; // undo default grid column styles width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells margin-left: 0; // undo default grid column styles } // The Grid #grid { .core (@gridColumnWidth, @gridGutterWidth) { .spanX (@index) when (@index > 0) { // (~".span@{index}") { .span(@index); } .span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .offsetX (@index) when (@index > 0) { // (~".offset@{index}") { .offset(@index); } .offset@{index} { .offset(@index); } .offsetX(@index - 1); } .offsetX (0) {} .offset (@columns) { margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1)); } .span (@columns) { width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1)); } .row { margin-left: @gridGutterWidth * -1; .clearfix(); } [class*="span"] { float: left; margin-left: @gridGutterWidth; } // Set the container width .container { .span(@gridColumns); } // generate .spanX and .offsetX .spanX (@gridColumns); .offsetX (@gridColumns); } .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) { .spanX (@index) when (@index > 0) { // (~".span@{index}") { .span(@index); } .span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .offsetX (@index) when (@index > 0) { // (~'.offset@{index}') { .offset(@index); } // (~'.offset@{index}:first-child') { .offsetFirstChild(@index); } .offset@{index} { .offset(@index); } .offset@{index}:first-child { .offsetFirstChild(@index); } .offsetX(@index - 1); } .offsetX (0) {} .offset (@columns) { margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2); } .offsetFirstChild (@columns) { margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth); } .span (@columns) { width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)); } .row-fluid { width: 100%; .clearfix(); [class*="span"] { display: block; width: 100%; min-height: 30px; // Make inputs at least the height of their button counterpart box-sizing: border-box; // Makes inputs behave like true block-level elements float: left; margin-left: @fluidGridGutterWidth; } [class*="span"]:first-child { margin-left: 0; } // generate .spanX and .offsetX .spanX (@gridColumns); .offsetX (@gridColumns); } } .input(@gridColumnWidth, @gridGutterWidth) { .spanX (@index) when (@index > 0) { // (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); } input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); } .spanX(@index - 1); } .spanX (0) {} .span(@columns) { width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14; } input, textarea, .uneditable-input { margin-left: 0; // override margin-left from core grid system } // Space grid-sized controls properly if multiple per line .controls-row [class*="span"] + [class*="span"] { margin-left: @gridGutterWidth; } // generate .spanX .spanX (@gridColumns); } }