custom-twitter-bootstrap-rails 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. data/README.md +158 -0
  2. data/Rakefile +3 -0
  3. data/lib/generators/bootstrap/install/install_generator.rb +21 -0
  4. data/lib/generators/bootstrap/install/templates/bootstrap.coffee +21 -0
  5. data/lib/generators/bootstrap/install/templates/bootstrap.less +5 -0
  6. data/lib/twitter-bootstrap-rails.rb +10 -0
  7. data/lib/twitter/bootstrap/rails/bootstrap.rb +2 -0
  8. data/lib/twitter/bootstrap/rails/engine.rb +17 -0
  9. data/lib/twitter/bootstrap/rails/version.rb +8 -0
  10. data/vendor/assets/javascripts/twitter/bootstrap.js +8 -0
  11. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-alerts.js +113 -0
  12. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-buttons.js +62 -0
  13. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-dropdown.js +55 -0
  14. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-modal.js +260 -0
  15. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-popover.js +86 -0
  16. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-scrollspy.js +107 -0
  17. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-tabs.js +80 -0
  18. data/vendor/assets/javascripts/twitter/bootstrap/bootstrap-twipsy.js +310 -0
  19. data/vendor/assets/stylesheets/twitter/bootstrap.css.less +1 -0
  20. data/vendor/toolkit/twitter/bootstrap.less +1 -0
  21. data/vendor/toolkit/twitter/bootstrap/bootstrap.less +26 -0
  22. data/vendor/toolkit/twitter/bootstrap/forms.less +479 -0
  23. data/vendor/toolkit/twitter/bootstrap/mixins.less +223 -0
  24. data/vendor/toolkit/twitter/bootstrap/patterns.less +1058 -0
  25. data/vendor/toolkit/twitter/bootstrap/reset.less +141 -0
  26. data/vendor/toolkit/twitter/bootstrap/scaffolding.less +137 -0
  27. data/vendor/toolkit/twitter/bootstrap/tables.less +224 -0
  28. data/vendor/toolkit/twitter/bootstrap/type.less +187 -0
  29. data/vendor/toolkit/twitter/bootstrap/variables.less +60 -0
  30. metadata +196 -0
@@ -0,0 +1,80 @@
1
+ /* ========================================================
2
+ * bootstrap-tabs.js v1.4.0
3
+ * http://twitter.github.com/bootstrap/javascript.html#tabs
4
+ * ========================================================
5
+ * Copyright 2011 Twitter, Inc.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ * ======================================================== */
19
+
20
+
21
+ !function( $ ){
22
+
23
+ "use strict"
24
+
25
+ function activate ( element, container ) {
26
+ container
27
+ .find('> .active')
28
+ .removeClass('active')
29
+ .find('> .dropdown-menu > .active')
30
+ .removeClass('active')
31
+
32
+ element.addClass('active')
33
+
34
+ if ( element.parent('.dropdown-menu') ) {
35
+ element.closest('li.dropdown').addClass('active')
36
+ }
37
+ }
38
+
39
+ function tab( e ) {
40
+ var $this = $(this)
41
+ , $ul = $this.closest('ul:not(.dropdown-menu)')
42
+ , href = $this.attr('href')
43
+ , previous
44
+ , $href
45
+
46
+ if ( /^#\w+/.test(href) ) {
47
+ e.preventDefault()
48
+
49
+ if ( $this.parent('li').hasClass('active') ) {
50
+ return
51
+ }
52
+
53
+ previous = $ul.find('.active a').last()[0]
54
+ $href = $(href)
55
+
56
+ activate($this.parent('li'), $ul)
57
+ activate($href, $href.parent())
58
+
59
+ $this.trigger({
60
+ type: 'change'
61
+ , relatedTarget: previous
62
+ })
63
+ }
64
+ }
65
+
66
+
67
+ /* TABS/PILLS PLUGIN DEFINITION
68
+ * ============================ */
69
+
70
+ $.fn.tabs = $.fn.pills = function ( selector ) {
71
+ return this.each(function () {
72
+ $(this).delegate(selector || '.tabs li > a, .pills > li > a', 'click', tab)
73
+ })
74
+ }
75
+
76
+ $(document).ready(function () {
77
+ $('body').tabs('ul[data-tabs] li > a, ul[data-pills] > li > a')
78
+ })
79
+
80
+ }( window.jQuery || window.ender );
@@ -0,0 +1,310 @@
1
+ /* ==========================================================
2
+ * bootstrap-twipsy.js v1.4.0
3
+ * http://twitter.github.com/bootstrap/javascript.html#twipsy
4
+ * Adapted from the original jQuery.tipsy by Jason Frame
5
+ * ==========================================================
6
+ * Copyright 2011 Twitter, Inc.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ * ========================================================== */
20
+
21
+
22
+ !function( $ ) {
23
+
24
+ "use strict"
25
+
26
+ /* CSS TRANSITION SUPPORT (https://gist.github.com/373874)
27
+ * ======================================================= */
28
+
29
+ var transitionEnd
30
+
31
+ $(document).ready(function () {
32
+
33
+ $.support.transition = (function () {
34
+ var thisBody = document.body || document.documentElement
35
+ , thisStyle = thisBody.style
36
+ , support = thisStyle.transition !== undefined || thisStyle.WebkitTransition !== undefined || thisStyle.MozTransition !== undefined || thisStyle.MsTransition !== undefined || thisStyle.OTransition !== undefined
37
+ return support
38
+ })()
39
+
40
+ // set CSS transition event type
41
+ if ( $.support.transition ) {
42
+ transitionEnd = "TransitionEnd"
43
+ if ( $.browser.webkit ) {
44
+ transitionEnd = "webkitTransitionEnd"
45
+ } else if ( $.browser.mozilla ) {
46
+ transitionEnd = "transitionend"
47
+ } else if ( $.browser.opera ) {
48
+ transitionEnd = "oTransitionEnd"
49
+ }
50
+ }
51
+
52
+ })
53
+
54
+
55
+ /* TWIPSY PUBLIC CLASS DEFINITION
56
+ * ============================== */
57
+
58
+ var Twipsy = function ( element, options ) {
59
+ this.$element = $(element)
60
+ this.options = options
61
+ this.enabled = true
62
+ this.fixTitle()
63
+ }
64
+
65
+ Twipsy.prototype = {
66
+
67
+ show: function() {
68
+ var pos
69
+ , actualWidth
70
+ , actualHeight
71
+ , placement
72
+ , $tip
73
+ , tp
74
+
75
+ if (this.hasContent() && this.enabled) {
76
+ $tip = this.tip()
77
+ this.setContent()
78
+
79
+ if (this.options.animate) {
80
+ $tip.addClass('fade')
81
+ }
82
+
83
+ $tip
84
+ .remove()
85
+ .css({ top: 0, left: 0, display: 'block' })
86
+ .prependTo(document.body)
87
+
88
+ pos = $.extend({}, this.$element.offset(), {
89
+ width: this.$element[0].offsetWidth
90
+ , height: this.$element[0].offsetHeight
91
+ })
92
+
93
+ actualWidth = $tip[0].offsetWidth
94
+ actualHeight = $tip[0].offsetHeight
95
+
96
+ placement = maybeCall(this.options.placement, this, [ $tip[0], this.$element[0] ])
97
+
98
+ switch (placement) {
99
+ case 'below':
100
+ tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2}
101
+ break
102
+ case 'above':
103
+ tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2}
104
+ break
105
+ case 'left':
106
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset}
107
+ break
108
+ case 'right':
109
+ tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset}
110
+ break
111
+ }
112
+
113
+ $tip
114
+ .css(tp)
115
+ .addClass(placement)
116
+ .addClass('in')
117
+ }
118
+ }
119
+
120
+ , setContent: function () {
121
+ var $tip = this.tip()
122
+ $tip.find('.twipsy-inner')[this.options.html ? 'html' : 'text'](this.getTitle())
123
+ $tip[0].className = 'twipsy'
124
+ }
125
+
126
+ , hide: function() {
127
+ var that = this
128
+ , $tip = this.tip()
129
+
130
+ $tip.removeClass('in')
131
+
132
+ function removeElement () {
133
+ $tip.remove()
134
+ }
135
+
136
+ $.support.transition && this.$tip.hasClass('fade') ?
137
+ $tip.bind(transitionEnd, removeElement) :
138
+ removeElement()
139
+ }
140
+
141
+ , fixTitle: function() {
142
+ var $e = this.$element
143
+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {
144
+ $e.attr('data-original-title', $e.attr('title') || '').removeAttr('title')
145
+ }
146
+ }
147
+
148
+ , hasContent: function () {
149
+ return this.getTitle()
150
+ }
151
+
152
+ , getTitle: function() {
153
+ var title
154
+ , $e = this.$element
155
+ , o = this.options
156
+
157
+ this.fixTitle()
158
+
159
+ if (typeof o.title == 'string') {
160
+ title = $e.attr(o.title == 'title' ? 'data-original-title' : o.title)
161
+ } else if (typeof o.title == 'function') {
162
+ title = o.title.call($e[0])
163
+ }
164
+
165
+ title = ('' + title).replace(/(^\s*|\s*$)/, "")
166
+
167
+ return title || o.fallback
168
+ }
169
+
170
+ , tip: function() {
171
+ if (!this.$tip) {
172
+ this.$tip = $('<div class="twipsy" />').html(this.options.template)
173
+ }
174
+ return this.$tip
175
+ }
176
+
177
+ , validate: function() {
178
+ if (!this.$element[0].parentNode) {
179
+ this.hide()
180
+ this.$element = null
181
+ this.options = null
182
+ }
183
+ }
184
+
185
+ , enable: function() {
186
+ this.enabled = true
187
+ }
188
+
189
+ , disable: function() {
190
+ this.enabled = false
191
+ }
192
+
193
+ , toggleEnabled: function() {
194
+ this.enabled = !this.enabled
195
+ }
196
+
197
+ }
198
+
199
+
200
+ /* TWIPSY PRIVATE METHODS
201
+ * ====================== */
202
+
203
+ function maybeCall ( thing, ctx, args ) {
204
+ return typeof thing == 'function' ? thing.apply(ctx, args) : thing
205
+ }
206
+
207
+ /* TWIPSY PLUGIN DEFINITION
208
+ * ======================== */
209
+
210
+ $.fn.twipsy = function (options) {
211
+ $.fn.twipsy.initWith.call(this, options, Twipsy, 'twipsy')
212
+ return this
213
+ }
214
+
215
+ $.fn.twipsy.initWith = function (options, Constructor, name) {
216
+ var twipsy
217
+ , binder
218
+ , eventIn
219
+ , eventOut
220
+
221
+ if (options === true) {
222
+ return this.data(name)
223
+ } else if (typeof options == 'string') {
224
+ twipsy = this.data(name)
225
+ if (twipsy) {
226
+ twipsy[options]()
227
+ }
228
+ return this
229
+ }
230
+
231
+ options = $.extend({}, $.fn[name].defaults, options)
232
+
233
+ function get(ele) {
234
+ var twipsy = $.data(ele, name)
235
+
236
+ if (!twipsy) {
237
+ twipsy = new Constructor(ele, $.fn.twipsy.elementOptions(ele, options))
238
+ $.data(ele, name, twipsy)
239
+ }
240
+
241
+ return twipsy
242
+ }
243
+
244
+ function enter() {
245
+ var twipsy = get(this)
246
+ twipsy.hoverState = 'in'
247
+
248
+ if (options.delayIn == 0) {
249
+ twipsy.show()
250
+ } else {
251
+ twipsy.fixTitle()
252
+ setTimeout(function() {
253
+ if (twipsy.hoverState == 'in') {
254
+ twipsy.show()
255
+ }
256
+ }, options.delayIn)
257
+ }
258
+ }
259
+
260
+ function leave() {
261
+ var twipsy = get(this)
262
+ twipsy.hoverState = 'out'
263
+ if (options.delayOut == 0) {
264
+ twipsy.hide()
265
+ } else {
266
+ setTimeout(function() {
267
+ if (twipsy.hoverState == 'out') {
268
+ twipsy.hide()
269
+ }
270
+ }, options.delayOut)
271
+ }
272
+ }
273
+
274
+ if (!options.live) {
275
+ this.each(function() {
276
+ get(this)
277
+ })
278
+ }
279
+
280
+ if (options.trigger != 'manual') {
281
+ binder = options.live ? 'live' : 'bind'
282
+ eventIn = options.trigger == 'hover' ? 'mouseenter' : 'focus'
283
+ eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur'
284
+ this[binder](eventIn, enter)[binder](eventOut, leave)
285
+ }
286
+
287
+ return this
288
+ }
289
+
290
+ $.fn.twipsy.Twipsy = Twipsy
291
+
292
+ $.fn.twipsy.defaults = {
293
+ animate: true
294
+ , delayIn: 0
295
+ , delayOut: 0
296
+ , fallback: ''
297
+ , placement: 'above'
298
+ , html: false
299
+ , live: false
300
+ , offset: 0
301
+ , title: 'title'
302
+ , trigger: 'hover'
303
+ , template: '<div class="twipsy-arrow"></div><div class="twipsy-inner"></div>'
304
+ }
305
+
306
+ $.fn.twipsy.elementOptions = function(ele, options) {
307
+ return $.extend({}, options, $(ele).data())
308
+ }
309
+
310
+ }( window.jQuery || window.ender );
@@ -0,0 +1 @@
1
+ @import "twitter/bootstrap/bootstrap";
@@ -0,0 +1 @@
1
+ @import "bootstrap/bootstrap.less";
@@ -0,0 +1,26 @@
1
+ /*!
2
+ * Bootstrap @VERSION
3
+ *
4
+ * Copyright 2011 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ * Date: @DATE
10
+ */
11
+
12
+ // CSS Reset
13
+ @import "reset.less";
14
+
15
+ // Core variables and mixins
16
+ @import "variables.less"; // Modify this for custom colors, font-sizes, etc
17
+ @import "mixins.less";
18
+
19
+ // Grid system and page structure
20
+ @import "scaffolding.less";
21
+
22
+ // Styled patterns and elements
23
+ @import "type.less";
24
+ @import "forms.less";
25
+ @import "tables.less";
26
+ @import "patterns.less";
@@ -0,0 +1,479 @@
1
+ /* Forms.less
2
+ * Base styles for various input types, form layouts, and states
3
+ * ------------------------------------------------------------- */
4
+
5
+
6
+ // FORM STYLES
7
+ // -----------
8
+
9
+ form {
10
+ margin-bottom: @baseline;
11
+ }
12
+
13
+ // Groups of fields with labels on top (legends)
14
+ fieldset {
15
+ margin-bottom: @baseline;
16
+ padding-top: @baseline;
17
+ legend {
18
+ display: block;
19
+ padding-left: 150px;
20
+ font-size: @basefont * 1.5;
21
+ line-height: 1;
22
+ color: @grayDark;
23
+ *padding: 0 0 5px 145px; /* IE6-7 */
24
+ *line-height: 1.5; /* IE6-7 */
25
+ }
26
+ }
27
+
28
+ // Parent element that clears floats and wraps labels and fields together
29
+ form .clearfix {
30
+ margin-bottom: @baseline;
31
+ .clearfix()
32
+ }
33
+
34
+ // Set font for forms
35
+ label,
36
+ input,
37
+ select,
38
+ textarea {
39
+ #font > .sans-serif(normal,13px,normal);
40
+ }
41
+
42
+ // Float labels left
43
+ label {
44
+ padding-top: 6px;
45
+ font-size: @basefont;
46
+ line-height: @baseline;
47
+ float: left;
48
+ width: 130px;
49
+ text-align: right;
50
+ color: @grayDark;
51
+ }
52
+
53
+ // Shift over the inside div to align all label's relevant content
54
+ form .input {
55
+ margin-left: 150px;
56
+ }
57
+
58
+ // Checkboxs and radio buttons
59
+ input[type=checkbox],
60
+ input[type=radio] {
61
+ cursor: pointer;
62
+ }
63
+
64
+ // Inputs, Textareas, Selects
65
+ input,
66
+ textarea,
67
+ select,
68
+ .uneditable-input {
69
+ display: inline-block;
70
+ width: 210px;
71
+ height: @baseline;
72
+ padding: 4px;
73
+ font-size: @basefont;
74
+ line-height: @baseline;
75
+ color: @gray;
76
+ border: 1px solid #ccc;
77
+ .border-radius(3px);
78
+ }
79
+
80
+ // remove padding from select
81
+ select {
82
+ padding: initial;
83
+ }
84
+
85
+ // mini reset for non-html5 file types
86
+ input[type=checkbox],
87
+ input[type=radio] {
88
+ width: auto;
89
+ height: auto;
90
+ padding: 0;
91
+ margin: 3px 0;
92
+ *margin-top: 0; /* IE6-7 */
93
+ line-height: normal;
94
+ border: none;
95
+ }
96
+
97
+ input[type=file] {
98
+ background-color: @white;
99
+ padding: initial;
100
+ border: initial;
101
+ line-height: initial;
102
+ .box-shadow(none);
103
+ }
104
+
105
+ input[type=button],
106
+ input[type=reset],
107
+ input[type=submit] {
108
+ width: auto;
109
+ height: auto;
110
+ }
111
+
112
+ select,
113
+ input[type=file] {
114
+ height: @baseline * 1.5; // In IE7, the height of the select element cannot be changed by height, only font-size
115
+ *height: auto; // Reset for IE7
116
+ line-height: @baseline * 1.5;
117
+ *margin-top: 4px; /* For IE7, add top margin to align select with labels */
118
+ }
119
+
120
+ // Make multiple select elements height not fixed
121
+ select[multiple] {
122
+ height: inherit;
123
+ background-color: @white; // Fixes Chromium bug of unreadable items
124
+ }
125
+
126
+ textarea {
127
+ height: auto;
128
+ }
129
+
130
+ // For text that needs to appear as an input but should not be an input
131
+ .uneditable-input {
132
+ background-color: @white;
133
+ display: block;
134
+ border-color: #eee;
135
+ .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
136
+ cursor: not-allowed;
137
+ }
138
+
139
+ // Placeholder text gets special styles; can't be bundled together though for some reason
140
+ :-moz-placeholder {
141
+ color: @grayLight;
142
+ }
143
+ ::-webkit-input-placeholder {
144
+ color: @grayLight;
145
+ }
146
+
147
+ // Focus states
148
+ input,
149
+ textarea {
150
+ @transition: border linear .2s, box-shadow linear .2s;
151
+ .transition(@transition);
152
+ .box-shadow(inset 0 1px 3px rgba(0,0,0,.1));
153
+ }
154
+ input:focus,
155
+ textarea:focus {
156
+ outline: 0;
157
+ border-color: rgba(82,168,236,.8);
158
+ @shadow: inset 0 1px 3px rgba(0,0,0,.1), 0 0 8px rgba(82,168,236,.6);
159
+ .box-shadow(@shadow);
160
+ }
161
+ input[type=file]:focus,
162
+ input[type=checkbox]:focus,
163
+ select:focus {
164
+ .box-shadow(none); // override for file inputs
165
+ outline: 1px dotted #666; // Selet elements don't get box-shadow styles, so instead we do outline
166
+ }
167
+
168
+
169
+ // FORM FIELD FEEDBACK STATES
170
+ // --------------------------
171
+
172
+ // Mixin for form field states
173
+ .formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
174
+ // Set the text color
175
+ > label,
176
+ .help-block,
177
+ .help-inline {
178
+ color: @textColor;
179
+ }
180
+ // Style inputs accordingly
181
+ input,
182
+ textarea {
183
+ color: @textColor;
184
+ border-color: @borderColor;
185
+ &:focus {
186
+ border-color: darken(@borderColor, 10%);
187
+ .box-shadow(0 0 6px lighten(@borderColor, 20%);
188
+ }
189
+ }
190
+ // Give a small background color for input-prepend/-append
191
+ .input-prepend .add-on,
192
+ .input-append .add-on {
193
+ color: @textColor;
194
+ background-color: @backgroundColor;
195
+ border-color: @textColor;
196
+ }
197
+ }
198
+ // Error
199
+ form .clearfix.error {
200
+ .formFieldState(#b94a48, #ee5f5b, lighten(#ee5f5b, 30%));
201
+ }
202
+ // Warning
203
+ form .clearfix.warning {
204
+ .formFieldState(#c09853, #ccae64, lighten(#CCAE64, 5%));
205
+ }
206
+ // Success
207
+ form .clearfix.success {
208
+ .formFieldState(#468847, #57a957, lighten(#57a957, 30%));
209
+ }
210
+
211
+
212
+ // Form element sizes
213
+ // TODO v2: remove duplication here and just stick to .input-[size] in light of adding .spanN sizes
214
+ .input-mini,
215
+ input.mini,
216
+ textarea.mini,
217
+ select.mini {
218
+ width: 60px;
219
+ }
220
+ .input-small,
221
+ input.small,
222
+ textarea.small,
223
+ select.small {
224
+ width: 90px;
225
+ }
226
+ .input-medium,
227
+ input.medium,
228
+ textarea.medium,
229
+ select.medium {
230
+ width: 150px;
231
+ }
232
+ .input-large,
233
+ input.large,
234
+ textarea.large,
235
+ select.large {
236
+ width: 210px;
237
+ }
238
+ .input-xlarge,
239
+ input.xlarge,
240
+ textarea.xlarge,
241
+ select.xlarge {
242
+ width: 270px;
243
+ }
244
+ .input-xxlarge,
245
+ input.xxlarge,
246
+ textarea.xxlarge,
247
+ select.xxlarge {
248
+ width: 530px;
249
+ }
250
+ textarea.xxlarge {
251
+ overflow-y: auto;
252
+ }
253
+
254
+ // Grid style input sizes
255
+ // This is a duplication of the main grid .columns() mixin, but subtracts 10px to account for input padding and border
256
+ .formColumns(@columnSpan: 1) {
257
+ display: inline-block;
258
+ float: none;
259
+ width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 10;
260
+ margin-left: 0;
261
+ }
262
+ input,
263
+ textarea {
264
+ // Default columns
265
+ &.span1 { .formColumns(1); }
266
+ &.span2 { .formColumns(2); }
267
+ &.span3 { .formColumns(3); }
268
+ &.span4 { .formColumns(4); }
269
+ &.span5 { .formColumns(5); }
270
+ &.span6 { .formColumns(6); }
271
+ &.span7 { .formColumns(7); }
272
+ &.span8 { .formColumns(8); }
273
+ &.span9 { .formColumns(9); }
274
+ &.span10 { .formColumns(10); }
275
+ &.span11 { .formColumns(11); }
276
+ &.span12 { .formColumns(12); }
277
+ &.span13 { .formColumns(13); }
278
+ &.span14 { .formColumns(14); }
279
+ &.span15 { .formColumns(15); }
280
+ &.span16 { .formColumns(16); }
281
+ }
282
+
283
+ // Disabled and read-only inputs
284
+ input[disabled],
285
+ select[disabled],
286
+ textarea[disabled],
287
+ input[readonly],
288
+ select[readonly],
289
+ textarea[readonly] {
290
+ background-color: #f5f5f5;
291
+ border-color: #ddd;
292
+ cursor: not-allowed;
293
+ }
294
+
295
+ // Actions (the buttons)
296
+ .actions {
297
+ background: #f5f5f5;
298
+ margin-top: @baseline;
299
+ margin-bottom: @baseline;
300
+ padding: (@baseline - 1) 20px @baseline 150px;
301
+ border-top: 1px solid #ddd;
302
+ .border-radius(0 0 3px 3px);
303
+ .secondary-action {
304
+ float: right;
305
+ a {
306
+ line-height: 30px;
307
+ &:hover {
308
+ text-decoration: underline;
309
+ }
310
+ }
311
+ }
312
+ }
313
+
314
+ // Help Text
315
+ // TODO: Do we need to set basefont and baseline here?
316
+ .help-inline,
317
+ .help-block {
318
+ font-size: @basefont;
319
+ line-height: @baseline;
320
+ color: @grayLight;
321
+ }
322
+ .help-inline {
323
+ padding-left: 5px;
324
+ *position: relative; /* IE6-7 */
325
+ *top: -5px; /* IE6-7 */
326
+ }
327
+
328
+ // Big blocks of help text
329
+ .help-block {
330
+ display: block;
331
+ max-width: 600px;
332
+ }
333
+
334
+ // Inline Fields (input fields that appear as inline objects
335
+ .inline-inputs {
336
+ color: @gray;
337
+ span {
338
+ padding: 0 2px 0 1px;
339
+ }
340
+ }
341
+
342
+ // Allow us to put symbols and text within the input field for a cleaner look
343
+ .input-prepend,
344
+ .input-append {
345
+ input {
346
+ .border-radius(0 3px 3px 0);
347
+ }
348
+ .add-on {
349
+ position: relative;
350
+ background: #f5f5f5;
351
+ border: 1px solid #ccc;
352
+ z-index: 2;
353
+ float: left;
354
+ display: block;
355
+ width: auto;
356
+ min-width: 16px;
357
+ height: 18px;
358
+ padding: 4px 4px 4px 5px;
359
+ margin-right: -1px;
360
+ font-weight: normal;
361
+ line-height: 18px;
362
+ color: @grayLight;
363
+ text-align: center;
364
+ text-shadow: 0 1px 0 @white;
365
+ .border-radius(3px 0 0 3px);
366
+ }
367
+ .active {
368
+ background: lighten(@green, 30);
369
+ border-color: @green;
370
+ }
371
+ }
372
+ .input-prepend {
373
+ .add-on {
374
+ *margin-top: 1px; /* IE6-7 */
375
+ }
376
+ }
377
+ .input-append {
378
+ input {
379
+ float: left;
380
+ .border-radius(3px 0 0 3px);
381
+ }
382
+ .add-on {
383
+ .border-radius(0 3px 3px 0);
384
+ margin-right: 0;
385
+ margin-left: -1px;
386
+ }
387
+ }
388
+
389
+ // Stacked options for forms (radio buttons or checkboxes)
390
+ .inputs-list {
391
+ margin: 0 0 5px;
392
+ width: 100%;
393
+ li {
394
+ display: block;
395
+ padding: 0;
396
+ width: 100%;
397
+ }
398
+ label {
399
+ display: block;
400
+ float: none;
401
+ width: auto;
402
+ padding: 0;
403
+ margin-left: 20px;
404
+ line-height: @baseline;
405
+ text-align: left;
406
+ white-space: normal;
407
+ strong {
408
+ color: @gray;
409
+ }
410
+ small {
411
+ font-size: @basefont - 2;
412
+ font-weight: normal;
413
+ }
414
+ }
415
+ .inputs-list {
416
+ margin-left: 25px;
417
+ margin-bottom: 10px;
418
+ padding-top: 0;
419
+ }
420
+ &:first-child {
421
+ padding-top: 6px;
422
+ }
423
+ li + li {
424
+ padding-top: 2px;
425
+ }
426
+ input[type=radio],
427
+ input[type=checkbox] {
428
+ margin-bottom: 0;
429
+ margin-left: -20px;
430
+ float: left;
431
+ }
432
+ }
433
+
434
+ // Stacked forms
435
+ .form-stacked {
436
+ padding-left: 20px;
437
+ fieldset {
438
+ padding-top: @baseline / 2;
439
+ }
440
+ legend {
441
+ padding-left: 0;
442
+ }
443
+ label {
444
+ display: block;
445
+ float: none;
446
+ width: auto;
447
+ font-weight: bold;
448
+ text-align: left;
449
+ line-height: 20px;
450
+ padding-top: 0;
451
+ }
452
+ .clearfix {
453
+ margin-bottom: @baseline / 2;
454
+ div.input {
455
+ margin-left: 0;
456
+ }
457
+ }
458
+ .inputs-list {
459
+ margin-bottom: 0;
460
+ li {
461
+ padding-top: 0;
462
+ label {
463
+ font-weight: normal;
464
+ padding-top: 0;
465
+ }
466
+ }
467
+ }
468
+ div.clearfix.error {
469
+ padding-top: 10px;
470
+ padding-bottom: 10px;
471
+ padding-left: 10px;
472
+ margin-top: 0;
473
+ margin-left: -10px;
474
+ }
475
+ .actions {
476
+ margin-left: -20px;
477
+ padding-left: 20px;
478
+ }
479
+ }