OLD | NEW |
(Empty) | |
| 1 <!-- |
| 2 @license |
| 3 Copyright (c) 2016 The Polymer Project Authors. All rights reserved. |
| 4 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt |
| 5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| 6 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt |
| 7 Code distributed by Google as part of the polymer project is also |
| 8 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt |
| 9 --> |
| 10 |
| 11 <link rel="import" href="../polymer/polymer.html"> |
| 12 <link rel="import" href="../paper-styles/default-theme.html"> |
| 13 <link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html"
> |
| 14 |
| 15 <!-- |
| 16 Material design: [Checkbox](https://www.google.com/design/spec/components/select
ion-controls.html#selection-controls-checkbox) |
| 17 |
| 18 `paper-checkbox` is a button that can be either checked or unchecked. User |
| 19 can tap the checkbox to check or uncheck it. Usually you use checkboxes |
| 20 to allow user to select multiple options from a set. If you have a single |
| 21 ON/OFF option, avoid using a single checkbox and use `paper-toggle-button` |
| 22 instead. |
| 23 |
| 24 Example: |
| 25 |
| 26 <paper-checkbox>label</paper-checkbox> |
| 27 |
| 28 <paper-checkbox checked> label</paper-checkbox> |
| 29 |
| 30 ### Styling |
| 31 |
| 32 The following custom properties and mixins are available for styling: |
| 33 |
| 34 Custom property | Description | Default |
| 35 ----------------|-------------|---------- |
| 36 `--paper-checkbox-unchecked-background-color` | Checkbox background color when t
he input is not checked | `transparent` |
| 37 `--paper-checkbox-unchecked-color` | Checkbox border color when the input is not
checked | `--primary-text-color` |
| 38 `--paper-checkbox-unchecked-ink-color` | Selected/focus ripple color when the in
put is not checked | `--primary-text-color` |
| 39 `--paper-checkbox-checked-color` | Checkbox color when the input is checked | `-
-primary-color` |
| 40 `--paper-checkbox-checked-ink-color` | Selected/focus ripple color when the inpu
t is checked | `--primary-color` |
| 41 `--paper-checkbox-checkmark-color` | Checkmark color | `white` |
| 42 `--paper-checkbox-label-color` | Label color | `--primary-text-color` |
| 43 `--paper-checkbox-label-checked-color` | Label color when the input is checked |
`--paper-checkbox-label-color` |
| 44 `--paper-checkbox-label-spacing` | Spacing between the label and the checkbox |
`8px` |
| 45 `--paper-checkbox-label` | Mixin applied to the label | `{}` |
| 46 `--paper-checkbox-label-checked` | Mixin applied to the label when the input is
checked | `{}` |
| 47 `--paper-checkbox-error-color` | Checkbox color when invalid | `--error-color` |
| 48 `--paper-checkbox-size` | Size of the checkbox | `18px` |
| 49 `--paper-checkbox-ink-size` | Size of the ripple | `48px` |
| 50 `--paper-checkbox-margin` | Margin around the checkbox container | `initial` |
| 51 `--paper-checkbox-vertical-align` | Vertical alignment of the checkbox container
| `middle` |
| 52 |
| 53 This element applies the mixin `--paper-font-common-base` but does not import `p
aper-styles/typography.html`. |
| 54 In order to apply the `Roboto` font to this element, make sure you've imported `
paper-styles/typography.html`. |
| 55 |
| 56 @demo demo/index.html |
| 57 --> |
| 58 |
| 59 <dom-module id="paper-checkbox"> |
| 60 <template strip-whitespace> |
| 61 <style> |
| 62 :host { |
| 63 display: inline-block; |
| 64 white-space: nowrap; |
| 65 cursor: pointer; |
| 66 --calculated-paper-checkbox-size: var(--paper-checkbox-size, 18px); |
| 67 /* -1px is a sentinel for the default and is replaced in `attached`. */ |
| 68 --calculated-paper-checkbox-ink-size: var(--paper-checkbox-ink-size, -1p
x); |
| 69 @apply(--paper-font-common-base); |
| 70 line-height: 0; |
| 71 -webkit-tap-highlight-color: transparent; |
| 72 } |
| 73 |
| 74 :host([hidden]) { |
| 75 display: none !important; |
| 76 } |
| 77 |
| 78 :host(:focus) { |
| 79 outline: none; |
| 80 } |
| 81 |
| 82 .hidden { |
| 83 display: none; |
| 84 } |
| 85 |
| 86 #checkboxContainer { |
| 87 display: inline-block; |
| 88 position: relative; |
| 89 width: var(--calculated-paper-checkbox-size); |
| 90 height: var(--calculated-paper-checkbox-size); |
| 91 min-width: var(--calculated-paper-checkbox-size); |
| 92 margin: var(--paper-checkbox-margin, initial); |
| 93 vertical-align: var(--paper-checkbox-vertical-align, middle); |
| 94 background-color: var(--paper-checkbox-unchecked-background-color, trans
parent); |
| 95 } |
| 96 |
| 97 #ink { |
| 98 position: absolute; |
| 99 |
| 100 /* Center the ripple in the checkbox by negative offsetting it by |
| 101 * (inkWidth - rippleWidth) / 2 */ |
| 102 top: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calcu
lated-paper-checkbox-size)) / 2); |
| 103 left: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--calc
ulated-paper-checkbox-size)) / 2); |
| 104 width: var(--calculated-paper-checkbox-ink-size); |
| 105 height: var(--calculated-paper-checkbox-ink-size); |
| 106 color: var(--paper-checkbox-unchecked-ink-color, var(--primary-text-colo
r)); |
| 107 opacity: 0.6; |
| 108 pointer-events: none; |
| 109 } |
| 110 |
| 111 :host-context([dir="rtl"]) #ink { |
| 112 right: calc(0px - (var(--calculated-paper-checkbox-ink-size) - var(--cal
culated-paper-checkbox-size)) / 2); |
| 113 left: auto; |
| 114 } |
| 115 |
| 116 #ink[checked] { |
| 117 color: var(--paper-checkbox-checked-ink-color, var(--primary-color)); |
| 118 } |
| 119 |
| 120 #checkbox { |
| 121 position: relative; |
| 122 box-sizing: border-box; |
| 123 height: 100%; |
| 124 border: solid 2px; |
| 125 border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-c
olor)); |
| 126 border-radius: 2px; |
| 127 pointer-events: none; |
| 128 -webkit-transition: background-color 140ms, border-color 140ms; |
| 129 transition: background-color 140ms, border-color 140ms; |
| 130 } |
| 131 |
| 132 /* checkbox checked animations */ |
| 133 #checkbox.checked #checkmark { |
| 134 -webkit-animation: checkmark-expand 140ms ease-out forwards; |
| 135 animation: checkmark-expand 140ms ease-out forwards; |
| 136 } |
| 137 |
| 138 @-webkit-keyframes checkmark-expand { |
| 139 0% { |
| 140 -webkit-transform: scale(0, 0) rotate(45deg); |
| 141 } |
| 142 100% { |
| 143 -webkit-transform: scale(1, 1) rotate(45deg); |
| 144 } |
| 145 } |
| 146 |
| 147 @keyframes checkmark-expand { |
| 148 0% { |
| 149 transform: scale(0, 0) rotate(45deg); |
| 150 } |
| 151 100% { |
| 152 transform: scale(1, 1) rotate(45deg); |
| 153 } |
| 154 } |
| 155 |
| 156 #checkbox.checked { |
| 157 background-color: var(--paper-checkbox-checked-color, var(--primary-colo
r)); |
| 158 border-color: var(--paper-checkbox-checked-color, var(--primary-color)); |
| 159 } |
| 160 |
| 161 #checkmark { |
| 162 position: absolute; |
| 163 width: 36%; |
| 164 height: 70%; |
| 165 border-style: solid; |
| 166 border-top: none; |
| 167 border-left: none; |
| 168 border-right-width: calc(2/15 * var(--calculated-paper-checkbox-size)); |
| 169 border-bottom-width: calc(2/15 * var(--calculated-paper-checkbox-size)); |
| 170 border-color: var(--paper-checkbox-checkmark-color, white); |
| 171 -webkit-transform-origin: 97% 86%; |
| 172 transform-origin: 97% 86%; |
| 173 box-sizing: content-box; /* protect against page-level box-sizing */ |
| 174 } |
| 175 |
| 176 :host-context([dir="rtl"]) #checkmark { |
| 177 -webkit-transform-origin: 50% 14%; |
| 178 transform-origin: 50% 14%; |
| 179 } |
| 180 |
| 181 /* label */ |
| 182 #checkboxLabel { |
| 183 position: relative; |
| 184 display: inline-block; |
| 185 vertical-align: middle; |
| 186 padding-left: var(--paper-checkbox-label-spacing, 8px); |
| 187 white-space: normal; |
| 188 line-height: normal; |
| 189 color: var(--paper-checkbox-label-color, var(--primary-text-color)); |
| 190 @apply(--paper-checkbox-label); |
| 191 } |
| 192 |
| 193 :host([checked]) #checkboxLabel { |
| 194 color: var(--paper-checkbox-label-checked-color, var(--paper-checkbox-la
bel-color, var(--primary-text-color))); |
| 195 @apply(--paper-checkbox-label-checked); |
| 196 } |
| 197 |
| 198 :host-context([dir="rtl"]) #checkboxLabel { |
| 199 padding-right: var(--paper-checkbox-label-spacing, 8px); |
| 200 padding-left: 0; |
| 201 } |
| 202 |
| 203 #checkboxLabel[hidden] { |
| 204 display: none; |
| 205 } |
| 206 |
| 207 /* disabled state */ |
| 208 |
| 209 :host([disabled]) #checkbox { |
| 210 opacity: 0.5; |
| 211 border-color: var(--paper-checkbox-unchecked-color, var(--primary-text-c
olor)); |
| 212 } |
| 213 |
| 214 :host([disabled][checked]) #checkbox { |
| 215 background-color: var(--paper-checkbox-unchecked-color, var(--primary-te
xt-color)); |
| 216 opacity: 0.5; |
| 217 } |
| 218 |
| 219 :host([disabled]) #checkboxLabel { |
| 220 opacity: 0.65; |
| 221 } |
| 222 |
| 223 /* invalid state */ |
| 224 #checkbox.invalid:not(.checked) { |
| 225 border-color: var(--paper-checkbox-error-color, var(--error-color)); |
| 226 } |
| 227 </style> |
| 228 |
| 229 <div id="checkboxContainer"> |
| 230 <div id="checkbox" class$="[[_computeCheckboxClass(checked, invalid)]]"> |
| 231 <div id="checkmark" class$="[[_computeCheckmarkClass(checked)]]"></div> |
| 232 </div> |
| 233 </div> |
| 234 |
| 235 <div id="checkboxLabel"><content></content></div> |
| 236 </template> |
| 237 |
| 238 <script> |
| 239 Polymer({ |
| 240 is: 'paper-checkbox', |
| 241 |
| 242 behaviors: [ |
| 243 Polymer.PaperCheckedElementBehavior |
| 244 ], |
| 245 |
| 246 hostAttributes: { |
| 247 role: 'checkbox', |
| 248 'aria-checked': false, |
| 249 tabindex: 0 |
| 250 }, |
| 251 |
| 252 properties: { |
| 253 /** |
| 254 * Fired when the checked state changes due to user interaction. |
| 255 * |
| 256 * @event change |
| 257 */ |
| 258 |
| 259 /** |
| 260 * Fired when the checked state changes. |
| 261 * |
| 262 * @event iron-change |
| 263 */ |
| 264 ariaActiveAttribute: { |
| 265 type: String, |
| 266 value: 'aria-checked' |
| 267 } |
| 268 }, |
| 269 |
| 270 attached: function() { |
| 271 var inkSize = this.getComputedStyleValue('--calculated-paper-checkbox-in
k-size').trim(); |
| 272 // If unset, compute and set the default `--paper-checkbox-ink-size`. |
| 273 if (inkSize === '-1px') { |
| 274 var checkboxSize = parseFloat(this.getComputedStyleValue('--calculated
-paper-checkbox-size').trim()); |
| 275 var defaultInkSize = Math.floor((8 / 3) * checkboxSize); |
| 276 |
| 277 // The checkbox and ripple need to have the same parity so that their |
| 278 // centers align. |
| 279 if (defaultInkSize % 2 !== checkboxSize % 2) { |
| 280 defaultInkSize++; |
| 281 } |
| 282 |
| 283 this.customStyle['--paper-checkbox-ink-size'] = defaultInkSize + 'px'; |
| 284 this.updateStyles(); |
| 285 } |
| 286 }, |
| 287 |
| 288 _computeCheckboxClass: function(checked, invalid) { |
| 289 var className = ''; |
| 290 if (checked) { |
| 291 className += 'checked '; |
| 292 } |
| 293 if (invalid) { |
| 294 className += 'invalid'; |
| 295 } |
| 296 return className; |
| 297 }, |
| 298 |
| 299 _computeCheckmarkClass: function(checked) { |
| 300 return checked ? '' : 'hidden'; |
| 301 }, |
| 302 |
| 303 // create ripple inside the checkboxContainer |
| 304 _createRipple: function() { |
| 305 this._rippleContainer = this.$.checkboxContainer; |
| 306 return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this); |
| 307 } |
| 308 |
| 309 }); |
| 310 </script> |
| 311 </dom-module> |
OLD | NEW |