mixins.less 25.5 KB
Newer Older
1
2
3
//
// Mixins
// --------------------------------------------------
4

5

6
7
// Utilities
// -------------------------
8
9

// Clearfix
10
11
12
13
14
15
16
17
18
// Source: http://nicolasgallagher.com/micro-clearfix-hack/
//
// 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.
19
.clearfix() {
20
  &:before,
21
  &:after {
22
23
    content: " "; // 1
    display: table; // 2
24
25
  }
  &:after {
26
    clear: both;
27
  }
28
29
}

Chris Rebert's avatar
Chris Rebert committed
30
// WebKit-style focus
Mark Otto's avatar
Mark Otto committed
31
32
.tab-focus() {
  // Default
33
  outline: thin dotted;
34
  // WebKit
Mark Otto's avatar
Mark Otto committed
35
36
37
38
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}

39
// Center-align a block level element
40
.center-block() {
41
  display: block;
42
43
  margin-left: auto;
  margin-right: auto;
44
45
46
}

// Sizing shortcuts
47
.size(@width; @height) {
48
  width: @width;
49
  height: @height;
50
}
51
.square(@size) {
52
  .size(@size; @size);
53
54
}

55
// Placeholder text
Mark Otto's avatar
Mark Otto committed
56
.placeholder(@color: @input-color-placeholder) {
57
  &:-moz-placeholder            { color: @color; } // Firefox 4-18
58
59
  &::-moz-placeholder           { color: @color;   // Firefox 19+
                                  opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526
60
61
  &:-ms-input-placeholder       { color: @color; } // Internet Explorer 10+
  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome
62
63
}

Mark Otto's avatar
Mark Otto committed
64
65
66
67
68
69
70
71
// Text overflow
// Requires inline-block or block for proper styling
.text-overflow() {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

72
// CSS image replacement
73
74
75
//
// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for
// mixins being reused as classes with the same name, this doesn't hold up. As
76
77
// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note
// that we cannot chain the mixins together in Less, so they are repeated.
78
//
79
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
80

81
82
83
84
85
86
87
88
89
// Deprecated as of v3.0.1 (will be removed in v4)
.hide-text() {
  font: ~"0/0" a;
  color: transparent;
  text-shadow: none;
  background-color: transparent;
  border: 0;
}
// New mixin to use as of v3.0.1
90
.text-hide() {
91
  .hide-text();
92
}
93

94

95

96
97
98
// CSS3 PROPERTIES
// --------------------------------------------------

99
// Single side border-radius
100
.border-top-radius(@radius) {
101
102
  border-top-right-radius: @radius;
   border-top-left-radius: @radius;
103
104
}
.border-right-radius(@radius) {
105
106
  border-bottom-right-radius: @radius;
     border-top-right-radius: @radius;
Mark Otto's avatar
Mark Otto committed
107
108
}
.border-bottom-radius(@radius) {
109
110
  border-bottom-right-radius: @radius;
   border-bottom-left-radius: @radius;
Mark Otto's avatar
Mark Otto committed
111
112
}
.border-left-radius(@radius) {
113
114
  border-bottom-left-radius: @radius;
     border-top-left-radius: @radius;
115
116
}

117
// Drop shadows
Mark Otto's avatar
Mark Otto committed
118
.box-shadow(@shadow) {
119
  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
120
          box-shadow: @shadow;
121
122
123
}

// Transitions
Mark Otto's avatar
Mark Otto committed
124
125
126
.transition(@transition) {
  -webkit-transition: @transition;
          transition: @transition;
127
}
128
129
130
131
.transition-property(@transition-property) {
  -webkit-transition-property: @transition-property;
          transition-property: @transition-property;
}
Tunghsiao Liu's avatar
Tunghsiao Liu committed
132
133
134
135
.transition-delay(@transition-delay) {
  -webkit-transition-delay: @transition-delay;
          transition-delay: @transition-delay;
}
Tunghsiao Liu's avatar
Tunghsiao Liu committed
136
137
138
139
.transition-duration(@transition-duration) {
  -webkit-transition-duration: @transition-duration;
          transition-duration: @transition-duration;
}
140
141
142
143
144
145
.transition-transform(@transition) {
  -webkit-transition: -webkit-transform @transition;
     -moz-transition: -moz-transform @transition;
       -o-transition: -o-transform @transition;
          transition: transform @transition;
}
146

Mark Otto's avatar
Mark Otto committed
147
// Transformations
148
.rotate(@degrees) {
149
  -webkit-transform: rotate(@degrees);
150
      -ms-transform: rotate(@degrees); // IE9 only
151
152
          transform: rotate(@degrees);
}
153
154
.scale(@ratio; @ratio-y...) {
  -webkit-transform: scale(@ratio, @ratio-y);
155
      -ms-transform: scale(@ratio, @ratio-y); // IE9 only
156
          transform: scale(@ratio, @ratio-y);
157
}
158
.translate(@x; @y) {
Mark Otto's avatar
Mark Otto committed
159
  -webkit-transform: translate(@x, @y);
160
      -ms-transform: translate(@x, @y); // IE9 only
Mark Otto's avatar
Mark Otto committed
161
162
          transform: translate(@x, @y);
}
163
.skew(@x; @y) {
Mark Otto's avatar
Mark Otto committed
164
  -webkit-transform: skew(@x, @y);
165
      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
Mark Otto's avatar
Mark Otto committed
166
167
          transform: skew(@x, @y);
}
168
.translate3d(@x; @y; @z) {
169
170
  -webkit-transform: translate3d(@x, @y, @z);
          transform: translate3d(@x, @y, @z);
171
}
172

173
174
.rotateX(@degrees) {
  -webkit-transform: rotateX(@degrees);
175
      -ms-transform: rotateX(@degrees); // IE9 only
176
177
178
179
          transform: rotateX(@degrees);
}
.rotateY(@degrees) {
  -webkit-transform: rotateY(@degrees);
180
      -ms-transform: rotateY(@degrees); // IE9 only
181
182
183
184
185
186
187
188
189
190
191
192
          transform: rotateY(@degrees);
}
.perspective(@perspective) {
  -webkit-perspective: @perspective;
     -moz-perspective: @perspective;
          perspective: @perspective;
}
.perspective-origin(@perspective) {
  -webkit-perspective-origin: @perspective;
     -moz-perspective-origin: @perspective;
          perspective-origin: @perspective;
}
Zlatan Vasović's avatar
Zlatan Vasović committed
193
.transform-origin(@origin) {
194
195
  -webkit-transform-origin: @origin;
     -moz-transform-origin: @origin;
196
      -ms-transform-origin: @origin; // IE9 only
197
198
199
          transform-origin: @origin;
}

Zlatan Vasović's avatar
Zlatan Vasović committed
200
201
202
203
204
// Animations
.animation(@animation) {
  -webkit-animation: @animation;
          animation: @animation;
}
Zlatan Vasović's avatar
Zlatan Vasović committed
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
.animation-name(@name) {
  -webkit-animation-name: @name;
          animation-name: @name;
}
.animation-duration(@duration) {
  -webkit-animation-duration: @duration;
          animation-duration: @duration;
}
.animation-timing-function(@timing-function) {
  -webkit-animation-timing-function: @timing-function;
          animation-timing-function: @timing-function;
}
.animation-delay(@delay) {
  -webkit-animation-delay: @delay;
          animation-delay: @delay;
}
.animation-iteration-count(@iteration-count) {
  -webkit-animation-iteration-count: @iteration-count;
          animation-iteration-count: @iteration-count;
}
.animation-direction(@direction) {
  -webkit-animation-direction: @direction;
          animation-direction: @direction;
}
229

230
231
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
Chris Rebert's avatar
Chris Rebert committed
232
// Default value is `visible`, but can be changed to `hidden`
233
.backface-visibility(@visibility){
234
235
236
  -webkit-backface-visibility: @visibility;
     -moz-backface-visibility: @visibility;
          backface-visibility: @visibility;
237
238
}

239
240
241
242
243
244
245
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

246
247
248
249
250
// User select
// For selecting text on the page
.user-select(@select) {
  -webkit-user-select: @select;
     -moz-user-select: @select;
251
      -ms-user-select: @select; // IE10+
252
253
254
255
       -o-user-select: @select;
          user-select: @select;
}

256
// Resize anything
257
.resizable(@direction) {
258
259
260
261
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

262
// CSS3 Content Columns
263
.content-columns(@column-count; @column-gap: @grid-gutter-width) {
264
265
266
267
268
269
  -webkit-column-count: @column-count;
     -moz-column-count: @column-count;
          column-count: @column-count;
  -webkit-column-gap: @column-gap;
     -moz-column-gap: @column-gap;
          column-gap: @column-gap;
270
271
}

Synchro's avatar
Synchro committed
272
273
// Optional hyphenation
.hyphens(@mode: auto) {
Mark Otto's avatar
Mark Otto committed
274
  word-wrap: break-word;
Synchro's avatar
Synchro committed
275
276
  -webkit-hyphens: @mode;
     -moz-hyphens: @mode;
277
      -ms-hyphens: @mode; // IE10+
Synchro's avatar
Synchro committed
278
       -o-hyphens: @mode;
Synchro's avatar
Synchro committed
279
280
281
          hyphens: @mode;
}

282
// Opacity
283
.opacity(@opacity) {
284
285
  opacity: @opacity;
  // IE8 filter
286
  @opacity-ie: (@opacity * 100);
287
  filter: ~"alpha(opacity=@{opacity-ie})";
288
289
290
291
}



Mark Otto's avatar
Mark Otto committed
292
// GRADIENTS
293
294
// --------------------------------------------------

295
#gradient {
Mark Otto's avatar
Mark Otto committed
296
297
298
299
300

  // 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.
301
  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
302
303
    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+
    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+
304
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
305
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
306
  }
Mark Otto's avatar
Mark Otto committed
307
308
309
310
311

  // 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.
312
  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
313
314
    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+
    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+
315
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
316
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
317
  }
Mark Otto's avatar
Mark Otto committed
318

319
  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
320
    background-repeat: repeat-x;
321
322
    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+
    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
323
  }
324
  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
Mark Otto's avatar
Mark Otto committed
325
326
    background-image: -webkit-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);
Francisco arenas's avatar
Francisco arenas committed
327
    background-repeat: no-repeat;
Mark Otto's avatar
Mark Otto committed
328
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
Francisco arenas's avatar
Francisco arenas committed
329
  }
330
  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
Mark Otto's avatar
Mark Otto committed
331
332
    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
333
    background-repeat: no-repeat;
Mark Otto's avatar
Mark Otto committed
334
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback
335
  }
336
  .radial(@inner-color: #555; @outer-color: #333) {
Mark Otto's avatar
Mark Otto committed
337
338
    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
    background-image: radial-gradient(circle, @inner-color, @outer-color);
339
340
    background-repeat: no-repeat;
  }
341
342
343
  .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: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
Piotrek Okoński's avatar
Piotrek Okoński committed
344
  }
345
}
Mark Otto's avatar
Mark Otto committed
346

347
// Reset filters for IE
Mark Otto's avatar
Mark Otto committed
348
//
Mike Pagé's avatar
Mike Pagé committed
349
// When you need to remove a gradient background, do not forget to use this to reset
Mark Otto's avatar
Mark Otto committed
350
// the IE filter for IE9 and below.
351
.reset-filter() {
352
  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
353
}
354

355

Mark Otto's avatar
Mark Otto committed
356

357
358
// Retina images
//
Mark Otto's avatar
Mark Otto committed
359
// Short retina mixin for setting background-image and -size
360

361
.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
Mark Otto's avatar
Mark Otto committed
362
363
364
365
366
367
368
369
370
371
372
373
  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;
  }
Danny Keane's avatar
Danny Keane committed
374
375
}

376

377
378
379
380
// Responsive image
//
// Keep images from scaling beyond the width of their parents.

Zlatan Vasović's avatar
Zlatan Vasović committed
381
.img-responsive(@display: block) {
382
383
384
385
386
387
  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
}


388
389
390
// COMPONENT MIXINS
// --------------------------------------------------

391
// Horizontal dividers
392
393
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
Mark Otto's avatar
Mark Otto committed
394
395
.nav-divider(@color: #e5e5e5) {
  height: 1px;
396
  margin: ((@line-height-computed / 2) - 1) 0;
Jacob Thornton's avatar
Jacob Thornton committed
397
  overflow: hidden;
Mark Otto's avatar
Mark Otto committed
398
  background-color: @color;
399
400
}

401
402
// Panels
// -------------------------
403
.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {
404
  border-color: @border;
Mark Otto's avatar
spacing    
Mark Otto committed
405

406
  & > .panel-heading {
407
408
409
    color: @heading-text-color;
    background-color: @heading-bg-color;
    border-color: @heading-border;
Mark Otto's avatar
spacing    
Mark Otto committed
410

Mark Otto's avatar
Mark Otto committed
411
412
413
414
    + .panel-collapse .panel-body {
      border-top-color: @border;
    }
  }
415
  & > .panel-footer {
Mark Otto's avatar
Mark Otto committed
416
417
418
    + .panel-collapse .panel-body {
      border-bottom-color: @border;
    }
419
420
421
  }
}

Chris Rebert's avatar
Chris Rebert committed
422
423
// Alerts
// -------------------------
424
.alert-variant(@background; @border; @text-color) {
Chris Rebert's avatar
Chris Rebert committed
425
426
427
  background-color: @background;
  border-color: @border;
  color: @text-color;
Mark Otto's avatar
spacing    
Mark Otto committed
428

Chris Rebert's avatar
Chris Rebert committed
429
430
431
432
433
434
435
436
  hr {
    border-top-color: darken(@border, 5%);
  }
  .alert-link {
    color: darken(@text-color, 10%);
  }
}

ggam's avatar
ggam committed
437
438
// Tables
// -------------------------
Zlatan Vasović's avatar
Zlatan Vasović committed
439
.table-row-variant(@state; @background) {
ggam's avatar
ggam committed
440
441
  // Exact selectors below required to override `.table-striped` and prevent
  // inheritance to nested tables.
442
443
444
445
446
447
448
449
  .table > thead > tr,
  .table > tbody > tr,
  .table > tfoot > tr {
    > td.@{state},
    > th.@{state},
    &.@{state} > td,
    &.@{state} > th {
      background-color: @background;
ggam's avatar
ggam committed
450
451
    }
  }
452

ggam's avatar
ggam committed
453
454
  // Hover states for `.table-hover`
  // Note: this is not available for cells or rows within `thead` or `tfoot`.
455
456
457
458
459
  .table-hover > tbody > tr {
    > td.@{state}:hover,
    > th.@{state}:hover,
    &.@{state}:hover > td,
    &.@{state}:hover > th {
ggam's avatar
ggam committed
460
461
462
463
464
      background-color: darken(@background, 5%);
    }
  }
}

465
466
// List Groups
// -------------------------
Mark Otto's avatar
Mark Otto committed
467
468
469
.list-group-item-variant(@state; @background; @color) {
  .list-group-item-@{state} {
    color: @color;
470
    background-color: @background;
Mark Otto's avatar
Mark Otto committed
471

472
    a& {
Mark Otto's avatar
Mark Otto committed
473
      color: @color;
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488

      .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;
      }
Mark Otto's avatar
Mark Otto committed
489
    }
490
491
492
  }
}

493
// Button variants
494
495
496
// -------------------------
// Easily pump out default styles, as well as :hover, :focus, :active,
// and disabled options for all buttons
497
.button-variant(@color; @background; @border) {
498
  color: @color;
499
500
  background-color: @background;
  border-color: @border;
501

Mark Otto's avatar
Mark Otto committed
502
  &:hover,
503
  &:focus,
504
  &:active,
505
506
  &.active,
  .open .dropdown-toggle& {
507
    color: @color;
508
509
    background-color: darken(@background, 8%);
        border-color: darken(@border, 12%);
Mark Otto's avatar
Mark Otto committed
510
  }
511
512
513
514
515
  &:active,
  &.active,
  .open .dropdown-toggle& {
    background-image: none;
  }
516
  &.disabled,
517
  &[disabled],
518
  fieldset[disabled] & {
519
    &,
520
521
    &:hover,
    &:focus,
522
523
    &:active,
    &.active {
524
      background-color: @background;
Zlatan Vasović's avatar
Zlatan Vasović committed
525
          border-color: @border;
526
    }
527
  }
528
529
530

  .badge {
    color: @background;
531
    background-color: @color;
532
  }
533
534
}

ggam's avatar
ggam committed
535
536
537
538
539
540
541
542
543
// Button sizes
// -------------------------
.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;
  border-radius: @border-radius;
}

ggam's avatar
ggam committed
544
545
// Pagination
// -------------------------
Guillermo González de Agüero's avatar
Guillermo González de Agüero committed
546
.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
ggam's avatar
ggam committed
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
  > li {
    > a,
    > span {
      padding: @padding-vertical @padding-horizontal;
      font-size: @font-size;
    }
    &:first-child {
      > a,
      > span {
        .border-left-radius(@border-radius);
      }
    }
    &:last-child {
      > a,
      > span {
        .border-right-radius(@border-radius);
      }
    }
  }
}

Chris Rebert's avatar
Chris Rebert committed
568
569
570
571
572
573
574
575
576
577
578
579
// Labels
// -------------------------
.label-variant(@color) {
  background-color: @color;
  &[href] {
    &:hover,
    &:focus {
      background-color: darken(@color, 10%);
    }
  }
}

580
581
582
583
584
585
586
587
588
// Contextual backgrounds
// -------------------------
.bg-variant(@color) {
  background-color: @color;
  a&:hover {
    background-color: darken(@color, 10%);
  }
}

589
590
591
592
// Typography
// -------------------------
.text-emphasis-variant(@color) {
  color: @color;
593
  a&:hover {
594
595
596
597
    color: darken(@color, 10%);
  }
}

598
599
600
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
601
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
Mark Otto's avatar
Mark Otto committed
602
.navbar-vertical-align(@element-height) {
603
604
  margin-top: ((@navbar-height - @element-height) / 2);
  margin-bottom: ((@navbar-height - @element-height) / 2);
605
606
}

607
608
609
610
611
// Progress bars
// -------------------------
.progress-bar-variant(@color) {
  background-color: @color;
  .progress-striped & {
612
    #gradient > .striped();
613
614
615
  }
}

Mark Otto's avatar
Mark Otto committed
616
617
618
619
620
// Responsive utilities
// -------------------------
// More easily include all the states for responsive-utilities.less.
.responsive-visibility() {
  display: block !important;
621
622
  table&  { display: table; }
  tr&     { display: table-row !important; }
Mark Otto's avatar
Mark Otto committed
623
  th&,
624
  td&     { display: table-cell !important; }
Mark Otto's avatar
Mark Otto committed
625
626
}

627
.responsive-invisibility() {
XhmikosR's avatar
XhmikosR committed
628
    &,
629
  tr&,
630
631
632
633
  th&,
  td& { display: none !important; }
}

634

635
636
637
// Grid System
// -----------

638
// Centered container element
639
640
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
641
  margin-left: auto;
642
643
  padding-left:  (@grid-gutter-width / 2);
  padding-right: (@grid-gutter-width / 2);
644
  &:extend(.clearfix all);
645
646
}

647
// Creates a wrapper for a series of columns
648
.make-row(@gutter: @grid-gutter-width) {
649
650
  margin-left:  (@gutter / -2);
  margin-right: (@gutter / -2);
651
  &:extend(.clearfix all);
652
}
Mark Otto's avatar
Mark Otto committed
653

654
655
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
656
657
  position: relative;
  float: left;
658
  width: percentage((@columns / @grid-columns));
659
660
661
662
  min-height: 1px;
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
}
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
.make-xs-column-offset(@columns) {
  @media (min-width: @screen-xs-min) {
    margin-left: percentage((@columns / @grid-columns));
  }
}
.make-xs-column-push(@columns) {
  @media (min-width: @screen-xs-min) {
    left: percentage((@columns / @grid-columns));
  }
}
.make-xs-column-pull(@columns) {
  @media (min-width: @screen-xs-min) {
    right: percentage((@columns / @grid-columns));
  }
}
678

Mark Otto's avatar
Mark Otto committed
679

680
// Generate the small columns
681
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
682
  position: relative;
683
  min-height: 1px;
684
685
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
686

687
  @media (min-width: @screen-sm-min) {
688
    float: left;
689
690
    width: percentage((@columns / @grid-columns));
  }
691
}
692
.make-sm-column-offset(@columns) {
693
  @media (min-width: @screen-sm-min) {
694
695
696
    margin-left: percentage((@columns / @grid-columns));
  }
}
697
.make-sm-column-push(@columns) {
698
  @media (min-width: @screen-sm-min) {
699
700
701
    left: percentage((@columns / @grid-columns));
  }
}
702
.make-sm-column-pull(@columns) {
703
  @media (min-width: @screen-sm-min) {
704
705
    right: percentage((@columns / @grid-columns));
  }
706
}
707

Mark Otto's avatar
Mark Otto committed
708

709
710
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
Bass Jobsen's avatar
Bass Jobsen committed
711
712
  position: relative;
  min-height: 1px;
713
714
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
Mark Otto's avatar
Mark Otto committed
715

716
  @media (min-width: @screen-md-min) {
717
    float: left;
Bass Jobsen's avatar
Bass Jobsen committed
718
719
720
    width: percentage((@columns / @grid-columns));
  }
}
721
.make-md-column-offset(@columns) {
722
  @media (min-width: @screen-md-min) {
723
724
725
    margin-left: percentage((@columns / @grid-columns));
  }
}
726
.make-md-column-push(@columns) {
727
  @media (min-width: @screen-md-min) {
728
729
730
    left: percentage((@columns / @grid-columns));
  }
}
731
.make-md-column-pull(@columns) {
732
  @media (min-width: @screen-md-min) {
733
734
735
736
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
737

738
739
740
741
742
743
744
// Generate the large columns
.make-lg-column(@columns; @gutter: @grid-gutter-width) {
  position: relative;
  min-height: 1px;
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);

745
  @media (min-width: @screen-lg-min) {
746
747
748
749
750
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-offset(@columns) {
751
  @media (min-width: @screen-lg-min) {
752
753
754
755
    margin-left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-push(@columns) {
756
  @media (min-width: @screen-lg-min) {
757
758
759
760
    left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-pull(@columns) {
761
  @media (min-width: @screen-lg-min) {
762
763
764
765
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
766

767
768
769
770
771
772
773
774
775
// Framework grid generation
//
// Used only by Bootstrap to generate the correct number of grid classes given
// any value of `@grid-columns`.

.make-grid-columns() {
  // Common styles for all sizes of grid columns, widths 1-12
  .col(@index) when (@index = 1) { // initial
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
776
    .col((@index + 1), @item);
777
778
779
  }
  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
780
    .col((@index + 1), ~"@{list}, @{item}");
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
  }
  .col(@index, @list) when (@index > @grid-columns) { // terminal
    @{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);
    }
  }
  .col(1); // kickstart it
}

.make-grid-columns-float(@class) {
  .col(@index) when (@index = 1) { // initial
    @item: ~".col-@{class}-@{index}";
798
    .col((@index + 1), @item);
799
  }
800
  .col(@index, @list) when (@index =< @grid-columns) { // general
801
    @item: ~".col-@{class}-@{index}";
802
    .col((@index + 1), ~"@{list}, @{item}");
803
  }
804
  .col(@index, @list) when (@index > @grid-columns) { // terminal
805
806
807
808
809
810
811
    @{list} {
      float: left;
    }
  }
  .col(1); // kickstart it
}

812
.calc-grid(@index, @class, @type) when (@type = width) and (@index > 0) {
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
  .col-@{class}-@{index} {
    width: percentage((@index / @grid-columns));
  }
}
.calc-grid(@index, @class, @type) when (@type = push) {
  .col-@{class}-push-@{index} {
    left: percentage((@index / @grid-columns));
  }
}
.calc-grid(@index, @class, @type) when (@type = pull) {
  .col-@{class}-pull-@{index} {
    right: percentage((@index / @grid-columns));
  }
}
.calc-grid(@index, @class, @type) when (@type = offset) {
  .col-@{class}-offset-@{index} {
    margin-left: percentage((@index / @grid-columns));
  }
}

// Basic looping in LESS
834
.make-grid(@index, @class, @type) when (@index >= 0) {
835
836
  .calc-grid(@index, @class, @type);
  // next iteration
837
  .make-grid((@index - 1), @class, @type);
838
839
840
}


Mark Otto's avatar
Mark Otto committed
841
842
843
844
845
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.

846
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
Mark Otto's avatar
Mark Otto committed
847
  // Color the label and help text
848
  .help-block,
849
850
851
852
853
  .control-label,
  .radio,
  .checkbox,
  .radio-inline,
  .checkbox-inline  {
Mark Otto's avatar
Mark Otto committed
854
855
856
    color: @text-color;
  }
  // Set the border and box shadow on specific inputs to match
Mark Otto's avatar
Mark Otto committed
857
  .form-control {
Mark Otto's avatar
Mark Otto committed
858
859
860
861
862
863
864
865
    border-color: @border-color;
    .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%);
      .box-shadow(@shadow);
    }
  }
866
867
868
869
870
  // Set validation states also for addons
  .input-group-addon {
    color: @text-color;
    border-color: @border-color;
    background-color: @background-color;
Mark Otto's avatar
Mark Otto committed
871
  }
872
  // Optional feedback icon
873
874
875
  .form-control-feedback {
    color: @text-color;
  }
Mark Otto's avatar
Mark Otto committed
876
}
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898

// Form control focus state
//
// Generate a customized focus state and for any input with the specified color,
// which defaults to the `@input-focus-border` 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.

.form-control-focus(@color: @input-border-focus) {
  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
  &:focus {
    border-color: @color;
    outline: 0;
    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
  }
}
ggam's avatar
ggam committed
899
900
901
902
903
904
905
906
907
908
909
910
911

// 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!

.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
  height: @input-height;
  padding: @padding-vertical @padding-horizontal;
  font-size: @font-size;
  line-height: @line-height;
  border-radius: @border-radius;
912

ggam's avatar
ggam committed
913
914
915
916
  select& {
    height: @input-height;
    line-height: @input-height;
  }
917

ggam's avatar
ggam committed
918
919
920
921
  textarea& {
    height: auto;
  }
}