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
  outline: thin dotted #333;
Chris Rebert's avatar
Chris Rebert committed
34
  // WebKit
Mark Otto's avatar
Mark Otto committed
35
36
37
38
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}

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

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

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

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

71
// CSS image replacement
72
73
74
//
// 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
75
76
// 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.
77
//
78
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
79

80
81
82
83
84
85
86
87
88
// 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
89
.text-hide() {
90
  font: ~"0/0" a;
91
  color: transparent;
92
  text-shadow: none;
93
  background-color: transparent;
94
  border: 0;
95
}
96

97

98

99
100
101
// CSS3 PROPERTIES
// --------------------------------------------------

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

  // 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.
279
  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
Mark Otto's avatar
Mark Otto committed
280
281
282
283
    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
284
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
285
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down
286
  }
Mark Otto's avatar
Mark Otto committed
287
288
289
290
291

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

301
  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
302
    background-repeat: repeat-x;
Mark Otto's avatar
Mark Otto committed
303
304
305
    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
306
  }
307
  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
Mark Otto's avatar
Mark Otto committed
308
309
310
311
    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
312
    background-repeat: no-repeat;
Mark Otto's avatar
Mark Otto committed
313
    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
314
  }
315
  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
Mark Otto's avatar
Mark Otto committed
316
317
318
319
    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);
320
    background-repeat: no-repeat;
Mark Otto's avatar
Mark Otto committed
321
    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
322
  }
323
  .radial(@inner-color: #555; @outer-color: #333) {
Mark Otto's avatar
Mark Otto committed
324
325
326
327
    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);
328
329
    background-repeat: no-repeat;
  }
330
331
332
333
334
  .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
335
  }
336
}
Mark Otto's avatar
Mark Otto committed
337

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

346

Mark Otto's avatar
Mark Otto committed
347

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

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

367

368
369
370
371
372
373
374
375
376
377
378
// 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
}


379
380
381
// COMPONENT MIXINS
// --------------------------------------------------

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

576

577
578
579
// Grid System
// -----------

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

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

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

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

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

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

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

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

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

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

Mark Otto's avatar
Mark Otto committed
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
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
// Framework grid generation
//
// Used only by Bootstrap to generate the correct number of grid classes given
// any value of `@grid-columns`.

.make-grid-columns() {
  // Common styles for all sizes of grid columns, widths 1-12
  .col(@index) when (@index = 1) { // initial
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    .col(@index + 1, @item);
  }
  .col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo
    @item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}";
    .col(@index + 1, ~"@{list}, @{item}");
  }
  .col(@index, @list) when (@index > @grid-columns) { // terminal
    @{list} {
      position: relative;
      // Prevent columns from collapsing when empty
      min-height: 1px;
      // Inner gutter via padding
      padding-left:  (@grid-gutter-width / 2);
      padding-right: (@grid-gutter-width / 2);
    }
  }
  .col(1); // kickstart it
}

.make-grid-columns-float(@class) {
  .col(@index) when (@index = 1) { // initial
    @item: ~".col-@{class}-@{index}";
    .col(@index + 1, @item);
  }
  .col(@index, @list) when (@index < @grid-columns) { // general
    @item: ~".col-@{class}-@{index}";
    .col(@index + 1, ~"@{list}, @{item}");
  }
  .col(@index, @list) when (@index = @grid-columns) { // terminal
    @{list} {
      float: left;
    }
  }
  .col(1); // kickstart it
}

.calc-grid(@index, @class, @type) when (@type = width) {
  .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
.make-grid(@index, @class, @type) when (@index > 0) {
  .calc-grid(@index, @class, @type);
  // next iteration
  .make-grid(@index - 1, @class, @type);
}


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

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

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

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

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

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