mixins.less 25.3 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
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
583
// 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
584
.navbar-vertical-align(@element-height) {
585
586
  margin-top: ((@navbar-height - @element-height) / 2);
  margin-bottom: ((@navbar-height - @element-height) / 2);
587
588
}

589
590
591
592
593
// Progress bars
// -------------------------
.progress-bar-variant(@color) {
  background-color: @color;
  .progress-striped & {
594
    #gradient > .striped();
595
596
597
  }
}

Mark Otto's avatar
Mark Otto committed
598
599
600
601
602
// Responsive utilities
// -------------------------
// More easily include all the states for responsive-utilities.less.
.responsive-visibility() {
  display: block !important;
603
604
  table&  { display: table; }
  tr&     { display: table-row !important; }
Mark Otto's avatar
Mark Otto committed
605
  th&,
606
  td&     { display: table-cell !important; }
Mark Otto's avatar
Mark Otto committed
607
608
}

609
.responsive-invisibility() {
XhmikosR's avatar
XhmikosR committed
610
    &,
611
  tr&,
612
613
614
615
  th&,
  td& { display: none !important; }
}

616

617
618
619
// Grid System
// -----------

620
// Centered container element
621
622
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
623
  margin-left: auto;
624
625
  padding-left:  (@grid-gutter-width / 2);
  padding-right: (@grid-gutter-width / 2);
626
  &:extend(.clearfix all);
627
628
}

629
// Creates a wrapper for a series of columns
630
.make-row(@gutter: @grid-gutter-width) {
631
632
  margin-left:  (@gutter / -2);
  margin-right: (@gutter / -2);
633
  &:extend(.clearfix all);
634
}
Mark Otto's avatar
Mark Otto committed
635

636
637
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
638
639
  position: relative;
  float: left;
640
  width: percentage((@columns / @grid-columns));
641
642
643
644
645
646
647
648
  // 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
649
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
650
  position: relative;
651
652
  // Prevent columns from collapsing when empty
  min-height: 1px;
653
  // Inner gutter via padding
654
655
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
656
657

  // Calculate width based on number of columns available
658
  @media (min-width: @screen-sm-min) {
659
    float: left;
660
661
    width: percentage((@columns / @grid-columns));
  }
662
}
Mark Otto's avatar
Mark Otto committed
663

664
// Generate the small column offsets
665
.make-sm-column-offset(@columns) {
666
  @media (min-width: @screen-sm-min) {
667
668
669
    margin-left: percentage((@columns / @grid-columns));
  }
}
670
.make-sm-column-push(@columns) {
671
  @media (min-width: @screen-sm-min) {
672
673
674
    left: percentage((@columns / @grid-columns));
  }
}
675
.make-sm-column-pull(@columns) {
676
  @media (min-width: @screen-sm-min) {
677
678
    right: percentage((@columns / @grid-columns));
  }
679
}
680

681
682
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
Bass Jobsen's avatar
Bass Jobsen committed
683
684
685
686
  position: relative;
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
687
688
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
Mark Otto's avatar
Mark Otto committed
689

Bass Jobsen's avatar
Bass Jobsen committed
690
  // Calculate width based on number of columns available
691
  @media (min-width: @screen-md-min) {
692
    float: left;
Bass Jobsen's avatar
Bass Jobsen committed
693
694
695
    width: percentage((@columns / @grid-columns));
  }
}
Mark Otto's avatar
Mark Otto committed
696

697
// Generate the medium column offsets
698
.make-md-column-offset(@columns) {
699
  @media (min-width: @screen-md-min) {
700
701
702
    margin-left: percentage((@columns / @grid-columns));
  }
}
703
.make-md-column-push(@columns) {
704
  @media (min-width: @screen-md) {
705
706
707
    left: percentage((@columns / @grid-columns));
  }
}
708
.make-md-column-pull(@columns) {
709
  @media (min-width: @screen-md-min) {
710
711
712
713
    right: percentage((@columns / @grid-columns));
  }
}

714
715
716
717
718
719
720
721
722
723
// 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
724
  @media (min-width: @screen-lg-min) {
725
726
727
728
729
730
731
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}

// Generate the large column offsets
.make-lg-column-offset(@columns) {
732
  @media (min-width: @screen-lg-min) {
733
734
735
736
    margin-left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-push(@columns) {
737
  @media (min-width: @screen-lg-min) {
738
739
740
741
    left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-pull(@columns) {
742
  @media (min-width: @screen-lg-min) {
743
744
745
746
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
747

748
749
750
751
752
753
754
755
756
// 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}";
757
    .col((@index + 1), @item);
758
759
760
  }
  .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}";
761
    .col((@index + 1), ~"@{list}, @{item}");
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
  }
  .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}";
779
    .col((@index + 1), @item);
780
  }
781
  .col(@index, @list) when (@index =< @grid-columns) { // general
782
    @item: ~".col-@{class}-@{index}";
783
    .col((@index + 1), ~"@{list}, @{item}");
784
  }
785
  .col(@index, @list) when (@index > @grid-columns) { // terminal
786
787
788
789
790
791
792
    @{list} {
      float: left;
    }
  }
  .col(1); // kickstart it
}

793
.calc-grid(@index, @class, @type) when (@type = width) and (@index > 0) {
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
  .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
815
.make-grid(@index, @class, @type) when (@index >= 0) {
816
817
  .calc-grid(@index, @class, @type);
  // next iteration
818
  .make-grid((@index - 1), @class, @type);
819
820
821
}


Mark Otto's avatar
Mark Otto committed
822
823
824
825
826
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.

827
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
Mark Otto's avatar
Mark Otto committed
828
  // Color the label and help text
829
  .help-block,
830
831
832
833
834
  .control-label,
  .radio,
  .checkbox,
  .radio-inline,
  .checkbox-inline  {
Mark Otto's avatar
Mark Otto committed
835
836
837
    color: @text-color;
  }
  // Set the border and box shadow on specific inputs to match
Mark Otto's avatar
Mark Otto committed
838
  .form-control {
Mark Otto's avatar
Mark Otto committed
839
840
841
842
843
844
845
846
    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);
    }
  }
847
848
849
850
851
  // 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
852
  }
Mark Otto's avatar
Mark Otto committed
853
}
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875

// 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
876
877
878
879
880
881
882
883
884
885
886
887
888

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

ggam's avatar
ggam committed
890
891
892
893
  select& {
    height: @input-height;
    line-height: @input-height;
  }
894

ggam's avatar
ggam committed
895
896
897
898
  textarea& {
    height: auto;
  }
}