mixins.less 20.9 KB
Newer Older
1
2
3
// Mixins.less
// Snippets of reusable CSS to develop faster and keep code readable
// -----------------------------------------------------------------
4

5

6
7
8
9
// UTILITY MIXINS
// --------------------------------------------------

// Clearfix
Mark Otto's avatar
Mark Otto committed
10
// --------
11
// For clearing floats like a boss h5bp.com/q
12
.clearfix {
13
  *zoom: 1;
14
  &:before,
15
  &:after {
16
17
    display: table;
    content: "";
18
19
  }
  &:after {
20
    clear: both;
21
  }
22
23
}

Mark Otto's avatar
Mark Otto committed
24
25
26
27
// Webkit-style focus
// ------------------
.tab-focus() {
  // Default
28
  outline: thin dotted #333;
Mark Otto's avatar
Mark Otto committed
29
30
31
32
33
  // Webkit
  outline: 5px auto -webkit-focus-ring-color;
  outline-offset: -2px;
}

34
// Center-align a block level element
Mark Otto's avatar
Mark Otto committed
35
// ----------------------------------
36
.center-block() {
37
  display: block;
38
39
  margin-left: auto;
  margin-right: auto;
40
41
}

42
// IE7 inline-block
Mark Otto's avatar
Mark Otto committed
43
// ----------------
44
45
46
47
48
.ie7-inline-block() {
  *display: inline; /* IE7 inline-block hack */
  *zoom: 1;
}

49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// IE7 likes to collapse whitespace on either side of the inline-block elements.
// Ems because we're attempting to match the width of a space character. Left
// version is for form buttons, which typically come after other elements, and
// right version is for icons, which come before. Applying both is ok, but it will
// mean that space between those elements will be .6em (~2 space characters) in IE7,
// instead of the 1 space in other browsers.
.ie7-restore-left-whitespace() {
  *margin-left: .3em;

  &:first-child {
    *margin-left: 0;
  }
}

.ie7-restore-right-whitespace() {
  *margin-right: .3em;

  &:last-child {
    *margin-left: 0;
  }
}

71
// Sizing shortcuts
72
// -------------------------
73
.size(@height, @width) {
74
  width: @width;
75
  height: @height;
76
}
77
.square(@size) {
78
  .size(@size, @size);
79
80
}

81
82
// Placeholder text
// -------------------------
83
.placeholder(@color: @placeholderText) {
84
  &:-moz-placeholder {
85
86
    color: @color;
  }
87
  &:-ms-input-placeholder {
88
89
    color: @color;
  }
90
  &::-webkit-input-placeholder {
91
92
93
94
    color: @color;
  }
}

Mark Otto's avatar
Mark Otto committed
95
96
97
98
99
100
101
102
103
// Text overflow
// -------------------------
// Requires inline-block or block for proper styling
.text-overflow() {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

104
// CSS image replacement
105
// -------------------------
106
// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
107
.hide-text {
108
109
  font: 0/0 a;
  color: transparent;
110
  text-shadow: none;
111
  background-color: transparent;
112
  border: 0;
113
}
114

115

116
117
118
// FONTS
// --------------------------------------------------

119
#font {
120
121
  #family {
    .serif() {
122
      font-family: @serifFontFamily;
123
124
    }
    .sans-serif() {
125
      font-family: @sansFontFamily;
126
127
    }
    .monospace() {
128
      font-family: @monoFontFamily;
129
    }
130
  }
131
  .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
132
133
134
135
    font-size: @size;
    font-weight: @weight;
    line-height: @lineHeight;
  }
136
137
138
  .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .serif;
    #font > .shorthand(@size, @weight, @lineHeight);
139
  }
140
141
142
143
144
145
146
  .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .sans-serif;
    #font > .shorthand(@size, @weight, @lineHeight);
  }
  .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
    #font > #family > .monospace;
    #font > .shorthand(@size, @weight, @lineHeight);
147
148
149
  }
}

150

151
// FORMS
152
153
// --------------------------------------------------

154
155
156
157
// Block level inputs
.input-block-level {
  display: block;
  width: 100%;
158
159
  min-height: 28px;        // Make inputs at least the height of their button counterpart
  .box-sizing(border-box); // Makes inputs behave like true block-level elements
160
161
162
}


163
164
165
166
167
168
169
170
171
// Mixin for form field states
.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
  // Set the text color
  > label,
  .help-block,
  .help-inline {
    color: @textColor;
  }
  // Style inputs accordingly
Mark Otto's avatar
Mark Otto committed
172
173
  .checkbox,
  .radio,
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
  input,
  select,
  textarea {
    color: @textColor;
    border-color: @borderColor;
    &:focus {
      border-color: darken(@borderColor, 10%);
      .box-shadow(0 0 6px lighten(@borderColor, 20%));
    }
  }
  // Give a small background color for input-prepend/-append
  .input-prepend .add-on,
  .input-append .add-on {
    color: @textColor;
    background-color: @backgroundColor;
    border-color: @textColor;
  }
}



195
196
197
// CSS3 PROPERTIES
// --------------------------------------------------

198
// Border Radius
199
.border-radius(@radius) {
Mark Otto's avatar
Mark Otto committed
200
201
202
  -webkit-border-radius: @radius;
     -moz-border-radius: @radius;
          border-radius: @radius;
203
204
}

205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
// Single Corner Border Radius
.border-top-left-radius(@radius) {
  -webkit-border-top-left-radius: @radius;
      -moz-border-radius-topleft: @radius;
          border-top-left-radius: @radius;
}
.border-top-right-radius(@radius) {
  -webkit-border-top-right-radius: @radius;
      -moz-border-radius-topright: @radius;
          border-top-right-radius: @radius;
}
.border-bottom-left-radius(@radius) {
  -webkit-border-bottom-left-radius: @radius;
      -moz-border-radius-bottomleft: @radius;
          border-bottom-left-radius: @radius;
}
.border-bottom-right-radius(@radius) {
  -webkit-border-bottom-right-radius: @radius;
      -moz-border-radius-bottomright: @radius;
          border-bottom-right-radius: @radius;
}

// Single Side Border Radius
.border-bottom-radius(@radius) {
  .border-bottom-right-radius(@radius);
  .border-bottom-left-radius(@radius);
}
.border-top-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-top-left-radius(@radius);
}
.border-left-radius(@radius) {
  .border-top-left-radius(@radius);
  .border-bottom-left-radius(@radius);	
}
.border-right-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-bottom-right-radius(@radius);	
}

245
// Drop shadows
246
.box-shadow(@shadow) {
Mark Otto's avatar
Mark Otto committed
247
248
249
  -webkit-box-shadow: @shadow;
     -moz-box-shadow: @shadow;
          box-shadow: @shadow;
250
251
252
}

// Transitions
Mark Otto's avatar
Mark Otto committed
253
254
255
256
257
258
.transition(@transition) {
  -webkit-transition: @transition;
     -moz-transition: @transition;
      -ms-transition: @transition;
       -o-transition: @transition;
          transition: @transition;
259
260
}

Mark Otto's avatar
Mark Otto committed
261
// Transformations
262
.rotate(@degrees) {
263
264
  -webkit-transform: rotate(@degrees);
     -moz-transform: rotate(@degrees);
Mark Otto's avatar
Mark Otto committed
265
266
      -ms-transform: rotate(@degrees);
       -o-transform: rotate(@degrees);
267
268
          transform: rotate(@degrees);
}
269
270
271
272
273
274
.scale(@ratio) {
  -webkit-transform: scale(@ratio);
     -moz-transform: scale(@ratio);
      -ms-transform: scale(@ratio);
       -o-transform: scale(@ratio);
          transform: scale(@ratio);
275
}
276
.translate(@x, @y) {
Mark Otto's avatar
Mark Otto committed
277
278
279
280
281
282
  -webkit-transform: translate(@x, @y);
     -moz-transform: translate(@x, @y);
      -ms-transform: translate(@x, @y);
       -o-transform: translate(@x, @y);
          transform: translate(@x, @y);
}
283
.skew(@x, @y) {
Mark Otto's avatar
Mark Otto committed
284
285
286
287
288
289
  -webkit-transform: skew(@x, @y);
     -moz-transform: skew(@x, @y);
      -ms-transform: skew(@x, @y);
       -o-transform: skew(@x, @y);
          transform: skew(@x, @y);
}
290
.translate3d(@x, @y, @z) {
291
292
293
294
295
296
  -webkit-transform: translate(@x, @y, @z);
     -moz-transform: translate(@x, @y, @z);
      -ms-transform: translate(@x, @y, @z);
       -o-transform: translate(@x, @y, @z);
          transform: translate(@x, @y, @z);
}
297

298
299
300
301
// Backface visibility
// Prevent browsers from flickering when using CSS 3D transforms.
// Default value is `visible`, but can be changed to `hidden
// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
302
.backface-visibility(@visibility){
303
	-webkit-backface-visibility: @visibility;
304
305
306
	   -moz-backface-visibility: @visibility;
	    -ms-backface-visibility: @visibility;
	        backface-visibility: @visibility;
307
308
}

309
// Background clipping
310
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
Mark Otto's avatar
Mark Otto committed
311
312
313
314
.background-clip(@clip) {
  -webkit-background-clip: @clip;
     -moz-background-clip: @clip;
          background-clip: @clip;
315
316
}

317
// Background sizing
Mark Otto's avatar
Mark Otto committed
318
319
320
321
322
.background-size(@size){
  -webkit-background-size: @size;
     -moz-background-size: @size;
       -o-background-size: @size;
          background-size: @size;
323
324
325
}


326
327
328
329
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
330
      -ms-box-sizing: @boxmodel;
331
332
333
          box-sizing: @boxmodel;
}

334
335
336
337
338
// User select
// For selecting text on the page
.user-select(@select) {
  -webkit-user-select: @select;
     -moz-user-select: @select;
Han Lin Yap's avatar
Han Lin Yap committed
339
      -ms-user-select: @select;
340
341
342
343
       -o-user-select: @select;
          user-select: @select;
}

344
// Resize anything
345
.resizable(@direction) {
346
347
348
349
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

350
// CSS3 Content Columns
351
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
352
353
  -webkit-column-count: @columnCount;
     -moz-column-count: @columnCount;
354
355
          column-count: @columnCount;
  -webkit-column-gap: @columnGap;
356
     -moz-column-gap: @columnGap;
357
          column-gap: @columnGap;
358
359
}

Synchro's avatar
Synchro committed
360
361
// Optional hyphenation
.hyphens(@mode: auto) {
Mark Otto's avatar
Mark Otto committed
362
  word-wrap: break-word;
Synchro's avatar
Synchro committed
363
364
365
  -webkit-hyphens: @mode;
     -moz-hyphens: @mode;
      -ms-hyphens: @mode;
Synchro's avatar
Synchro committed
366
       -o-hyphens: @mode;
Synchro's avatar
Synchro committed
367
368
369
          hyphens: @mode;
}

370
// Opacity
371
.opacity(@opacity) {
372
  opacity: @opacity / 100;
Alec Rust's avatar
Alec Rust committed
373
  filter: ~"alpha(opacity=@{opacity})";
374
375
376
377
378
379
380
}



// BACKGROUNDS
// --------------------------------------------------

381
382
383
384
// Add an alphatransparency value to any background or border color (via Elyse Holladay)
#translucent {
  .background(@color: @white, @alpha: 1) {
    background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
385
386
387
  }
  .border(@color: @white, @alpha: 1) {
    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
388
    .background-clip(padding-box);
389
  }
390
391
}

Mark Otto's avatar
Mark Otto committed
392
// Gradient Bar Colors for buttons and alerts
393
.gradientBar(@primaryColor, @secondaryColor) {
394
  #gradient > .vertical(@primaryColor, @secondaryColor);
395
396
397
398
  border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
  border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
}

399
400
// Gradients
#gradient {
401
  .horizontal(@startColor: #555, @endColor: #333) {
402
403
404
    background-color: @endColor;
    background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
    background-image: -ms-linear-gradient(left, @startColor, @endColor); // IE10
405
    background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
406
407
408
    background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(left, @startColor, @endColor); // Le standard
409
    background-repeat: repeat-x;
410
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",@startColor,@endColor)); // IE9 and down
411
  }
412
  .vertical(@startColor: #555, @endColor: #333) {
413
    background-color: mix(@startColor, @endColor, 60%);
Mark Otto's avatar
Mark Otto committed
414
415
    background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
    background-image: -ms-linear-gradient(top, @startColor, @endColor); // IE10
416
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
Mark Otto's avatar
Mark Otto committed
417
418
419
    background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(top, @startColor, @endColor); // The standard
420
    background-repeat: repeat-x;
421
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@startColor,@endColor)); // IE9 and down
422
  }
423
  .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
424
425
    background-color: @endColor;
    background-repeat: repeat-x;
426
427
428
429
430
    background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
    background-image: -ms-linear-gradient(@deg, @startColor, @endColor); // IE10
    background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
    background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
    background-image: linear-gradient(@deg, @startColor, @endColor); // The standard
431
  }
sankage's avatar
sankage committed
432
  .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
433
    background-color: mix(@midColor, @endColor, 80%);
434
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
sankage's avatar
sankage committed
435
    background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
Mark Otto's avatar
Mark Otto committed
436
    background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
sankage's avatar
sankage committed
437
438
439
    background-image: -ms-linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
    background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
440
    background-repeat: no-repeat;
441
    filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",@startColor,@endColor)); // IE9 and down, gets no color-stop at all for proper fallback
442
  }
443
  .radial(@innerColor: #555, @outerColor: #333)  {
444
445
446
447
448
    background-color: @outerColor;
    background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
    background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
    background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
    background-image: -ms-radial-gradient(circle, @innerColor, @outerColor);
449
    background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
450
451
    background-repeat: no-repeat;
  }
452
  .striped(@color, @angle: -45deg) {
Piotrek Okoński's avatar
Piotrek Okoński committed
453
    background-color: @color;
454
455
456
457
458
459
    background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
    background-image: -webkit-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -moz-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -ms-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: -o-linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
    background-image: linear-gradient(@angle, rgba(255,255,255,.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,.15) 50%, rgba(255,255,255,.15) 75%, transparent 75%, transparent);
Piotrek Okoński's avatar
Piotrek Okoński committed
460
  }
461
}
462
463
// Reset filters for IE
.reset-filter() {
464
  filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
465
}
466

467

468
469
470
471

// COMPONENT MIXINS
// --------------------------------------------------

472
// Horizontal dividers
473
474
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
475
.nav-divider(@top: #e5e5e5, @bottom: @white) {
476
477
478
479
480
  // IE7 needs a set width since we gave a height. Restricting just
  // to IE7 to keep the 1px left/right space in other browsers.
  // It is unclear where IE is getting the extra space that we need
  // to negative-margin away, but so it goes.
  *width: 100%;
Jacob Thornton's avatar
Jacob Thornton committed
481
482
  height: 1px;
  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
483
  *margin: -5px 0 5px;
Jacob Thornton's avatar
Jacob Thornton committed
484
  overflow: hidden;
485
486
  background-color: @top;
  border-bottom: 1px solid @bottom;
487
488
}

489
// Button backgrounds
490
// ------------------
491
492
493
.buttonBackground(@startColor, @endColor) {
  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
  .gradientBar(@startColor, @endColor);
494
  *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
Jacob Thornton's avatar
Jacob Thornton committed
495
  .reset-filter();
496
497

  // in these cases the gradient won't cover the background, so we override
498
  &:hover, &:active, &.active, &.disabled, &[disabled] {
499
    background-color: @endColor;
500
    *background-color: darken(@endColor, 5%);
501
502
503
504
505
506
507
508
509
  }

  // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
  &:active,
  &.active {
    background-color: darken(@endColor, 10%) e("\9");
  }
}

510
511
512
513
514
515
516
517
518
// Navbar vertical align
// -------------------------
// Vertically center elements in the navbar.
// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
.navbarVerticalAlign(@elementHeight) {
  margin-top: (@navbarHeight - @elementHeight) / 2;
}

// Popover arrows
519
// -------------------------
520
521
// For tipsies and popovers
#popoverArrow {
522
  .top(@arrowWidth: 5px, @color: @black) {
523
524
525
526
527
    bottom: 0;
    left: 50%;
    margin-left: -@arrowWidth;
    border-left: @arrowWidth solid transparent;
    border-right: @arrowWidth solid transparent;
528
    border-top: @arrowWidth solid @color;
529
  }
530
  .left(@arrowWidth: 5px, @color: @black) {
531
532
533
534
535
    top: 50%;
    right: 0;
    margin-top: -@arrowWidth;
    border-top: @arrowWidth solid transparent;
    border-bottom: @arrowWidth solid transparent;
536
    border-left: @arrowWidth solid @color;
537
  }
538
  .bottom(@arrowWidth: 5px, @color: @black) {
539
540
541
542
543
    top: 0;
    left: 50%;
    margin-left: -@arrowWidth;
    border-left: @arrowWidth solid transparent;
    border-right: @arrowWidth solid transparent;
544
    border-bottom: @arrowWidth solid @color;
545
  }
546
  .right(@arrowWidth: 5px, @color: @black) {
547
548
549
550
551
    top: 50%;
    left: 0;
    margin-top: -@arrowWidth;
    border-top: @arrowWidth solid transparent;
    border-bottom: @arrowWidth solid transparent;
552
    border-right: @arrowWidth solid @color;
553
554
  }
}
555
556
557
558

// Grid System
// -----------

559
// Centered container element
560
561
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
562
  margin-left: auto;
563
564
565
  .clearfix();
}

566
// Table columns
567
568
569
570
571
572
.tableColumns(@columnSpan: 1) {
  float: none; // undo default grid column styles
  width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
  margin-left: 0; // undo default grid column styles
}

573
574
575
576
577
578
// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
  margin-left: @gridGutterWidth * -1;
  .clearfix();
}
579
.makeColumn(@columns: 1, @offset: 0) {
580
  float: left;
581
  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
582
583
584
585
  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}

// The Grid
586
587
588
589
#grid {

  .core (@gridColumnWidth, @gridGutterWidth) {

590
591
592
593
594
    .spanX (@index) when (@index > 0) {
      (~".span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}
595

596
597
598
    .offsetX (@index) when (@index > 0) {
      (~".offset@{index}") { .offset(@index); }
      .offsetX(@index - 1);
599
    }
600
    .offsetX (0) {}
601
602

    .offset (@columns) {
603
      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
604
605
    }

606
607
608
609
    .span (@columns) {
      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
    }

610
611
612
613
614
615
616
617
618
619
    .row {
      margin-left: @gridGutterWidth * -1;
      .clearfix();
    }

    [class*="span"] {
      float: left;
      margin-left: @gridGutterWidth;
    }

620
    // Set the container width, and override it for fixed navbars in media queries
621
622
    .container,
    .navbar-fixed-top .container,
623
624
    .navbar-fixed-bottom .container { .span(@gridColumns); }

625
    // generate .spanX and .offsetX
626
627
    .spanX (@gridColumns);
    .offsetX (@gridColumns);
628
629
630
631
632

  }

  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {

633
    .spanX (@index) when (@index > 0) {
634
      (~".span@{index}") { .span(@index); }
635
636
637
638
      .spanX(@index - 1);
    }
    .spanX (0) {}

639
    .span (@columns) {
640
      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
641
      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
642
643
644
645
646
    }

    .row-fluid {
      width: 100%;
      .clearfix();
647
      [class*="span"] {
648
        .input-block-level();
649
650
        float: left;
        margin-left: @fluidGridGutterWidth;
651
        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
652
      }
653
      [class*="span"]:first-child {
654
655
        margin-left: 0;
      }
656

657
      // generate .spanX
658
      .spanX (@gridColumns);
659
660
661
662
663
664
    }

  }

  .input(@gridColumnWidth, @gridGutterWidth) {

665
666
667
668
669
670
    .spanX (@index) when (@index > 0) {
      (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

671
672
673
674
675
676
677
    .span(@columns) {
      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 10;
    }

    input,
    textarea,
    .uneditable-input {
678
      margin-left: 0; // override margin-left from core grid system
679
680
    }

681
682
683
    // generate .spanX
    .spanX (@gridColumns);

684
685
  }

686
}