mixins.less 25.4 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
34
  outline: thin dotted;
  //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
406
    + .panel-collapse .panel-body {
      border-top-color: @border;
    }
  }
407
  & > .panel-footer {
Mark Otto's avatar
Mark Otto committed
408
409
410
    + .panel-collapse .panel-body {
      border-bottom-color: @border;
    }
411
412
413
  }
}

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

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

ggam's avatar
ggam committed
429
430
// Tables
// -------------------------
Zlatan Vasović's avatar
Zlatan Vasović committed
431
.table-row-variant(@state; @background) {
ggam's avatar
ggam committed
432
433
  // Exact selectors below required to override `.table-striped` and prevent
  // inheritance to nested tables.
Zlatan Vasović's avatar
Zlatan Vasović committed
434
435
436
437
438
439
440
441
442
  .table {
    > thead,
    > tbody,
    > tfoot {
      > tr > .@{state},
      > .@{state} > td,
      > .@{state} > th {
        background-color: @background;
      }
ggam's avatar
ggam committed
443
444
    }
  }
445

ggam's avatar
ggam committed
446
447
  // Hover states for `.table-hover`
  // Note: this is not available for cells or rows within `thead` or `tfoot`.
Zlatan Vasović's avatar
Zlatan Vasović committed
448
449
450
451
  .table-hover > tbody {
    > tr > .@{state}:hover,
    > .@{state}:hover > td,
    > .@{state}:hover > th {
ggam's avatar
ggam committed
452
453
454
455
456
      background-color: darken(@background, 5%);
    }
  }
}

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

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

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

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

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

Mark Otto's avatar
Mark Otto committed
557
558
559
560
561
562
563
564
565
566
// 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; }
}

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

574

575
576
577
// Grid System
// -----------

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

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

594
595
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
596
597
  position: relative;
  float: left;
598
  width: percentage((@columns / @grid-columns));
599
600
601
602
603
604
605
606
  // 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
607
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
608
  position: relative;
609
610
  // Prevent columns from collapsing when empty
  min-height: 1px;
611
  // Inner gutter via padding
612
613
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
614
615

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

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

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

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

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

672
673
674
675
676
677
678
679
680
681
// 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
682
  @media (min-width: @screen-lg-min) {
683
684
685
686
687
688
689
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}

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

Mark Otto's avatar
Mark Otto committed
705

706
707
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
// 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);
  }
739
  .col(@index, @list) when (@index =< @grid-columns) { // general
740
741
742
    @item: ~".col-@{class}-@{index}";
    .col(@index + 1, ~"@{list}, @{item}");
  }
743
  .col(@index, @list) when (@index > @grid-columns) { // terminal
744
745
746
747
748
749
750
    @{list} {
      float: left;
    }
  }
  .col(1); // kickstart it
}

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


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

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

// 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
834
835
836
837
838
839
840
841
842
843
844
845
846

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

ggam's avatar
ggam committed
848
849
850
851
  select& {
    height: @input-height;
    line-height: @input-height;
  }
852

ggam's avatar
ggam committed
853
854
855
856
  textarea& {
    height: auto;
  }
}