mixins.less 25.5 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
    background-image: -webkit-gradient(linear, left @start-percent, left @end-percent, from(@start-color), to(@end-color)); // Safari 4+, Chrome 2+
290
    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
291
292
    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;
Mark Otto's avatar
spacing    
Mark Otto committed
392

393
  & > .panel-heading {
394
395
396
    color: @heading-text-color;
    background-color: @heading-bg-color;
    border-color: @heading-border;
Mark Otto's avatar
spacing    
Mark Otto committed
397

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

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

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

ggam's avatar
ggam committed
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
// 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;
    }
  }
443

ggam's avatar
ggam committed
444
445
446
447
448
  // 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
449
450
    &.@{state}:hover > td,
    &.@{state}:hover > th {
ggam's avatar
ggam committed
451
452
453
454
455
456
      background-color: darken(@background, 5%);
      border-color: darken(@border, 5%);
    }
  }
}

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

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

ggam's avatar
ggam committed
494
495
496
497
498
499
500
501
502
// Button sizes
// -------------------------
.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
  padding: @padding-vertical @padding-horizontal;
  font-size: @font-size;
  line-height: @line-height;
  border-radius: @border-radius;
}

ggam's avatar
ggam committed
503
504
// Pagination
// -------------------------
Guillermo González de Agüero's avatar
Guillermo González de Agüero committed
505
.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {
ggam's avatar
ggam committed
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
  > li {
    > a,
    > span {
      padding: @padding-vertical @padding-horizontal;
      font-size: @font-size;
    }
    &:first-child {
      > a,
      > span {
        .border-left-radius(@border-radius);
      }
    }
    &:last-child {
      > a,
      > span {
        .border-right-radius(@border-radius);
      }
    }
  }
}

Chris Rebert's avatar
Chris Rebert committed
527
528
529
530
531
532
533
534
535
536
537
538
// Labels
// -------------------------
.label-variant(@color) {
  background-color: @color;
  &[href] {
    &:hover,
    &:focus {
      background-color: darken(@color, 10%);
    }
  }
}

539
540
541
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
542
// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
Mark Otto's avatar
Mark Otto committed
543
.navbar-vertical-align(@element-height) {
544
545
  margin-top: ((@navbar-height - @element-height) / 2);
  margin-bottom: ((@navbar-height - @element-height) / 2);
546
547
}

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

Mark Otto's avatar
Mark Otto committed
557
558
559
560
561
562
563
564
565
566
// Responsive utilities
// -------------------------
// More easily include all the states for responsive-utilities.less.
.responsive-visibility() {
  display: block !important;
  tr& { display: table-row !important; }
  th&,
  td& { display: table-cell !important; }
}

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

574

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

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

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

594
595
// Generate the extra small columns
.make-xs-column(@columns; @gutter: @grid-gutter-width) {
596
597
  position: relative;
  float: left;
598
  width: percentage((@columns / @grid-columns));
599
600
601
602
603
604
605
606
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
}

// Generate the small columns
607
.make-sm-column(@columns; @gutter: @grid-gutter-width) {
608
  position: relative;
609
610
  // Prevent columns from collapsing when empty
  min-height: 1px;
611
  // Inner gutter via padding
612
613
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);
614
615

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

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

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

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

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

672
673
674
675
676
677
678
679
680
681
// Generate the large columns
.make-lg-column(@columns; @gutter: @grid-gutter-width) {
  position: relative;
  // Prevent columns from collapsing when empty
  min-height: 1px;
  // Inner gutter via padding
  padding-left:  (@gutter / 2);
  padding-right: (@gutter / 2);

  // Calculate width based on number of columns available
682
  @media (min-width: @screen-lg-min) {
683
684
685
686
687
688
689
    float: left;
    width: percentage((@columns / @grid-columns));
  }
}

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

Mark Otto's avatar
Mark Otto committed
705

706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
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
// 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
780
781
782
783
784
// Form validation states
//
// Used in forms.less to generate the form validation CSS for warnings, errors,
// and successes.

785
.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {
Mark Otto's avatar
Mark Otto committed
786
  // Color the label and help text
787
  .help-block,
788
789
790
791
792
  .control-label,
  .radio,
  .checkbox,
  .radio-inline,
  .checkbox-inline  {
Mark Otto's avatar
Mark Otto committed
793
794
795
    color: @text-color;
  }
  // Set the border and box shadow on specific inputs to match
Mark Otto's avatar
Mark Otto committed
796
  .form-control {
Mark Otto's avatar
Mark Otto committed
797
798
799
800
801
802
803
804
    border-color: @border-color;
    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
    &:focus {
      border-color: darken(@border-color, 10%);
      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);
      .box-shadow(@shadow);
    }
  }
805
806
807
808
809
  // Set validation states also for addons
  .input-group-addon {
    color: @text-color;
    border-color: @border-color;
    background-color: @background-color;
Mark Otto's avatar
Mark Otto committed
810
  }
Mark Otto's avatar
Mark Otto committed
811
}
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833

// Form control focus state
//
// Generate a customized focus state and for any input with the specified color,
// which defaults to the `@input-focus-border` variable.
//
// We highly encourage you to not customize the default value, but instead use
// this to tweak colors on an as-needed basis. This aesthetic change is based on
// WebKit's default styles, but applicable to a wider range of browsers. Its
// usability and accessibility should be taken into account with any change.
//
// Example usage: change the default blue border and shadow to white for better
// contrast against a dark gray background.

.form-control-focus(@color: @input-border-focus) {
  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);
  &:focus {
    border-color: @color;
    outline: 0;
    .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}");
  }
}
ggam's avatar
ggam committed
834
835
836
837
838
839
840
841
842
843
844
845
846

// Form control sizing
//
// Relative text size, padding, and border-radii changes for form controls. For
// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
// element gets special love because it's special, and that's a fact!

.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
  height: @input-height;
  padding: @padding-vertical @padding-horizontal;
  font-size: @font-size;
  line-height: @line-height;
  border-radius: @border-radius;
847

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

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