mixins.less 19.6 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
// 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;
}

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

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

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

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

114

115
116
117
// FONTS
// --------------------------------------------------

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

149

150
// FORMS
151
152
// --------------------------------------------------

153
154
155
156
// Block level inputs
.input-block-level {
  display: block;
  width: 100%;
157
  min-height: 30px;        // Make inputs at least the height of their button counterpart
158
  .box-sizing(border-box); // Makes inputs behave like true block-level elements
159
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
  input,
175
176
177
  select,
  textarea {
    color: @textColor;
178
179
180
181
  }
  input,
  select,
  textarea {
182
    border-color: @borderColor;
183
    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
184
185
    &:focus {
      border-color: darken(@borderColor, 10%);
186
      .box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%));
187
188
189
190
191
192
193
194
195
196
197
198
199
    }
  }
  // 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;
  }
}



200
201
202
// CSS3 PROPERTIES
// --------------------------------------------------

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

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

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

250
// Drop shadows
251
.box-shadow(@shadowA, @shadowB:X, ...){
252
  // Multiple shadow solution from http://toekneestuck.com/blog/2012/05/15/less-css-arguments-variable/
253
254
255
256
  @props: ~`"@{arguments}".replace(/[\[\]]|\,\sX/g, '')`;
  -webkit-box-shadow: @props;
     -moz-box-shadow: @props;
          box-shadow: @props;
257
258
259
}

// Transitions
Mark Otto's avatar
Mark Otto committed
260
261
262
263
264
.transition(@transition) {
  -webkit-transition: @transition;
     -moz-transition: @transition;
       -o-transition: @transition;
          transition: @transition;
265
}
Tunghsiao Liu's avatar
Tunghsiao Liu committed
266
267
268
269
270
271
.transition-delay(@transition-delay) {
  -webkit-transition-delay: @transition-delay;
     -moz-transition-delay: @transition-delay;
       -o-transition-delay: @transition-delay;
          transition-delay: @transition-delay;
}
272

Mark Otto's avatar
Mark Otto committed
273
// Transformations
274
.rotate(@degrees) {
275
276
  -webkit-transform: rotate(@degrees);
     -moz-transform: rotate(@degrees);
Mark Otto's avatar
Mark Otto committed
277
278
      -ms-transform: rotate(@degrees);
       -o-transform: rotate(@degrees);
279
280
          transform: rotate(@degrees);
}
281
282
283
284
285
286
.scale(@ratio) {
  -webkit-transform: scale(@ratio);
     -moz-transform: scale(@ratio);
      -ms-transform: scale(@ratio);
       -o-transform: scale(@ratio);
          transform: scale(@ratio);
287
}
288
.translate(@x, @y) {
Mark Otto's avatar
Mark Otto committed
289
290
291
292
293
294
  -webkit-transform: translate(@x, @y);
     -moz-transform: translate(@x, @y);
      -ms-transform: translate(@x, @y);
       -o-transform: translate(@x, @y);
          transform: translate(@x, @y);
}
295
.skew(@x, @y) {
Mark Otto's avatar
Mark Otto committed
296
297
  -webkit-transform: skew(@x, @y);
     -moz-transform: skew(@x, @y);
298
      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885
Mark Otto's avatar
Mark Otto committed
299
300
301
       -o-transform: skew(@x, @y);
          transform: skew(@x, @y);
}
302
.translate3d(@x, @y, @z) {
303
304
305
306
  -webkit-transform: translate3d(@x, @y, @z);
     -moz-transform: translate3d(@x, @y, @z);
       -o-transform: translate3d(@x, @y, @z);
          transform: translate3d(@x, @y, @z);
307
}
308

309
310
311
312
// 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
313
.backface-visibility(@visibility){
314
	-webkit-backface-visibility: @visibility;
315
316
	   -moz-backface-visibility: @visibility;
	        backface-visibility: @visibility;
317
318
}

319
// Background clipping
320
// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
Mark Otto's avatar
Mark Otto committed
321
322
323
324
.background-clip(@clip) {
  -webkit-background-clip: @clip;
     -moz-background-clip: @clip;
          background-clip: @clip;
325
326
}

327
// Background sizing
Mark Otto's avatar
Mark Otto committed
328
329
330
331
332
.background-size(@size){
  -webkit-background-size: @size;
     -moz-background-size: @size;
       -o-background-size: @size;
          background-size: @size;
333
334
335
}


336
337
338
339
340
341
342
// Box sizing
.box-sizing(@boxmodel) {
  -webkit-box-sizing: @boxmodel;
     -moz-box-sizing: @boxmodel;
          box-sizing: @boxmodel;
}

343
344
345
346
347
// 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
348
      -ms-user-select: @select;
349
350
351
352
       -o-user-select: @select;
          user-select: @select;
}

353
// Resize anything
354
.resizable(@direction) {
355
356
357
358
  resize: @direction; // Options: horizontal, vertical, both
  overflow: auto; // Safari fix
}

359
// CSS3 Content Columns
360
.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
361
362
  -webkit-column-count: @columnCount;
     -moz-column-count: @columnCount;
363
364
          column-count: @columnCount;
  -webkit-column-gap: @columnGap;
365
     -moz-column-gap: @columnGap;
366
          column-gap: @columnGap;
367
368
}

Synchro's avatar
Synchro committed
369
370
// Optional hyphenation
.hyphens(@mode: auto) {
Mark Otto's avatar
Mark Otto committed
371
  word-wrap: break-word;
Synchro's avatar
Synchro committed
372
373
374
  -webkit-hyphens: @mode;
     -moz-hyphens: @mode;
      -ms-hyphens: @mode;
Synchro's avatar
Synchro committed
375
       -o-hyphens: @mode;
Synchro's avatar
Synchro committed
376
377
378
          hyphens: @mode;
}

379
// Opacity
380
.opacity(@opacity) {
381
  opacity: @opacity / 100;
Alec Rust's avatar
Alec Rust committed
382
  filter: ~"alpha(opacity=@{opacity})";
383
384
385
386
387
388
389
}



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

390
391
392
393
// 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);
394
395
396
  }
  .border(@color: @white, @alpha: 1) {
    border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
397
    .background-clip(padding-box);
398
  }
399
400
}

Mark Otto's avatar
Mark Otto committed
401
// Gradient Bar Colors for buttons and alerts
402
403
404
.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
  color: @textColor;
  text-shadow: @textShadow;
405
  #gradient > .vertical(@primaryColor, @secondaryColor);
406
407
408
409
  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%);
}

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

472

473
474
475
476

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

477
// Horizontal dividers
478
479
// -------------------------
// Dividers (basically an hr) within dropdowns and nav lists
480
.nav-divider(@top: #e5e5e5, @bottom: @white) {
481
482
483
484
485
  // 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
486
487
  height: 1px;
  margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
488
  *margin: -5px 0 5px;
Jacob Thornton's avatar
Jacob Thornton committed
489
  overflow: hidden;
490
491
  background-color: @top;
  border-bottom: 1px solid @bottom;
492
493
}

494
// Button backgrounds
495
// ------------------
496
.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
497
  // gradientBar will set the background to a pleasing blend of these, to support IE<=9
498
  .gradientBar(@startColor, @endColor, @textColor, @textShadow);
499
  *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
500
  .reset-filter();
501
502

  // in these cases the gradient won't cover the background, so we override
503
  &:hover, &:active, &.active, &.disabled, &[disabled] {
504
    color: @textColor;
505
    background-color: @endColor;
506
    *background-color: darken(@endColor, 5%);
507
508
509
510
511
512
513
514
515
  }

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

516
517
518
519
520
521
522
523
// 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;
}

524

525
526
527
528

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

529
// Centered container element
530
531
.container-fixed() {
  margin-right: auto;
Jacob Thornton's avatar
Jacob Thornton committed
532
  margin-left: auto;
533
534
535
  .clearfix();
}

536
// Table columns
537
538
539
540
541
542
.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
}

543
544
545
546
547
548
// Make a Grid
// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
.makeRow() {
  margin-left: @gridGutterWidth * -1;
  .clearfix();
}
549
.makeColumn(@columns: 1, @offset: 0) {
550
  float: left;
551
  margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
552
553
554
555
  width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
}

// The Grid
556
557
#grid {

558
  .core (@gridColumnWidth, @gridGutterWidth, @gridRowWidth) {
559

560
561
562
563
564
    .spanX (@index) when (@index > 0) {
      (~".span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}
565

566
567
568
    .offsetX (@index) when (@index > 0) {
      (~".offset@{index}") { .offset(@index); }
      .offsetX(@index - 1);
569
    }
570
    .offsetX (0) {}
571
572

    .offset (@columns) {
573
      margin-left: percentage(@columns / @gridColumns);
574
575
    }

576
    .span (@columns) {
577
      width: percentage(@columns / @gridColumns);
578
579
    }

580
    .row {
581
582
      margin-left: @gridGutterWidth / -2;
      margin-right: @gridGutterWidth / -2;
583
584
585
586
587
      .clearfix();
    }

    [class*="span"] {
      float: left;
588
589
590
591
592
593
      min-height: 1px; // prevent column collapsing
      padding-left: @gridGutterWidth / 2;
      padding-right: @gridGutterWidth / 2;
      -webkit-box-sizing: border-box;
         -moz-box-sizing: border-box;
              box-sizing: border-box;
594
595
    }

596
    // generate .spanX and .offsetX
597
598
    .spanX (@gridColumns);
    .offsetX (@gridColumns);
599
600
601

  }

602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635

  .input(@gridColumnWidth, @gridGutterWidth, @gridRowWidth) {

    .spanX (@index) when (@index > 0) {
      (~"input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index}") { .span(@index); }
      .spanX(@index - 1);
    }
    .spanX (0) {}

    .span(@columns) {
      width: percentage(@columns / @gridColumns) - percentage(@gridGutterWidth / @gridRowWidth);
      margin-left: percentage((@gridGutterWidth / 2) / @gridRowWidth);
      margin-right: percentage((@gridGutterWidth / 2) / @gridRowWidth);
    }

    // Space grid-sized controls properly if multiple per line
    input[class*="span"]:first-child,
    textarea[class*="span"]:first-child,
    .uneditable-input[class*="span"]:first-child {
      margin-left: 0;
    }
    input[class*="span"]:last-child,
    textarea[class*="span"]:last-child,
    .uneditable-input[class*="span"]:last-child {
      margin-right: 0;
    }


    // generate .spanX
    .spanX (@gridColumns);

  }


636
}