refactoring: removing DocumentElement.bound
[fnpeditor.git] / libs / bootstrap / less / forms.less
1 //
2 // Forms
3 // --------------------------------------------------
4
5
6 // GENERAL STYLES
7 // --------------
8
9 // Make all forms have space below them
10 form {
11   margin: 0 0 @baseLineHeight;
12 }
13
14 fieldset {
15   padding: 0;
16   margin: 0;
17   border: 0;
18 }
19
20 // Groups of fields with labels on top (legends)
21 legend {
22   display: block;
23   width: 100%;
24   padding: 0;
25   margin-bottom: @baseLineHeight;
26   font-size: @baseFontSize * 1.5;
27   line-height: @baseLineHeight * 2;
28   color: @grayDark;
29   border: 0;
30   border-bottom: 1px solid #e5e5e5;
31
32   // Small
33   small {
34     font-size: @baseLineHeight * .75;
35     color: @grayLight;
36   }
37 }
38
39 // Set font for forms
40 label,
41 input,
42 button,
43 select,
44 textarea {
45   #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
46 }
47 input,
48 button,
49 select,
50 textarea {
51   font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
52 }
53
54 // Identify controls by their labels
55 label {
56   display: block;
57   margin-bottom: 5px;
58 }
59
60 // Form controls
61 // -------------------------
62
63 // Shared size and type resets
64 select,
65 textarea,
66 input[type="text"],
67 input[type="password"],
68 input[type="datetime"],
69 input[type="datetime-local"],
70 input[type="date"],
71 input[type="month"],
72 input[type="time"],
73 input[type="week"],
74 input[type="number"],
75 input[type="email"],
76 input[type="url"],
77 input[type="search"],
78 input[type="tel"],
79 input[type="color"],
80 .uneditable-input {
81   display: inline-block;
82   height: @baseLineHeight;
83   padding: 4px 6px;
84   margin-bottom: @baseLineHeight / 2;
85   font-size: @baseFontSize;
86   line-height: @baseLineHeight;
87   color: @gray;
88   .border-radius(@inputBorderRadius);
89   vertical-align: middle;
90 }
91
92 // Reset appearance properties for textual inputs and textarea
93 // Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
94 input,
95 textarea,
96 .uneditable-input {
97   width: 206px; // plus 12px padding and 2px border
98 }
99 // Reset height since textareas have rows
100 textarea {
101   height: auto;
102 }
103 // Everything else
104 textarea,
105 input[type="text"],
106 input[type="password"],
107 input[type="datetime"],
108 input[type="datetime-local"],
109 input[type="date"],
110 input[type="month"],
111 input[type="time"],
112 input[type="week"],
113 input[type="number"],
114 input[type="email"],
115 input[type="url"],
116 input[type="search"],
117 input[type="tel"],
118 input[type="color"],
119 .uneditable-input {
120   background-color: @inputBackground;
121   border: 1px solid @inputBorder;
122   .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
123   .transition(~"border linear .2s, box-shadow linear .2s");
124
125   // Focus state
126   &:focus {
127     border-color: rgba(82,168,236,.8);
128     outline: 0;
129     outline: thin dotted \9; /* IE6-9 */
130     .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
131   }
132 }
133
134 // Position radios and checkboxes better
135 input[type="radio"],
136 input[type="checkbox"] {
137   margin: 4px 0 0;
138   *margin-top: 0; /* IE7 */
139   margin-top: 1px \9; /* IE8-9 */
140   line-height: normal;
141 }
142
143 // Reset width of input images, buttons, radios, checkboxes
144 input[type="file"],
145 input[type="image"],
146 input[type="submit"],
147 input[type="reset"],
148 input[type="button"],
149 input[type="radio"],
150 input[type="checkbox"] {
151   width: auto; // Override of generic input selector
152 }
153
154 // Set the height of select and file controls to match text inputs
155 select,
156 input[type="file"] {
157   height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */
158   *margin-top: 4px; /* For IE7, add top margin to align select with labels */
159   line-height: @inputHeight;
160 }
161
162 // Make select elements obey height by applying a border
163 select {
164   width: 220px; // default input width + 10px of padding that doesn't get applied
165   border: 1px solid @inputBorder;
166   background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
167 }
168
169 // Make multiple select elements height not fixed
170 select[multiple],
171 select[size] {
172   height: auto;
173 }
174
175 // Focus for select, file, radio, and checkbox
176 select:focus,
177 input[type="file"]:focus,
178 input[type="radio"]:focus,
179 input[type="checkbox"]:focus {
180   .tab-focus();
181 }
182
183
184 // Uneditable inputs
185 // -------------------------
186
187 // Make uneditable inputs look inactive
188 .uneditable-input,
189 .uneditable-textarea {
190   color: @grayLight;
191   background-color: darken(@inputBackground, 1%);
192   border-color: @inputBorder;
193   .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
194   cursor: not-allowed;
195 }
196
197 // For text that needs to appear as an input but should not be an input
198 .uneditable-input {
199   overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
200   white-space: nowrap;
201 }
202
203 // Make uneditable textareas behave like a textarea
204 .uneditable-textarea {
205   width: auto;
206   height: auto;
207 }
208
209
210 // Placeholder
211 // -------------------------
212
213 // Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector
214 input,
215 textarea {
216   .placeholder();
217 }
218
219
220 // CHECKBOXES & RADIOS
221 // -------------------
222
223 // Indent the labels to position radios/checkboxes as hanging
224 .radio,
225 .checkbox {
226   min-height: @baseLineHeight; // clear the floating input if there is no label text
227   padding-left: 20px;
228 }
229 .radio input[type="radio"],
230 .checkbox input[type="checkbox"] {
231   float: left;
232   margin-left: -20px;
233 }
234
235 // Move the options list down to align with labels
236 .controls > .radio:first-child,
237 .controls > .checkbox:first-child {
238   padding-top: 5px; // has to be padding because margin collaspes
239 }
240
241 // Radios and checkboxes on same line
242 // TODO v3: Convert .inline to .control-inline
243 .radio.inline,
244 .checkbox.inline {
245   display: inline-block;
246   padding-top: 5px;
247   margin-bottom: 0;
248   vertical-align: middle;
249 }
250 .radio.inline + .radio.inline,
251 .checkbox.inline + .checkbox.inline {
252   margin-left: 10px; // space out consecutive inline controls
253 }
254
255
256
257 // INPUT SIZES
258 // -----------
259
260 // General classes for quick sizes
261 .input-mini       { width: 60px; }
262 .input-small      { width: 90px; }
263 .input-medium     { width: 150px; }
264 .input-large      { width: 210px; }
265 .input-xlarge     { width: 270px; }
266 .input-xxlarge    { width: 530px; }
267
268 // Grid style input sizes
269 input[class*="span"],
270 select[class*="span"],
271 textarea[class*="span"],
272 .uneditable-input[class*="span"],
273 // Redeclare since the fluid row class is more specific
274 .row-fluid input[class*="span"],
275 .row-fluid select[class*="span"],
276 .row-fluid textarea[class*="span"],
277 .row-fluid .uneditable-input[class*="span"] {
278   float: none;
279   margin-left: 0;
280 }
281 // Ensure input-prepend/append never wraps
282 .input-append input[class*="span"],
283 .input-append .uneditable-input[class*="span"],
284 .input-prepend input[class*="span"],
285 .input-prepend .uneditable-input[class*="span"],
286 .row-fluid input[class*="span"],
287 .row-fluid select[class*="span"],
288 .row-fluid textarea[class*="span"],
289 .row-fluid .uneditable-input[class*="span"],
290 .row-fluid .input-prepend [class*="span"],
291 .row-fluid .input-append [class*="span"] {
292   display: inline-block;
293 }
294
295
296
297 // GRID SIZING FOR INPUTS
298 // ----------------------
299
300 // Grid sizes
301 #grid > .input(@gridColumnWidth, @gridGutterWidth);
302
303 // Control row for multiple inputs per line
304 .controls-row {
305   .clearfix(); // Clear the float from controls
306 }
307
308 // Float to collapse white-space for proper grid alignment
309 .controls-row [class*="span"],
310 // Redeclare the fluid grid collapse since we undo the float for inputs
311 .row-fluid .controls-row [class*="span"] {
312   float: left;
313 }
314 // Explicity set top padding on all checkboxes/radios, not just first-child
315 .controls-row .checkbox[class*="span"],
316 .controls-row .radio[class*="span"] {
317   padding-top: 5px;
318 }
319
320
321
322
323 // DISABLED STATE
324 // --------------
325
326 // Disabled and read-only inputs
327 input[disabled],
328 select[disabled],
329 textarea[disabled],
330 input[readonly],
331 select[readonly],
332 textarea[readonly] {
333   cursor: not-allowed;
334   background-color: @inputDisabledBackground;
335 }
336 // Explicitly reset the colors here
337 input[type="radio"][disabled],
338 input[type="checkbox"][disabled],
339 input[type="radio"][readonly],
340 input[type="checkbox"][readonly] {
341   background-color: transparent;
342 }
343
344
345
346
347 // FORM FIELD FEEDBACK STATES
348 // --------------------------
349
350 // Warning
351 .control-group.warning {
352   .formFieldState(@warningText, @warningText, @warningBackground);
353 }
354 // Error
355 .control-group.error {
356   .formFieldState(@errorText, @errorText, @errorBackground);
357 }
358 // Success
359 .control-group.success {
360   .formFieldState(@successText, @successText, @successBackground);
361 }
362 // Success
363 .control-group.info {
364   .formFieldState(@infoText, @infoText, @infoBackground);
365 }
366
367 // HTML5 invalid states
368 // Shares styles with the .control-group.error above
369 input:focus:invalid,
370 textarea:focus:invalid,
371 select:focus:invalid {
372   color: #b94a48;
373   border-color: #ee5f5b;
374   &:focus {
375     border-color: darken(#ee5f5b, 10%);
376     @shadow: 0 0 6px lighten(#ee5f5b, 20%);
377     .box-shadow(@shadow);
378   }
379 }
380
381
382
383 // FORM ACTIONS
384 // ------------
385
386 .form-actions {
387   padding: (@baseLineHeight - 1) 20px @baseLineHeight;
388   margin-top: @baseLineHeight;
389   margin-bottom: @baseLineHeight;
390   background-color: @formActionsBackground;
391   border-top: 1px solid #e5e5e5;
392   .clearfix(); // Adding clearfix to allow for .pull-right button containers
393 }
394
395
396
397 // HELP TEXT
398 // ---------
399
400 .help-block,
401 .help-inline {
402   color: lighten(@textColor, 15%); // lighten the text some for contrast
403 }
404
405 .help-block {
406   display: block; // account for any element using help-block
407   margin-bottom: @baseLineHeight / 2;
408 }
409
410 .help-inline {
411   display: inline-block;
412   .ie7-inline-block();
413   vertical-align: middle;
414   padding-left: 5px;
415 }
416
417
418
419 // INPUT GROUPS
420 // ------------
421
422 // Allow us to put symbols and text within the input field for a cleaner look
423 .input-append,
424 .input-prepend {
425   display: inline-block;
426   margin-bottom: @baseLineHeight / 2;
427   vertical-align: middle;
428   font-size: 0; // white space collapse hack
429   white-space: nowrap; // Prevent span and input from separating
430
431   // Reset the white space collapse hack
432   input,
433   select,
434   .uneditable-input,
435   .dropdown-menu,
436   .popover {
437     font-size: @baseFontSize;
438   }
439
440   input,
441   select,
442   .uneditable-input {
443     position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
444     margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
445     *margin-left: 0;
446     vertical-align: top;
447     .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
448     // Make input on top when focused so blue border and shadow always show
449     &:focus {
450       z-index: 2;
451     }
452   }
453   .add-on {
454     display: inline-block;
455     width: auto;
456     height: @baseLineHeight;
457     min-width: 16px;
458     padding: 4px 5px;
459     font-size: @baseFontSize;
460     font-weight: normal;
461     line-height: @baseLineHeight;
462     text-align: center;
463     text-shadow: 0 1px 0 @white;
464     background-color: @grayLighter;
465     border: 1px solid #ccc;
466   }
467   .add-on,
468   .btn,
469   .btn-group > .dropdown-toggle {
470     vertical-align: top;
471     .border-radius(0);
472   }
473   .active {
474     background-color: lighten(@green, 30);
475     border-color: @green;
476   }
477 }
478
479 .input-prepend {
480   .add-on,
481   .btn {
482     margin-right: -1px;
483   }
484   .add-on:first-child,
485   .btn:first-child {
486     // FYI, `.btn:first-child` accounts for a button group that's prepended
487     .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
488   }
489 }
490
491 .input-append {
492   input,
493   select,
494   .uneditable-input {
495     .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
496     + .btn-group .btn:last-child {
497       .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
498     }
499   }
500   .add-on,
501   .btn,
502   .btn-group {
503     margin-left: -1px;
504   }
505   .add-on:last-child,
506   .btn:last-child,
507   .btn-group:last-child > .dropdown-toggle {
508     .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
509   }
510 }
511
512 // Remove all border-radius for inputs with both prepend and append
513 .input-prepend.input-append {
514   input,
515   select,
516   .uneditable-input {
517     .border-radius(0);
518     + .btn-group .btn {
519       .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
520     }
521   }
522   .add-on:first-child,
523   .btn:first-child {
524     margin-right: -1px;
525     .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
526   }
527   .add-on:last-child,
528   .btn:last-child {
529     margin-left: -1px;
530     .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
531   }
532   .btn-group:first-child {
533     margin-left: 0;
534   }
535 }
536
537
538
539
540 // SEARCH FORM
541 // -----------
542
543 input.search-query {
544   padding-right: 14px;
545   padding-right: 4px \9;
546   padding-left: 14px;
547   padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
548   margin-bottom: 0; // Remove the default margin on all inputs
549   .border-radius(15px);
550 }
551
552 /* Allow for input prepend/append in search forms */
553 .form-search .input-append .search-query,
554 .form-search .input-prepend .search-query {
555   .border-radius(0); // Override due to specificity
556 }
557 .form-search .input-append .search-query {
558   .border-radius(14px 0 0 14px);
559 }
560 .form-search .input-append .btn {
561   .border-radius(0 14px 14px 0);
562 }
563 .form-search .input-prepend .search-query {
564   .border-radius(0 14px 14px 0);
565 }
566 .form-search .input-prepend .btn {
567   .border-radius(14px 0 0 14px);
568 }
569
570
571
572
573 // HORIZONTAL & VERTICAL FORMS
574 // ---------------------------
575
576 // Common properties
577 // -----------------
578
579 .form-search,
580 .form-inline,
581 .form-horizontal {
582   input,
583   textarea,
584   select,
585   .help-inline,
586   .uneditable-input,
587   .input-prepend,
588   .input-append {
589     display: inline-block;
590     .ie7-inline-block();
591     margin-bottom: 0;
592     vertical-align: middle;
593   }
594   // Re-hide hidden elements due to specifity
595   .hide {
596     display: none;
597   }
598 }
599 .form-search label,
600 .form-inline label,
601 .form-search .btn-group,
602 .form-inline .btn-group {
603   display: inline-block;
604 }
605 // Remove margin for input-prepend/-append
606 .form-search .input-append,
607 .form-inline .input-append,
608 .form-search .input-prepend,
609 .form-inline .input-prepend {
610   margin-bottom: 0;
611 }
612 // Inline checkbox/radio labels (remove padding on left)
613 .form-search .radio,
614 .form-search .checkbox,
615 .form-inline .radio,
616 .form-inline .checkbox {
617   padding-left: 0;
618   margin-bottom: 0;
619   vertical-align: middle;
620 }
621 // Remove float and margin, set to inline-block
622 .form-search .radio input[type="radio"],
623 .form-search .checkbox input[type="checkbox"],
624 .form-inline .radio input[type="radio"],
625 .form-inline .checkbox input[type="checkbox"] {
626   float: left;
627   margin-right: 3px;
628   margin-left: 0;
629 }
630
631
632 // Margin to space out fieldsets
633 .control-group {
634   margin-bottom: @baseLineHeight / 2;
635 }
636
637 // Legend collapses margin, so next element is responsible for spacing
638 legend + .control-group {
639   margin-top: @baseLineHeight;
640   -webkit-margin-top-collapse: separate;
641 }
642
643 // Horizontal-specific styles
644 // --------------------------
645
646 .form-horizontal {
647   // Increase spacing between groups
648   .control-group {
649     margin-bottom: @baseLineHeight;
650     .clearfix();
651   }
652   // Float the labels left
653   .control-label {
654     float: left;
655     width: @horizontalComponentOffset - 20;
656     padding-top: 5px;
657     text-align: right;
658   }
659   // Move over all input controls and content
660   .controls {
661     // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
662     // don't inherit the margin of the parent, in this case .controls
663     *display: inline-block;
664     *padding-left: 20px;
665     margin-left: @horizontalComponentOffset;
666     *margin-left: 0;
667     &:first-child {
668       *padding-left: @horizontalComponentOffset;
669     }
670   }
671   // Remove bottom margin on block level help text since that's accounted for on .control-group
672   .help-block {
673     margin-bottom: 0;
674   }
675   // And apply it only to .help-block instances that follow a form control
676   input,
677   select,
678   textarea,
679   .uneditable-input,
680   .input-prepend,
681   .input-append {
682     + .help-block {
683       margin-top: @baseLineHeight / 2;
684     }
685   }
686   // Move over buttons in .form-actions to align with .controls
687   .form-actions {
688     padding-left: @horizontalComponentOffset;
689   }
690 }