mixins.less 25.3 KB
Newer Older
1
2
3
//
// Mixins
// --------------------------------------------------
4

5

6
7
// Utilities
// -------------------------
8
9

// Clearfix
10
11
12
13
14
15
16
17
18
// Source: http://nicolasgallagher.com/micro-clearfix-hack/
//
// For modern browsers
// 1. The space content is one way to avoid an Opera bug when the
//    contenteditable attribute is included anywhere else in the document.
//    Otherwise it causes space to appear at the top and bottom of elements
//    that are clearfixed.
// 2. The use of `table` rather than `block` is only necessary if using
//    `:before` to contain the top-margins of child elements.
19
.clearfix() {
20
  &:before,
21
  &:after {
22
23
    content: " "; /* 1 */
    display: table; /* 2 */
24
25
  }
  &:after {
26
    clear: both;
27
  }
28
29
}

Mark Otto's avatar
Mark Otto committed
30
31
32
// Webkit-style focus
.tab-focus() {
  // Default
33
  outline: thin dotted #333;
Mark Otto's avatar
Mark Otto committed
34
35
36
37
38
  // Webkit
  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
196
197
198
199
200
201
202
.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;
}
.transform-origin(@origin){
  -webkit-transform-origin: @origin;
     -moz-transform-origin: @origin;
          transform-origin: @origin;
}


203
204
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
Chris Rebert's avatar
Chris Rebert committed
205
// Default value is `visible`, but can be changed to `hidden`
206
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
207
.backface-visibility(@visibility){
208
209
210
  -webkit-backface-visibility: @visibility;
     -moz-backface-visibility: @visibility;
          backface-visibility: @visibility;
211
212
}

213
214
215
216
217
218
219
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

220
221
222
223
224
// User select
// For selecting text on the page
.user-select(@select) {
  -webkit-user-select: @select;
     -moz-user-select: @select;
225
      -ms-user-select: @select; // IE10+
226
227
228
229
       -o-user-select: @select;
          user-select: @select;
}

230
// Resize anything
231
.resizable(@direction) {
232
233
234
235
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

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

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

256
// Opacity
257
.opacity(@opacity) {
258
259
  opacity: @opacity;
  // IE8 filter
260
  @opacity-ie: (@opacity * 100);
261
  filter: ~"alpha(opacity=@{opacity-ie})";
262
263
264
265
}



Mark Otto's avatar
Mark Otto committed
266
// GRADIENTS
267
268
// --------------------------------------------------

269
#gradient {
Mark Otto's avatar
Mark Otto committed
270
271
272
273
274

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

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

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

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

342

Mark Otto's avatar
Mark Otto committed
343

344
345
// Retina images
//
Mark Otto's avatar
Mark Otto committed
346
// Short retina mixin for setting background-image and -size
347

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

363

364
365
366
367
368
369
370
371
372
373
374
// 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
}


375
376
377
// COMPONENT MIXINS
// --------------------------------------------------

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

388
389
// Panels
// -------------------------
390
.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border;) {
391
  border-color: @border;
392
  & > .panel-heading {
393
394
395
    color: @heading-text-color;
    background-color: @heading-bg-color;
    border-color: @heading-border;
Mark Otto's avatar
Mark Otto committed
396
397
398
399
    + .panel-collapse .panel-body {
      border-top-color: @border;
    }
  }
400
  & > .panel-footer {
Mark Otto's avatar
Mark Otto committed
401
402
403
    + .panel-collapse .panel-body {
      border-bottom-color: @border;
    }
404
405
406
  }
}

Chris Rebert's avatar
Chris Rebert committed
407
408
// Alerts
// -------------------------
409
.alert-variant(@background; @border; @text-color) {
Chris Rebert's avatar
Chris Rebert committed
410
411
412
413
414
415
416
417
418
419
420
  background-color: @background;
  border-color: @border;
  color: @text-color;
  hr {
    border-top-color: darken(@border, 5%);
  }
  .alert-link {
    color: darken(@text-color, 10%);
  }
}

ggam's avatar
ggam committed
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
// 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;
      border-color: @border;
    }
  }
437

ggam's avatar
ggam committed
438
439
440
441
442
  // 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
443
444
    &.@{state}:hover > td,
    &.@{state}:hover > th {
ggam's avatar
ggam committed
445
446
447
448
449
450
      background-color: darken(@background, 5%);
      border-color: darken(@border, 5%);
    }
  }
}

451
// Button variants
452
453
454
// -------------------------
// Easily pump out default styles, as well as :hover, :focus, :active,
// and disabled options for all buttons
455
.button-variant(@color; @background; @border) {
456
  color: @color;
457
458
  background-color: @background;
  border-color: @border;
459

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

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

533
534
535
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
536
// 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
537
.navbar-vertical-align(@element-height) {
538
539
  margin-top: ((@navbar-height - @element-height) / 2);
  margin-bottom: ((@navbar-height - @element-height) / 2);
540
541
}

542
543
544
545
546
// Progress bars
// -------------------------
.progress-bar-variant(@color) {
  background-color: @color;
  .progress-striped & {
547
    #gradient > .striped();
548
549
550
  }
}

Mark Otto's avatar
Mark Otto committed
551
552
553
554
555
556
557
558
559
560
// 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; }
}

561
.responsive-invisibility() {
XhmikosR's avatar
XhmikosR committed
562
    &,
563
  tr&,
564
565
566
567
  th&,
  td& { display: none !important; }
}

568

569
570
571
// Grid System
// -----------

572
// Centered container element
573
574
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
575
  margin-left: auto;
576
577
  padding-left:  (@grid-gutter-width / 2);
  padding-right: (@grid-gutter-width / 2);
578
  .clearfix();
579
580
}

581
// Creates a wrapper for a series of columns
582
.make-row(@gutter: @grid-gutter-width) {
583
584
  margin-left:  (@gutter / -2);
  margin-right: (@gutter / -2);
585
  .clearfix();
586
}
Mark Otto's avatar
Mark Otto committed
587

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

  // Calculate width based on number of columns available
610
  @media (min-width: @screen-sm-min) {
611
    float: left;
612
613
    width: percentage((@columns / @grid-columns));
  }
614
}
Mark Otto's avatar
Mark Otto committed
615

616
// Generate the small column offsets
617
.make-sm-column-offset(@columns) {
618
  @media (min-width: @screen-sm-min) {
619
620
621
    margin-left: percentage((@columns / @grid-columns));
  }
}
622
.make-sm-column-push(@columns) {
623
  @media (min-width: @screen-sm-min) {
624
625
626
    left: percentage((@columns / @grid-columns));
  }
}
627
.make-sm-column-pull(@columns) {
628
  @media (min-width: @screen-sm-min) {
629
630
    right: percentage((@columns / @grid-columns));
  }
631
}
632

633
634
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
Bass Jobsen's avatar
Bass Jobsen committed
635
636
637
638
  position: relative;
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
639
640
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
Mark Otto's avatar
Mark Otto committed
641

Bass Jobsen's avatar
Bass Jobsen committed
642
  // Calculate width based on number of columns available
643
  @media (min-width: @screen-md-min) {
644
    float: left;
Bass Jobsen's avatar
Bass Jobsen committed
645
646
647
    width: percentage((@columns / @grid-columns));
  }
}
Mark Otto's avatar
Mark Otto committed
648

649
// Generate the medium column offsets
650
.make-md-column-offset(@columns) {
651
  @media (min-width: @screen-md-min) {
652
653
654
    margin-left: percentage((@columns / @grid-columns));
  }
}
655
.make-md-column-push(@columns) {
656
  @media (min-width: @screen-md) {
657
658
659
    left: percentage((@columns / @grid-columns));
  }
}
660
.make-md-column-pull(@columns) {
661
  @media (min-width: @screen-md-min) {
662
663
664
665
    right: percentage((@columns / @grid-columns));
  }
}

666
667
668
669
670
671
672
673
674
675
// 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
676
  @media (min-width: @screen-lg-min) {
677
678
679
680
681
682
683
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}

// Generate the large column offsets
.make-lg-column-offset(@columns) {
684
  @media (min-width: @screen-lg-min) {
685
686
687
688
    margin-left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-push(@columns) {
689
  @media (min-width: @screen-lg-min) {
690
691
692
693
    left: percentage((@columns / @grid-columns));
  }
}
.make-lg-column-pull(@columns) {
694
  @media (min-width: @screen-lg-min) {
695
696
697
698
    right: percentage((@columns / @grid-columns));
  }
}

Mark Otto's avatar
Mark Otto committed
699

700
701
702
703
704
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
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
// 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
774
775
776
777
778
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.

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

// 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
824
825
826
827
828
829
830
831
832
833
834
835
836

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

ggam's avatar
ggam committed
838
839
840
841
  select& {
    height: @input-height;
    line-height: @input-height;
  }
842

ggam's avatar
ggam committed
843
844
845
846
  textarea& {
    height: auto;
  }
}