mixins.less 22.3 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
// 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-right-radius(@radius) {
  -webkit-border-bottom-right-radius: @radius;
      -moz-border-radius-bottomright: @radius;
          border-bottom-right-radius: @radius;
}
Mark Otto's avatar
Mark Otto committed
221
222
223
224
225
.border-bottom-left-radius(@radius) {
  -webkit-border-bottom-left-radius: @radius;
      -moz-border-radius-bottomleft: @radius;
          border-bottom-left-radius: @radius;
}
226
227
228
229
230
231
232
233

// Single Side Border Radius
.border-top-radius(@radius) {
  .border-top-right-radius(@radius);
  .border-top-left-radius(@radius);
}
.border-right-radius(@radius) {
  .border-top-right-radius(@radius);
Mark Otto's avatar
Mark Otto committed
234
235
236
237
238
239
240
241
242
  .border-bottom-right-radius(@radius);
}
.border-bottom-radius(@radius) {
  .border-bottom-right-radius(@radius);
  .border-bottom-left-radius(@radius);
}
.border-left-radius(@radius) {
  .border-top-left-radius(@radius);
  .border-bottom-left-radius(@radius);
243
244
}

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
.transition(@transition) {
  -webkit-transition: @transition;
     -moz-transition: @transition;
       -o-transition: @transition;
          transition: @transition;
258
259
}

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

296
297
298
299
// 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
300
.backface-visibility(@visibility){
301
	-webkit-backface-visibility: @visibility;
302
303
	   -moz-backface-visibility: @visibility;
	        backface-visibility: @visibility;
304
305
}

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

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


323
324
325
326
327
328
329
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

330
331
332
333
334
// 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
335
      -ms-user-select: @select;
336
337
338
339
       -o-user-select: @select;
          user-select: @select;
}

340
// Resize anything
341
.resizable(@direction) {
342
343
344
345
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

346
// CSS3 Content Columns
347
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
348
349
  -webkit-column-count: @columnCount;
     -moz-column-count: @columnCount;
350
351
          column-count: @columnCount;
  -webkit-column-gap: @columnGap;
352
     -moz-column-gap: @columnGap;
353
          column-gap: @columnGap;
354
355
}

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

366
// Opacity
367
.opacity(@opacity) {
368
  opacity: @opacity / 100;
Alec Rust's avatar
Alec Rust committed
369
  filter: ~"alpha(opacity=@{opacity})";
370
371
372
373
374
375
376
}



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

377
378
379
380
// 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);
381
382
383
  }
  .border(@color: @white, @alpha: 1) {
    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
384
    .background-clip(padding-box);
385
  }
386
387
}

Mark Otto's avatar
Mark Otto committed
388
// Gradient Bar Colors for buttons and alerts
389
.gradientBar(@primaryColor, @secondaryColor) {
390
  #gradient > .vertical(@primaryColor, @secondaryColor);
391
392
393
394
  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%);
}

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

457

458
459
460
461

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

462
// Horizontal dividers
463
464
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
465
.nav-divider(@top: #e5e5e5, @bottom: @white) {
466
467
468
469
470
  // 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
471
472
  height: 1px;
  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
473
  *margin: -5px 0 5px;
Jacob Thornton's avatar
Jacob Thornton committed
474
  overflow: hidden;
475
476
  background-color: @top;
  border-bottom: 1px solid @bottom;
477
478
}

479
// Button backgrounds
480
// ------------------
481
482
483
.buttonBackground(@startColor, @endColor) {
  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
  .gradientBar(@startColor, @endColor);
484
  *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
485
  .reset-filter();
486
487

  // in these cases the gradient won't cover the background, so we override
488
  &:hover, &:active, &.active, &.disabled, &[disabled] {
489
    background-color: @endColor;
490
    *background-color: darken(@endColor, 5%);
491
492
493
494
495
496
497
498
499
  }

  // 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");
  }
}

500
501
502
503
504
505
506
507
508
// 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
509
// -------------------------
510
511
// For tipsies and popovers
#popoverArrow {
512
513
  .top(@arrowWidth: 10px, @color: rgba(0,0,0,.2)) {
    bottom: -@arrowWidth;
514
515
516
517
    left: 50%;
    margin-left: -@arrowWidth;
    border-left: @arrowWidth solid transparent;
    border-right: @arrowWidth solid transparent;
518
    border-top: @arrowWidth solid #ccc;
519
    border-top: @arrowWidth solid @color;
520
521
522
523
524
525
526
    &:after {
      border-left: @arrowWidth - 1 solid transparent;
      border-right: @arrowWidth - 1 solid transparent;
      border-top: @arrowWidth - 1 solid #fff;
      bottom: 1px;
      left: -@arrowWidth + 1;
    }
527
  }
528
  .right(@arrowWidth: 10px, @color: rgba(0,0,0,.2)) {
529
    top: 50%;
530
    left: -@arrowWidth;
531
532
533
    margin-top: -@arrowWidth;
    border-top: @arrowWidth solid transparent;
    border-bottom: @arrowWidth solid transparent;
534
535
536
537
538
539
540
541
542
    border-right: @arrowWidth solid #ccc;
    border-right: @arrowWidth solid @color;
    &:after {
      border-top: @arrowWidth - 1 solid transparent;
      border-bottom: @arrowWidth - 1 solid transparent;
      border-right: @arrowWidth - 1 solid #fff;
      bottom: -@arrowWidth + 1;
      left: 1px;
    }
543
  }
544
545
  .bottom(@arrowWidth: 10px, @color: rgba(0,0,0,.2)) {
    top: -@arrowWidth;
546
547
548
549
    left: 50%;
    margin-left: -@arrowWidth;
    border-left: @arrowWidth solid transparent;
    border-right: @arrowWidth solid transparent;
550
    border-bottom: @arrowWidth solid #ccc;
551
    border-bottom: @arrowWidth solid @color;
552
553
554
555
556
557
558
    &:after {
      border-left: @arrowWidth - 1 solid transparent;
      border-right: @arrowWidth - 1 solid transparent;
      border-bottom: @arrowWidth - 1 solid #f5f5f5;
      top: 1px;
      left: -@arrowWidth + 1;
    }
559
  }
560
  .left(@arrowWidth: 10px, @color: rgba(0,0,0,.2)) {
561
    top: 50%;
562
    right: -@arrowWidth;
563
564
565
    margin-top: -@arrowWidth;
    border-top: @arrowWidth solid transparent;
    border-bottom: @arrowWidth solid transparent;
566
567
568
569
570
571
572
573
574
    border-left: @arrowWidth solid #ccc;
    border-left: @arrowWidth solid @color;
    &:after {
      border-top: @arrowWidth - 1 solid transparent;
      border-bottom: @arrowWidth - 1 solid transparent;
      border-left: @arrowWidth - 1 solid #fff;
      bottom: -@arrowWidth + 1;
      right: 1px;
    }
575
576
  }
}
577
578
579
580

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

581
// Centered container element
582
583
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
584
  margin-left: auto;
585
586
587
  .clearfix();
}

588
// Table columns
589
590
591
592
593
594
.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
}

595
596
597
598
599
600
// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
  margin-left: @gridGutterWidth * -1;
  .clearfix();
}
601
.makeColumn(@columns: 1, @offset: 0) {
602
  float: left;
603
  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
604
605
606
607
  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}

// The Grid
608
609
610
611
#grid {

  .core (@gridColumnWidth, @gridGutterWidth) {

612
613
614
615
616
    .spanX (@index) when (@index > 0) {
      (~".span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}
617

618
619
620
    .offsetX (@index) when (@index > 0) {
      (~".offset@{index}") { .offset(@index); }
      .offsetX(@index - 1);
621
    }
622
    .offsetX (0) {}
623
624

    .offset (@columns) {
625
      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
626
627
    }

628
629
630
631
    .span (@columns) {
      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
    }

632
633
634
635
636
637
638
639
640
641
    .row {
      margin-left: @gridGutterWidth * -1;
      .clearfix();
    }

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

642
    // Set the container width, and override it for fixed navbars in media queries
643
644
645
    .container,
    .navbar-fixed-top .container,
    .navbar-fixed-bottom .container { .span(@gridColumns); }
646

647
    // generate .spanX and .offsetX
648
649
    .spanX (@gridColumns);
    .offsetX (@gridColumns);
650
651
652
653
654

  }

  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {

655
    .spanX (@index) when (@index > 0) {
656
      (~".span@{index}") { .span(@index); }
657
658
659
660
      .spanX(@index - 1);
    }
    .spanX (0) {}

Igor Rzegocki's avatar
Igor Rzegocki committed
661
    .offsetX (@index) when (@index > 0) {
Marcus Schwab's avatar
Marcus Schwab committed
662
663
      (~'.offset@{index}') { .offset(@index); }
      (~'.offset@{index}:first-child') { .offsetFirstChild(@index); }
Igor Rzegocki's avatar
Igor Rzegocki committed
664
665
666
667
668
      .offsetX(@index - 1);
    }
    .offsetX (0) {}

    .offset (@columns) {
Marcus Schwab's avatar
Marcus Schwab committed
669
670
671
      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
	  *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
    }
672

Marcus Schwab's avatar
Marcus Schwab committed
673
674
675
    .offsetFirstChild (@columns) {
      margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
      *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
Igor Rzegocki's avatar
Igor Rzegocki committed
676
677
    }

678
    .span (@columns) {
679
      width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
680
      *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
681
682
683
684
685
    }

    .row-fluid {
      width: 100%;
      .clearfix();
686
      [class*="span"] {
687
        .input-block-level();
688
689
        float: left;
        margin-left: @fluidGridGutterWidth;
690
        *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
691
      }
692
      [class*="span"]:first-child {
693
694
        margin-left: 0;
      }
695

Igor Rzegocki's avatar
Igor Rzegocki committed
696
      // generate .spanX and .offsetX
697
      .spanX (@gridColumns);
Igor Rzegocki's avatar
Igor Rzegocki committed
698
      .offsetX (@gridColumns);
699
700
701
702
703
704
    }

  }

  .input(@gridColumnWidth, @gridGutterWidth) {

705
706
707
708
709
710
    .spanX (@index) when (@index > 0) {
      (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

711
712
713
714
715
716
717
    .span(@columns) {
      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 10;
    }

    input,
    textarea,
    .uneditable-input {
718
      margin-left: 0; // override margin-left from core grid system
719
720
    }

721
722
723
    // generate .spanX
    .spanX (@gridColumns);

724
725
  }

726
}