Home | History | Annotate | Download | only in css
      1 /* Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file. */
      4 
      5 /* This file defines styles for form controls. The order of rule blocks is
      6  * important as there are some rules with equal specificity that rely on order
      7  * as a tiebreaker. These are marked with OVERRIDE. */
      8 
      9 /* Default state **************************************************************/
     10 
     11 :-webkit-any(button,
     12              input[type='button'],
     13              input[type='submit']):not(.custom-appearance):not(.link-button),
     14 select,
     15 input[type='checkbox'],
     16 input[type='radio'] {
     17   -webkit-appearance: none;
     18   -webkit-user-select: none;
     19   background-image: -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
     20   border: 1px solid rgba(0, 0, 0, 0.25);
     21   border-radius: 2px;
     22   box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08),
     23       inset 0 1px 2px rgba(255, 255, 255, 0.75);
     24   color: #444;
     25   font: inherit;
     26   margin: 0 1px 0 0;
     27   outline: none;
     28   text-shadow: 0 1px 0 rgb(240, 240, 240);
     29 }
     30 
     31 :-webkit-any(button,
     32              input[type='button'],
     33              input[type='submit']):not(.custom-appearance):not(.link-button),
     34 select {
     35   min-height: 2em;
     36   min-width: 4em;
     37 <if expr="is_win">
     38   /* The following platform-specific rule is necessary to get adjacent
     39    * buttons, text inputs, and so forth to align on their borders while also
     40    * aligning on the text's baselines. */
     41   padding-bottom: 1px;
     42 </if>
     43 }
     44 
     45 :-webkit-any(button,
     46              input[type='button'],
     47              input[type='submit']):not(.custom-appearance):not(.link-button) {
     48   -webkit-padding-end: 10px;
     49   -webkit-padding-start: 10px;
     50 }
     51 
     52 select {
     53   -webkit-appearance: none;
     54   -webkit-padding-end: 20px;
     55   -webkit-padding-start: 6px;
     56   /* OVERRIDE */
     57   background-image: url('../images/select.png'),
     58       -webkit-linear-gradient(#ededed, #ededed 38%, #dedede);
     59   background-position: right center;
     60   background-repeat: no-repeat;
     61 }
     62 
     63 html[dir='rtl'] select {
     64   background-position: center left;
     65 }
     66 
     67 input[type='checkbox'] {
     68 <if expr="chromeos">
     69   bottom: 1px;
     70 </if>
     71 <if expr="not chromeos">
     72   bottom: 2px;
     73 </if>
     74   height: 13px;
     75   position: relative;
     76   vertical-align: middle;
     77   width: 13px;
     78 }
     79 
     80 input[type='radio'] {
     81   /* OVERRIDE */
     82   border-radius: 100%;
     83   bottom: 1px;
     84   height: 15px;
     85   position: relative;
     86   vertical-align: middle;
     87   width: 15px;
     88 }
     89 
     90 /* TODO(estade): add more types here? */
     91 input[type='number'],
     92 input[type='password'],
     93 input[type='search'],
     94 input[type='text'],
     95 input[type='url'],
     96 input:not([type]),
     97 textarea {
     98   border: 1px solid #bfbfbf;
     99   border-radius: 2px;
    100   box-sizing: border-box;
    101   color: #444;
    102   font: inherit;
    103   margin: 0;
    104   /* Use min-height to accommodate addditional padding for touch as needed. */
    105   min-height: 2em;
    106   padding: 3px;
    107   outline: none;
    108 <if expr="is_win or is_macosx or is_ios">
    109   /* For better alignment between adjacent buttons and inputs. */
    110   padding-bottom: 4px;
    111 </if>
    112 }
    113 
    114 input[type='search'] {
    115   -webkit-appearance: textfield;
    116   /* NOTE: Keep a relatively high min-width for this so we don't obscure the end
    117    * of the default text in relatively spacious languages (i.e. German). */
    118   min-width: 160px;
    119 }
    120 
    121 /* Remove when https://bugs.webkit.org/show_bug.cgi?id=51499 is fixed.
    122  * TODO(dbeam): are there more types that would benefit from this? */
    123 input[type='search']::-webkit-textfield-decoration-container {
    124   direction: inherit;
    125 }
    126 
    127 /* Checked ********************************************************************/
    128 
    129 input[type='checkbox']:checked::before {
    130   -webkit-user-select: none;
    131   background-image: url('../images/check.png');
    132   background-size: 100% 100%;
    133   content: '';
    134   display: block;
    135   height: 100%;
    136   width: 100%;
    137 }
    138 
    139 input[type='radio']:checked::before {
    140   background-color: #666;
    141   border-radius: 100%;
    142   bottom: 3px;
    143   content: '';
    144   display: block;
    145   left: 3px;
    146   position: absolute;
    147   right: 3px;
    148   top: 3px;
    149 }
    150 
    151 /* Hover **********************************************************************/
    152 
    153 :enabled:hover:-webkit-any(
    154     select,
    155     input[type='checkbox'],
    156     input[type='radio'],
    157     :-webkit-any(
    158         button,
    159         input[type='button'],
    160         input[type='submit']):not(.custom-appearance):not(.link-button)) {
    161   background-image: -webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
    162   border-color: rgba(0, 0, 0, 0.3);
    163   box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12),
    164       inset 0 1px 2px rgba(255, 255, 255, 0.95);
    165   color: black;
    166 }
    167 
    168 :enabled:hover:-webkit-any(select) {
    169   /* OVERRIDE */
    170   background-image: url('../images/select.png'),
    171       -webkit-linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0);
    172 }
    173 
    174 /* Active *********************************************************************/
    175 
    176 :enabled:active:-webkit-any(
    177     select,
    178     input[type='checkbox'],
    179     input[type='radio'],
    180     :-webkit-any(
    181         button,
    182         input[type='button'],
    183         input[type='submit']):not(.custom-appearance):not(.link-button)) {
    184   background-image: -webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
    185   box-shadow: none;
    186   text-shadow: none;
    187 }
    188 
    189 :enabled:active:-webkit-any(select) {
    190   /* OVERRIDE */
    191   background-image: url('../images/select.png'),
    192       -webkit-linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7);
    193 }
    194 
    195 /* Disabled *******************************************************************/
    196 
    197 :disabled:-webkit-any(
    198     button,
    199     input[type='button'],
    200     input[type='submit']):not(.custom-appearance):not(.link-button),
    201 select:disabled {
    202   background-image: -webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
    203   border-color: rgba(80, 80, 80, 0.2);
    204   box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08),
    205       inset 0 1px 2px rgba(255, 255, 255, 0.75);
    206   color: #aaa;
    207 }
    208 
    209 select:disabled {
    210   /* OVERRIDE */
    211   background-image: url('../images/disabled_select.png'),
    212       -webkit-linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6);
    213 }
    214 
    215 input:disabled:-webkit-any([type='checkbox'],
    216                            [type='radio']) {
    217   opacity: .75;
    218 }
    219 
    220 input:disabled:-webkit-any([type='password'],
    221                            [type='search'],
    222                            [type='text'],
    223                            [type='url'],
    224                            :not([type])) {
    225   color: #999;
    226 }
    227 
    228 /* Focus **********************************************************************/
    229 
    230 :enabled:focus:-webkit-any(
    231     select,
    232     input[type='checkbox'],
    233     input[type='number'],
    234     input[type='password'],
    235     input[type='radio'],
    236     input[type='search'],
    237     input[type='text'],
    238     input[type='url'],
    239     input:not([type]),
    240     :-webkit-any(
    241          button,
    242          input[type='button'],
    243          input[type='submit']):not(.custom-appearance):not(.link-button)) {
    244   /* OVERRIDE */
    245   -webkit-transition: border-color 200ms;
    246   /* We use border color because it follows the border radius (unlike outline).
    247    * This is particularly noticeable on mac. */
    248   border-color: rgb(77, 144, 254);
    249   outline: none;
    250 }
    251 
    252 /* Link buttons ***************************************************************/
    253 
    254 .link-button {
    255   -webkit-box-shadow: none;
    256   background: transparent none;
    257   border: none;
    258   color: rgb(17, 85, 204);
    259   cursor: pointer;
    260   /* Input elements have -webkit-small-control which can override the body font.
    261    * Resolve this by using 'inherit'. */
    262   font: inherit;
    263   margin: 0;
    264   padding: 0;
    265 }
    266 
    267 .link-button:hover {
    268   text-decoration: underline;
    269 }
    270 
    271 .link-button:active {
    272   color: rgb(5, 37, 119);
    273   text-decoration: underline;
    274 }
    275 
    276 .link-button[disabled] {
    277   color: #999;
    278   cursor: default;
    279   text-decoration: none;
    280 }
    281 
    282 /* Checkbox/radio helpers ******************************************************
    283  *
    284  * .checkbox and .radio classes wrap labels. Checkboxes and radios should use
    285  * these classes with the markup structure:
    286  *
    287  *   <div class="checkbox">
    288  *     <label>
    289  *       <input type="checkbox"></input>
    290  *       <span>
    291  *     </label>
    292  *   </div>
    293  */
    294 
    295 :-webkit-any(.checkbox, .radio) label {
    296   /* Don't expand horizontally: <http://crbug.com/112091>. */
    297   display: -webkit-inline-box;
    298   padding-bottom: 7px;
    299   padding-top: 7px;
    300 }
    301 
    302 :-webkit-any(.checkbox, .radio) label input ~ span {
    303   -webkit-margin-start: 0.6em;
    304   -webkit-user-select: none;
    305   /* Make sure long spans wrap at the same horizontal position they start. */
    306   display: block;
    307 }
    308 
    309 :-webkit-any(.checkbox, .radio) label:hover {
    310   color: black;
    311 }
    312 
    313 label > input:disabled:-webkit-any([type='checkbox'], [type='radio']) ~ span {
    314   color: #999;
    315 }
    316