mixins.less 22.5 KB
Newer Older
1
2
3
//
// Mixins
// --------------------------------------------------
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
20
    // Fixes Opera/contenteditable bug:
    // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
    line-height: 0;
21
22
  }
  &:after {
23
    clear: both;
24
  }
25
26
}

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

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

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

52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// 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;
  }
}

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

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

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

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

118

119
120
121
// FONTS
// --------------------------------------------------

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

153

154
// FORMS
155
156
// --------------------------------------------------

157
158
159
160
// Block level inputs
.input-block-level {
  display: block;
  width: 100%;
161
162
  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
163
164
165
}


166
167
168
169
170
171
172
173
174
// 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
175
176
  .checkbox,
  .radio,
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
  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;
  }
}



198
199
200
// CSS3 PROPERTIES
// --------------------------------------------------

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

208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
// 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
224
225
226
227
228
.border-bottom-left-radius(@radius) {
  -webkit-border-bottom-left-radius: @radius;
      -moz-border-radius-bottomleft: @radius;
          border-bottom-left-radius: @radius;
}
229
230
231
232
233
234
235
236

// 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
237
238
239
240
241
242
243
244
245
  .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);
246
247
}

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

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

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

299
300
301
302
// 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
303
.backface-visibility(@visibility){
304
	-webkit-backface-visibility: @visibility;
305
306
	   -moz-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
330
331
332
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

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

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

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

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

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



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

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

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

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

460

461
462
463
464

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

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

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

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

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

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

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

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

591
// Table columns
592
593
594
595
596
597
.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
}

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

// The Grid
611
612
613
614
#grid {

  .core (@gridColumnWidth, @gridGutterWidth) {

615
616
617
618
619
    .spanX (@index) when (@index > 0) {
      (~".span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}
620

621
622
623
    .offsetX (@index) when (@index > 0) {
      (~".offset@{index}") { .offset(@index); }
      .offsetX(@index - 1);
624
    }
625
    .offsetX (0) {}
626
627

    .offset (@columns) {
628
      margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
629
630
    }

631
632
633
634
    .span (@columns) {
      width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
    }

635
636
637
638
639
640
641
642
643
644
    .row {
      margin-left: @gridGutterWidth * -1;
      .clearfix();
    }

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

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

650
    // generate .spanX and .offsetX
651
652
    .spanX (@gridColumns);
    .offsetX (@gridColumns);
653
654
655
656
657

  }

  .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {

658
    .spanX (@index) when (@index > 0) {
659
      (~".span@{index}") { .span(@index); }
660
661
662
663
      .spanX(@index - 1);
    }
    .spanX (0) {}

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

    .offset (@columns) {
Marcus Schwab's avatar
Marcus Schwab committed
672
673
674
      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%);
    }
675

Marcus Schwab's avatar
Marcus Schwab committed
676
677
678
    .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
679
680
    }

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

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

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

  }

  .input(@gridColumnWidth, @gridGutterWidth) {

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

714
715
716
717
718
719
720
    .span(@columns) {
      width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 10;
    }

    input,
    textarea,
    .uneditable-input {
721
      margin-left: 0; // override margin-left from core grid system
722
723
    }

724
725
726
727
728
    // Space grid-sized controls properly if multiple per line
    .controls-row [class*="span"] + [class*="span"] {
      margin-left: @gridGutterWidth;
    }

729
730
731
    // generate .spanX
    .spanX (@gridColumns);

732
733
  }

734
}