mixins.less 25.2 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
  min-height: 1px;
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
}
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
.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));
  }
}
660

Mark Otto's avatar
Mark Otto committed
661

662
// Generate the small columns
663
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
664
  position: relative;
665
  min-height: 1px;
666
667
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
668

669
  @media (min-width: @screen-sm-min) {
670
    float: left;
671
672
    width: percentage((@columns / @grid-columns));
  }
673
}
674
.make-sm-column-offset(@columns) {
675
  @media (min-width: @screen-sm-min) {
676
677
678
    margin-left: percentage((@columns / @grid-columns));
  }
}
679
.make-sm-column-push(@columns) {
680
  @media (min-width: @screen-sm-min) {
681
682
683
    left: percentage((@columns / @grid-columns));
  }
}
684
.make-sm-column-pull(@columns) {
685
  @media (min-width: @screen-sm-min) {
686
687
    right: percentage((@columns / @grid-columns));
  }
688
}
689

Mark Otto's avatar
Mark Otto committed
690

691
692
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
Bass Jobsen's avatar
Bass Jobsen committed
693
694
  position: relative;
  min-height: 1px;
695
696
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
Mark Otto's avatar
Mark Otto committed
697

698
  @media (min-width: @screen-md-min) {
699
    float: left;
Bass Jobsen's avatar
Bass Jobsen committed
700
701
702
    width: percentage((@columns / @grid-columns));
  }
}
703
.make-md-column-offset(@columns) {
704
  @media (min-width: @screen-md-min) {
705
706
707
    margin-left: percentage((@columns / @grid-columns));
  }
}
708
.make-md-column-push(@columns) {
709
  @media (min-width: @screen-md-min) {
710
711
712
    left: percentage((@columns / @grid-columns));
  }
}
713
.make-md-column-pull(@columns) {
714
  @media (min-width: @screen-md-min) {
715
716
717
718
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
719

720
721
722
723
724
725
726
// 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);

727
  @media (min-width: @screen-lg-min) {
728
729
730
731
732
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-offset(@columns) {
733
  @media (min-width: @screen-lg-min) {
734
735
736
737
    margin-left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-push(@columns) {
738
  @media (min-width: @screen-lg-min) {
739
740
741
742
    left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-pull(@columns) {
743
  @media (min-width: @screen-lg-min) {
744
745
746
747
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
748

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

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


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

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

// 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
881
882
883
884
885
886
887
888
889
890
891
892
893

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

ggam's avatar
ggam committed
895
896
897
898
  select& {
    height: @input-height;
    line-height: @input-height;
  }
899

ggam's avatar
ggam committed
900
901
902
903
  textarea& {
    height: auto;
  }
}