mixins.less 25.7 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
452
453
// List Groups
// -------------------------
.list-group-item-variant(@state; @background; @border) {
454
  .list-group-item.@{state} {
455
456
457
458
459
    background-color: @background;
    border-color: @border;
  }

  // Hover states
460
  .list-group-item.@{state}:hover {
461
462
463
464
465
    background-color: darken(@background, 5%);
    border-color: darken(@border, 5%);
  }
}

466
// Button variants
467
468
469
// -------------------------
// Easily pump out default styles, as well as :hover, :focus, :active,
// and disabled options for all buttons
470
.button-variant(@color; @background; @border) {
471
  color: @color;
472
473
  background-color: @background;
  border-color: @border;
474

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

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

548
549
550
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
551
// 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
552
.navbar-vertical-align(@element-height) {
553
554
  margin-top: ((@navbar-height - @element-height) / 2);
  margin-bottom: ((@navbar-height - @element-height) / 2);
555
556
}

557
558
559
560
561
// Progress bars
// -------------------------
.progress-bar-variant(@color) {
  background-color: @color;
  .progress-striped & {
562
    #gradient > .striped();
563
564
565
  }
}

Mark Otto's avatar
Mark Otto committed
566
567
568
569
570
571
572
573
574
575
// 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; }
}

576
.responsive-invisibility() {
XhmikosR's avatar
XhmikosR committed
577
    &,
578
  tr&,
579
580
581
582
  th&,
  td& { display: none !important; }
}

583

584
585
586
// Grid System
// -----------

587
// Centered container element
588
589
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
590
  margin-left: auto;
591
592
  padding-left:  (@grid-gutter-width / 2);
  padding-right: (@grid-gutter-width / 2);
593
  .clearfix();
594
595
}

596
// Creates a wrapper for a series of columns
597
.make-row(@gutter: @grid-gutter-width) {
598
599
  margin-left:  (@gutter / -2);
  margin-right: (@gutter / -2);
600
  .clearfix();
601
}
Mark Otto's avatar
Mark Otto committed
602

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

  // Calculate width based on number of columns available
625
  @media (min-width: @screen-sm-min) {
626
    float: left;
627
628
    width: percentage((@columns / @grid-columns));
  }
629
}
Mark Otto's avatar
Mark Otto committed
630

631
// Generate the small column offsets
632
.make-sm-column-offset(@columns) {
633
  @media (min-width: @screen-sm-min) {
634
635
636
    margin-left: percentage((@columns / @grid-columns));
  }
}
637
.make-sm-column-push(@columns) {
638
  @media (min-width: @screen-sm-min) {
639
640
641
    left: percentage((@columns / @grid-columns));
  }
}
642
.make-sm-column-pull(@columns) {
643
  @media (min-width: @screen-sm-min) {
644
645
    right: percentage((@columns / @grid-columns));
  }
646
}
647

648
649
// Generate the medium columns
.make-md-column(@columns; @gutter: @grid-gutter-width) {
Bass Jobsen's avatar
Bass Jobsen committed
650
651
652
653
  position: relative;
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
654
655
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
Mark Otto's avatar
Mark Otto committed
656

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

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

681
682
683
684
685
686
687
688
689
690
// 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
691
  @media (min-width: @screen-lg-min) {
692
693
694
695
696
697
698
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}

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

Mark Otto's avatar
Mark Otto committed
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
782
783
784
785
786
787
788
// 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
789
790
791
792
793
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.

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

// 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
839
840
841
842
843
844
845
846
847
848
849
850
851

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

ggam's avatar
ggam committed
853
854
855
856
  select& {
    height: @input-height;
    line-height: @input-height;
  }
857

ggam's avatar
ggam committed
858
859
860
861
  textarea& {
    height: auto;
  }
}