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 #333;
Chris Rebert's avatar
Chris Rebert committed
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
  font: ~"0/0" a;
92
  color: transparent;
93
  text-shadow: none;
94
  background-color: transparent;
95
  border: 0;
96
}
97

98

99

100
101
102
// CSS3 PROPERTIES
// --------------------------------------------------

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

121
// Drop shadows
Mark Otto's avatar
Mark Otto committed
122
.box-shadow(@shadow) {
123
  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
124
          box-shadow: @shadow;
125
126
127
}

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

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

177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
.rotateX(@degrees) {
  -webkit-transform: rotateX(@degrees);
      -ms-transform: rotateX(@degrees); // IE9+
          transform: rotateX(@degrees);
}
.rotateY(@degrees) {
  -webkit-transform: rotateY(@degrees);
      -ms-transform: rotateY(@degrees); // IE9+
          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
197
.transform-origin(@origin) {
198
199
200
201
202
  -webkit-transform-origin: @origin;
     -moz-transform-origin: @origin;
          transform-origin: @origin;
}

Zlatan Vasović's avatar
Zlatan Vasović committed
203
204
205
206
207
// Animations
.animation(@animation) {
  -webkit-animation: @animation;
          animation: @animation;
}
208

209
210
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
Chris Rebert's avatar
Chris Rebert committed
211
// Default value is `visible`, but can be changed to `hidden`
212
.backface-visibility(@visibility){
213
214
215
  -webkit-backface-visibility: @visibility;
     -moz-backface-visibility: @visibility;
          backface-visibility: @visibility;
216
217
}

218
219
220
221
222
223
224
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

225
226
227
228
229
// User select
// For selecting text on the page
.user-select(@select) {
  -webkit-user-select: @select;
     -moz-user-select: @select;
230
      -ms-user-select: @select; // IE10+
231
232
233
234
       -o-user-select: @select;
          user-select: @select;
}

235
// Resize anything
236
.resizable(@direction) {
237
238
239
240
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

241
// CSS3 Content Columns
242
.content-columns(@column-count; @column-gap: @grid-gutter-width) {
243
244
245
246
247
248
  -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;
249
250
}

Synchro's avatar
Synchro committed
251
252
// Optional hyphenation
.hyphens(@mode: auto) {
Mark Otto's avatar
Mark Otto committed
253
  word-wrap: break-word;
Synchro's avatar
Synchro committed
254
255
  -webkit-hyphens: @mode;
     -moz-hyphens: @mode;
256
      -ms-hyphens: @mode; // IE10+
Synchro's avatar
Synchro committed
257
       -o-hyphens: @mode;
Synchro's avatar
Synchro committed
258
259
260
          hyphens: @mode;
}

261
// Opacity
262
.opacity(@opacity) {
263
264
  opacity: @opacity;
  // IE8 filter
265
  @opacity-ie: (@opacity * 100);
266
  filter: ~"alpha(opacity=@{opacity-ie})";
267
268
269
270
}



Mark Otto's avatar
Mark Otto committed
271
// GRADIENTS
272
273
// --------------------------------------------------

274
#gradient {
Mark Otto's avatar
Mark Otto committed
275
276
277
278
279

  // 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.
280
  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
Mark Otto's avatar
Mark Otto committed
281
282
283
284
    background-image: -webkit-gradient(linear, @start-percent top, @end-percent top, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
    background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
    background-image:  linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
285
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
286
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
287
  }
Mark Otto's avatar
Mark Otto committed
288
289
290
291
292

  // 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.
293
  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
Mark Otto's avatar
Mark Otto committed
294
    background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
295
    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1+, Chrome 10+
Mark Otto's avatar
Mark Otto committed
296
297
    background-image:  -moz-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // FF 3.6+
    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10
298
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
299
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down
300
  }
Mark Otto's avatar
Mark Otto committed
301

302
  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
303
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
304
305
306
    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1+, Chrome 10+
    background-image: -moz-linear-gradient(@deg, @start-color, @end-color); // FF 3.6+
    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10
307
  }
308
  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
Mark Otto's avatar
Mark Otto committed
309
310
311
312
    background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
    background-image: -moz-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
313
    background-repeat: no-repeat;
Mark Otto's avatar
Mark Otto committed
314
    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
315
  }
316
  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
Mark Otto's avatar
Mark Otto committed
317
318
319
320
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@start-color), color-stop(@color-stop, @mid-color), to(@end-color));
    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
    background-image: -moz-linear-gradient(top, @start-color, @mid-color @color-stop, @end-color);
    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
321
    background-repeat: no-repeat;
Mark Otto's avatar
Mark Otto committed
322
    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
323
  }
324
  .radial(@inner-color: #555; @outer-color: #333) {
Mark Otto's avatar
Mark Otto committed
325
326
327
328
    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@inner-color), to(@outer-color));
    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
    background-image: -moz-radial-gradient(circle, @inner-color, @outer-color);
    background-image: radial-gradient(circle, @inner-color, @outer-color);
329
330
    background-repeat: no-repeat;
  }
331
332
333
334
335
  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {
    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, @color), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, @color), color-stop(.75, @color), color-stop(.75, transparent), to(transparent));
    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);
    background-image: -moz-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
336
  }
337
}
Mark Otto's avatar
Mark Otto committed
338

339
// Reset filters for IE
Mark Otto's avatar
Mark Otto committed
340
//
Mike Pagé's avatar
Mike Pagé committed
341
// When you need to remove a gradient background, do not forget to use this to reset
Mark Otto's avatar
Mark Otto committed
342
// the IE filter for IE9 and below.
343
.reset-filter() {
344
  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
345
}
346

347

Mark Otto's avatar
Mark Otto committed
348

349
350
// Retina images
//
Mark Otto's avatar
Mark Otto committed
351
// Short retina mixin for setting background-image and -size
352

353
.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
Mark Otto's avatar
Mark Otto committed
354
355
356
357
358
359
360
361
362
363
364
365
  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
366
367
}

368

369
370
371
372
373
374
375
376
377
378
379
// Responsive image
//
// Keep images from scaling beyond the width of their parents.

.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
}


380
381
382
// COMPONENT MIXINS
// --------------------------------------------------

383
// Horizontal dividers
384
385
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
Mark Otto's avatar
Mark Otto committed
386
387
.nav-divider(@color: #e5e5e5) {
  height: 1px;
388
  margin: ((@line-height-computed / 2) - 1) 0;
Jacob Thornton's avatar
Jacob Thornton committed
389
  overflow: hidden;
Mark Otto's avatar
Mark Otto committed
390
  background-color: @color;
391
392
}

393
394
// Panels
// -------------------------
395
.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border;) {
396
  border-color: @border;
Mark Otto's avatar
spacing    
Mark Otto committed
397

398
  & > .panel-heading {
399
400
401
    color: @heading-text-color;
    background-color: @heading-bg-color;
    border-color: @heading-border;
Mark Otto's avatar
spacing    
Mark Otto committed
402

Mark Otto's avatar
Mark Otto committed
403
404
405
    + .panel-collapse .panel-body {
      border-top-color: @border;
    }
406
407
408
    & > .dropdown .caret {
      border-color: @heading-text-color transparent;
    }
Mark Otto's avatar
Mark Otto committed
409
  }
410
  & > .panel-footer {
Mark Otto's avatar
Mark Otto committed
411
412
413
    + .panel-collapse .panel-body {
      border-bottom-color: @border;
    }
414
415
416
  }
}

Chris Rebert's avatar
Chris Rebert committed
417
418
// Alerts
// -------------------------
419
.alert-variant(@background; @border; @text-color) {
Chris Rebert's avatar
Chris Rebert committed
420
421
422
  background-color: @background;
  border-color: @border;
  color: @text-color;
Mark Otto's avatar
spacing    
Mark Otto committed
423

Chris Rebert's avatar
Chris Rebert committed
424
425
426
427
428
429
430
431
  hr {
    border-top-color: darken(@border, 5%);
  }
  .alert-link {
    color: darken(@text-color, 10%);
  }
}

ggam's avatar
ggam committed
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
// Tables
// -------------------------
.table-row-variant(@state; @background; @border) {
  // 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;
    }
  }
447

ggam's avatar
ggam committed
448
449
450
451
452
  // 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,
James Lawrence's avatar
James Lawrence committed
453
454
    &.@{state}:hover > td,
    &.@{state}:hover > th {
ggam's avatar
ggam committed
455
456
457
458
459
      background-color: darken(@background, 5%);
    }
  }
}

460
// Button variants
461
462
463
// -------------------------
// Easily pump out default styles, as well as :hover, :focus, :active,
// and disabled options for all buttons
464
.button-variant(@color; @background; @border) {
465
  color: @color;
466
467
  background-color: @background;
  border-color: @border;
468

Mark Otto's avatar
Mark Otto committed
469
  &:hover,
470
  &:focus,
471
  &:active,
472
473
  &.active,
  .open .dropdown-toggle& {
474
    color: @color;
475
476
    background-color: darken(@background, 8%);
        border-color: darken(@border, 12%);
Mark Otto's avatar
Mark Otto committed
477
  }
478
479
480
481
482
  &:active,
  &.active,
  .open .dropdown-toggle& {
    background-image: none;
  }
483
  &.disabled,
484
  &[disabled],
485
  fieldset[disabled] & {
486
    &,
487
488
    &:hover,
    &:focus,
489
490
    &:active,
    &.active {
491
      background-color: @background;
Zlatan Vasović's avatar
Zlatan Vasović committed
492
          border-color: @border;
493
    }
494
495
496
  }
}

ggam's avatar
ggam committed
497
498
499
500
501
502
503
504
505
// 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
506
507
// Pagination
// -------------------------
Guillermo González de Agüero's avatar
Guillermo González de Agüero committed
508
.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
ggam's avatar
ggam committed
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
  > 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
530
531
532
533
534
535
536
537
538
539
540
541
// Labels
// -------------------------
.label-variant(@color) {
  background-color: @color;
  &[href] {
    &:hover,
    &:focus {
      background-color: darken(@color, 10%);
    }
  }
}

542
543
544
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
545
// 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
546
.navbar-vertical-align(@element-height) {
547
548
  margin-top: ((@navbar-height - @element-height) / 2);
  margin-bottom: ((@navbar-height - @element-height) / 2);
549
550
}

551
552
553
554
555
// Progress bars
// -------------------------
.progress-bar-variant(@color) {
  background-color: @color;
  .progress-striped & {
556
    #gradient > .striped();
557
558
559
  }
}

Mark Otto's avatar
Mark Otto committed
560
561
562
563
564
565
566
567
568
569
// Responsive utilities
// -------------------------
// More easily include all the states for responsive-utilities.less.
.responsive-visibility() {
  display: block !important;
  tr& { display: table-row !important; }
  th&,
  td& { display: table-cell !important; }
}

570
.responsive-invisibility() {
XhmikosR's avatar
XhmikosR committed
571
    &,
572
  tr&,
573
574
575
576
  th&,
  td& { display: none !important; }
}

577

578
579
580
// Grid System
// -----------

581
// Centered container element
582
583
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
584
  margin-left: auto;
585
586
  padding-left:  (@grid-gutter-width / 2);
  padding-right: (@grid-gutter-width / 2);
587
  .clearfix();
588
589
}

590
// Creates a wrapper for a series of columns
591
.make-row(@gutter: @grid-gutter-width) {
592
593
  margin-left:  (@gutter / -2);
  margin-right: (@gutter / -2);
594
  .clearfix();
595
}
Mark Otto's avatar
Mark Otto committed
596

597
598
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
599
600
  position: relative;
  float: left;
601
  width: percentage((@columns / @grid-columns));
602
603
604
605
606
607
608
609
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
}

// Generate the small columns
610
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
611
  position: relative;
612
613
  // Prevent columns from collapsing when empty
  min-height: 1px;
614
  // Inner gutter via padding
615
616
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
617
618

  // Calculate width based on number of columns available
619
  @media (min-width: @screen-sm-min) {
620
    float: left;
621
622
    width: percentage((@columns / @grid-columns));
  }
623
}
Mark Otto's avatar
Mark Otto committed
624

625
// Generate the small column offsets
626
.make-sm-column-offset(@columns) {
627
  @media (min-width: @screen-sm-min) {
628
629
630
    margin-left: percentage((@columns / @grid-columns));
  }
}
631
.make-sm-column-push(@columns) {
632
  @media (min-width: @screen-sm-min) {
633
634
635
    left: percentage((@columns / @grid-columns));
  }
}
636
.make-sm-column-pull(@columns) {
637
  @media (min-width: @screen-sm-min) {
638
639
    right: percentage((@columns / @grid-columns));
  }
640
}
641

642
643
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
Bass Jobsen's avatar
Bass Jobsen committed
644
645
646
647
  position: relative;
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
648
649
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
Mark Otto's avatar
Mark Otto committed
650

Bass Jobsen's avatar
Bass Jobsen committed
651
  // Calculate width based on number of columns available
652
  @media (min-width: @screen-md-min) {
653
    float: left;
Bass Jobsen's avatar
Bass Jobsen committed
654
655
656
    width: percentage((@columns / @grid-columns));
  }
}
Mark Otto's avatar
Mark Otto committed
657

658
// Generate the medium column offsets
659
.make-md-column-offset(@columns) {
660
  @media (min-width: @screen-md-min) {
661
662
663
    margin-left: percentage((@columns / @grid-columns));
  }
}
664
.make-md-column-push(@columns) {
665
  @media (min-width: @screen-md) {
666
667
668
    left: percentage((@columns / @grid-columns));
  }
}
669
.make-md-column-pull(@columns) {
670
  @media (min-width: @screen-md-min) {
671
672
673
674
    right: percentage((@columns / @grid-columns));
  }
}

675
676
677
678
679
680
681
682
683
684
// Generate the large columns
.make-lg-column(@columns; @gutter: @grid-gutter-width) {
  position: relative;
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);

  // Calculate width based on number of columns available
685
  @media (min-width: @screen-lg-min) {
686
687
688
689
690
691
692
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}

// Generate the large column offsets
.make-lg-column-offset(@columns) {
693
  @media (min-width: @screen-lg-min) {
694
695
696
697
    margin-left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-push(@columns) {
698
  @media (min-width: @screen-lg-min) {
699
700
701
702
    left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-pull(@columns) {
703
  @media (min-width: @screen-lg-min) {
704
705
706
707
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
708

709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
// 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}";
    .col(@index + 1, @item);
  }
  .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}";
    .col(@index + 1, ~"@{list}, @{item}");
  }
  .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}";
    .col(@index + 1, @item);
  }
  .col(@index, @list) when (@index < @grid-columns) { // general
    @item: ~".col-@{class}-@{index}";
    .col(@index + 1, ~"@{list}, @{item}");
  }
  .col(@index, @list) when (@index = @grid-columns) { // terminal
    @{list} {
      float: left;
    }
  }
  .col(1); // kickstart it
}

754
.calc-grid(@index, @class, @type) when (@type = width) and (@index > 0) {
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
  .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
776
.make-grid(@index, @class, @type) when (@index >= 0) {
777
778
779
780
781
782
  .calc-grid(@index, @class, @type);
  // next iteration
  .make-grid(@index - 1, @class, @type);
}


Mark Otto's avatar
Mark Otto committed
783
784
785
786
787
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.

788
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
Mark Otto's avatar
Mark Otto committed
789
  // Color the label and help text
790
  .help-block,
791
792
793
794
795
  .control-label,
  .radio,
  .checkbox,
  .radio-inline,
  .checkbox-inline  {
Mark Otto's avatar
Mark Otto committed
796
797
798
    color: @text-color;
  }
  // Set the border and box shadow on specific inputs to match
Mark Otto's avatar
Mark Otto committed
799
  .form-control {
Mark Otto's avatar
Mark Otto committed
800
801
802
803
804
805
806
807
    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);
    }
  }
808
809
810
811
812
  // 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
813
  }
Mark Otto's avatar
Mark Otto committed
814
}
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836

// 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
837
838
839
840
841
842
843
844
845
846
847
848
849

// 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;
850

ggam's avatar
ggam committed
851
852
853
854
  select& {
    height: @input-height;
    line-height: @input-height;
  }
855

ggam's avatar
ggam committed
856
857
858
859
  textarea& {
    height: auto;
  }
}