| OLD | NEW |
| 1 <!-- | 1 <!-- |
| 2 @license |
| 2 Copyright (c) 2015 The Polymer Project Authors. All rights reserved. | 3 Copyright (c) 2015 The Polymer Project Authors. All rights reserved. |
| 3 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt | 4 This code may only be used under the BSD style license found at http://polymer.g
ithub.io/LICENSE.txt |
| 4 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt | 5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt |
| 5 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt | 6 The complete set of contributors may be found at http://polymer.github.io/CONTRI
BUTORS.txt |
| 6 Code distributed by Google as part of the polymer project is also | 7 Code distributed by Google as part of the polymer project is also |
| 7 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt | 8 subject to an additional IP rights grant found at http://polymer.github.io/PATEN
TS.txt |
| 8 --> | 9 --> |
| 9 | 10 |
| 10 <link rel="import" href="../polymer/polymer.html"> | 11 <link rel="import" href="../polymer/polymer.html"> |
| 12 <link rel="import" href="../paper-behaviors/paper-checked-element-behavior.html"
> |
| 11 <link rel="import" href="../paper-ripple/paper-ripple.html"> | 13 <link rel="import" href="../paper-ripple/paper-ripple.html"> |
| 12 <link rel="import" href="../paper-styles/default-theme.html"> | 14 <link rel="import" href="../paper-styles/default-theme.html"> |
| 13 <link rel="import" href="../paper-behaviors/paper-inky-focus-behavior.html"> | |
| 14 <link rel="import" href="../iron-checked-element-behavior/iron-checked-element-b
ehavior.html"> | |
| 15 | 15 |
| 16 <!-- | 16 <!-- |
| 17 Material design: [Radio button](https://www.google.com/design/spec/components/se
lection-controls.html#selection-controls-radio-button) |
| 18 |
| 17 `paper-radio-button` is a button that can be either checked or unchecked. | 19 `paper-radio-button` is a button that can be either checked or unchecked. |
| 18 User can tap the radio button to check or uncheck it. | 20 User can tap the radio button to check or uncheck it. |
| 19 | 21 |
| 20 Use a `<paper-radio-group>` to group a set of radio buttons. When radio buttons | 22 Use a `<paper-radio-group>` to group a set of radio buttons. When radio buttons |
| 21 are inside a radio group, exactly one radio button in the group can be checked | 23 are inside a radio group, exactly one radio button in the group can be checked |
| 22 at any time. | 24 at any time. |
| 23 | 25 |
| 24 Example: | 26 Example: |
| 25 | 27 |
| 26 <paper-radio-button></paper-radio-button> | 28 <paper-radio-button></paper-radio-button> |
| 27 <paper-radio-button>Item label</paper-radio-button> | 29 <paper-radio-button>Item label</paper-radio-button> |
| 28 | 30 |
| 29 ### Styling | 31 ### Styling |
| 30 | 32 |
| 31 The following custom properties and mixins are available for styling: | 33 The following custom properties and mixins are available for styling: |
| 32 | 34 |
| 33 Custom property | Description | Default | 35 Custom property | Description | Default |
| 34 ----------------|-------------|---------- | 36 ----------------|-------------|---------- |
| 35 `--paper-radio-button-unchecked-background-color` | Radio button background colo
r when the input is not checked | `transparent` | 37 `--paper-radio-button-unchecked-background-color` | Radio button background colo
r when the input is not checked | `transparent` |
| 36 `--paper-radio-button-unchecked-color` | Radio button color when the input is no
t checked | `--primary-text-color` | 38 `--paper-radio-button-unchecked-color` | Radio button color when the input is no
t checked | `--primary-text-color` |
| 37 `--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when th
e input is not checked | `--primary-text-color` | 39 `--paper-radio-button-unchecked-ink-color` | Selected/focus ripple color when th
e input is not checked | `--primary-text-color` |
| 38 `--paper-radio-button-checked-color` | Radio button color when the input is chec
ked | `--default-primary-color` | 40 `--paper-radio-button-checked-color` | Radio button color when the input is chec
ked | `--default-primary-color` |
| 39 `--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the
input is checked | `--default-primary-color` | 41 `--paper-radio-button-checked-ink-color` | Selected/focus ripple color when the
input is checked | `--default-primary-color` |
| 40 `--paper-radio-button-label-color` | Label color | `--primary-text-color` | 42 `--paper-radio-button-label-color` | Label color | `--primary-text-color` |
| 43 `--paper-radio-button-label-spacing` | Spacing between the label and the button
| `10px` |
| 41 | 44 |
| 42 @group Paper Elements | 45 @group Paper Elements |
| 43 @element paper-radio-button | 46 @element paper-radio-button |
| 44 @hero hero.svg | 47 @hero hero.svg |
| 45 @demo demo/index.html | 48 @demo demo/index.html |
| 46 --> | 49 --> |
| 47 | 50 |
| 48 <dom-module id="paper-radio-button"> | 51 <dom-module id="paper-radio-button"> |
| 49 <template> | 52 <template strip-whitespace> |
| 50 <style> | 53 <style> |
| 51 :host { | 54 :host { |
| 52 display: inline-block; | 55 display: inline-block; |
| 53 white-space: nowrap; | 56 white-space: nowrap; |
| 54 } | 57 } |
| 55 | 58 |
| 56 :host(:focus) { | 59 :host(:focus) { |
| 57 outline: none; | 60 outline: none; |
| 58 } | 61 } |
| 59 | 62 |
| 60 #radioContainer { | 63 #radioContainer { |
| 61 display: inline-block; | 64 display: inline-block; |
| 62 position: relative; | 65 position: relative; |
| 63 width: 16px; | 66 width: 16px; |
| 64 height: 16px; | 67 height: 16px; |
| 65 cursor: pointer; | 68 cursor: pointer; |
| 66 vertical-align: middle; | 69 vertical-align: middle; |
| 67 } | 70 } |
| 68 | 71 |
| 69 :host #ink { | 72 #ink { |
| 70 position: absolute; | 73 position: absolute; |
| 71 top: -16px; | 74 top: -16px; |
| 72 left: -16px; | 75 left: -16px; |
| 73 width: 48px; | 76 width: 48px; |
| 74 height: 48px; | 77 height: 48px; |
| 75 color: var(--paper-radio-button-unchecked-ink-color, --primary-text-colo
r); | 78 color: var(--paper-radio-button-unchecked-ink-color, --primary-text-colo
r); |
| 76 opacity: 0.6; | 79 opacity: 0.6; |
| 77 pointer-events: none; | 80 pointer-events: none; |
| 78 } | 81 } |
| 79 | 82 |
| 80 :host #ink[checked] { | 83 :host-context([dir="rtl"]) #ink { |
| 84 right: -15px; |
| 85 left: auto; |
| 86 } |
| 87 |
| 88 #ink[checked] { |
| 81 color: var(--paper-radio-button-checked-ink-color, --default-primary-col
or); | 89 color: var(--paper-radio-button-checked-ink-color, --default-primary-col
or); |
| 82 } | 90 } |
| 83 | 91 |
| 84 :host #offRadio { | 92 #offRadio { |
| 85 position: absolute; | 93 position: absolute; |
| 86 box-sizing: content-box; | 94 box-sizing: content-box; |
| 87 top: 0px; | 95 top: 0px; |
| 88 left: 0px; | 96 left: 0px; |
| 97 right: 0px; |
| 89 width: 12px; | 98 width: 12px; |
| 90 height: 12px; | 99 height: 12px; |
| 91 border-radius: 50%; | 100 border-radius: 50%; |
| 92 border: solid 2px; | 101 border: solid 2px; |
| 93 background-color: var(--paper-radio-button-unchecked-background-color, t
ransparent); | 102 background-color: var(--paper-radio-button-unchecked-background-color, t
ransparent); |
| 94 border-color: var(--paper-radio-button-unchecked-color, --primary-text-c
olor); | 103 border-color: var(--paper-radio-button-unchecked-color, --primary-text-c
olor); |
| 95 transition: border-color 0.28s; | 104 transition: border-color 0.28s; |
| 96 } | 105 } |
| 97 | 106 |
| 98 :host #onRadio { | 107 #onRadio { |
| 99 position: absolute; | 108 position: absolute; |
| 100 box-sizing: content-box; | 109 box-sizing: content-box; |
| 101 top: 4px; | 110 top: 4px; |
| 102 left: 4px; | 111 left: 4px; |
| 112 right: 4px; |
| 103 width: 8px; | 113 width: 8px; |
| 104 height: 8px; | 114 height: 8px; |
| 105 border-radius: 50%; | 115 border-radius: 50%; |
| 106 background-color: var(--paper-radio-button-checked-color, --default-prim
ary-color); | 116 background-color: var(--paper-radio-button-checked-color, --default-prim
ary-color); |
| 107 -webkit-transform: scale(0); | 117 -webkit-transform: scale(0); |
| 108 transform: scale(0); | 118 transform: scale(0); |
| 109 transition: -webkit-transform ease 0.28s; | 119 transition: -webkit-transform ease 0.28s; |
| 110 transition: transform ease 0.28s; | 120 transition: transform ease 0.28s; |
| 111 } | 121 } |
| 112 | 122 |
| 113 :host([checked]) #offRadio { | 123 :host([checked]) #offRadio { |
| 114 border-color: var(--paper-radio-button-checked-color, --default-primary-
color); | 124 border-color: var(--paper-radio-button-checked-color, --default-primary-
color); |
| 115 } | 125 } |
| 116 | 126 |
| 117 :host([checked]) #onRadio { | 127 :host([checked]) #onRadio { |
| 118 -webkit-transform: scale(1); | 128 -webkit-transform: scale(1); |
| 119 transform: scale(1); | 129 transform: scale(1); |
| 120 } | 130 } |
| 121 | 131 |
| 122 #radioLabel { | 132 #radioLabel { |
| 123 position: relative; | 133 position: relative; |
| 124 display: inline-block; | 134 display: inline-block; |
| 125 vertical-align: middle; | 135 vertical-align: middle; |
| 126 margin-left: 10px; | 136 margin-left: var(--paper-radio-button-label-spacing, 10px); |
| 127 white-space: normal; | 137 white-space: normal; |
| 128 pointer-events: none; | 138 pointer-events: none; |
| 129 color: var(--paper-radio-button-label-color, --primary-text-color); | 139 color: var(--paper-radio-button-label-color, --primary-text-color); |
| 130 } | 140 } |
| 131 | 141 |
| 142 :host-context([dir="rtl"]) #radioLabel { |
| 143 margin-left: 0px; |
| 144 margin-right: var(--paper-radio-button-label-spacing, 10px); |
| 145 } |
| 146 |
| 132 #radioLabel[hidden] { | 147 #radioLabel[hidden] { |
| 133 display: none; | 148 display: none; |
| 134 } | 149 } |
| 135 | 150 |
| 136 /* disabled state */ | 151 /* disabled state */ |
| 137 :host([disabled]) { | 152 :host([disabled]) { |
| 138 pointer-events: none; | 153 pointer-events: none; |
| 139 } | 154 } |
| 140 | 155 |
| 141 :host([disabled]) #offRadio { | 156 :host([disabled]) #offRadio { |
| 142 border-color: var(--paper-radio-button-unchecked-color, --primary-text-c
olor); | 157 border-color: var(--paper-radio-button-unchecked-color, --primary-text-c
olor); |
| 143 opacity: 0.5; | 158 opacity: 0.5; |
| 144 } | 159 } |
| 145 | 160 |
| 146 :host([disabled][checked]) #onRadio { | 161 :host([disabled][checked]) #onRadio { |
| 147 background-color: var(--paper-radio-button-unchecked-color, --primary-te
xt-color); | 162 background-color: var(--paper-radio-button-unchecked-color, --primary-te
xt-color); |
| 148 opacity: 0.5; | 163 opacity: 0.5; |
| 149 } | 164 } |
| 150 | 165 |
| 151 :host([disabled]) #radioLabel { | 166 :host([disabled]) #radioLabel { |
| 152 /* slightly darker than the button, so that it's readable */ | 167 /* slightly darker than the button, so that it's readable */ |
| 153 opacity: 0.65; | 168 opacity: 0.65; |
| 154 } | 169 } |
| 155 </style> | 170 </style> |
| 156 | 171 |
| 157 <div id="radioContainer"> | 172 <div id="radioContainer"> |
| 158 <div id="offRadio"></div> | 173 <div id="offRadio"></div> |
| 159 <div id="onRadio"></div> | 174 <div id="onRadio"></div> |
| 160 <paper-ripple id="ink" class="circle" center checked$="[[checked]]"></pape
r-ripple> | |
| 161 </div> | 175 </div> |
| 162 | 176 |
| 163 <div id="radioLabel"><content></content></div> | 177 <div id="radioLabel"><content></content></div> |
| 164 | |
| 165 </template> | 178 </template> |
| 166 | 179 |
| 167 <script> | 180 <script> |
| 168 Polymer({ | 181 Polymer({ |
| 169 is: 'paper-radio-button', | 182 is: 'paper-radio-button', |
| 170 | 183 |
| 171 behaviors: [ | 184 behaviors: [ |
| 172 Polymer.PaperInkyFocusBehavior, | 185 Polymer.PaperCheckedElementBehavior |
| 173 Polymer.IronCheckedElementBehavior | |
| 174 ], | 186 ], |
| 175 | 187 |
| 176 hostAttributes: { | 188 hostAttributes: { |
| 177 role: 'radio', | 189 role: 'radio', |
| 178 'aria-checked': false, | 190 'aria-checked': false, |
| 179 tabindex: 0 | 191 tabindex: 0 |
| 180 }, | 192 }, |
| 181 | 193 |
| 182 properties: { | 194 properties: { |
| 183 /** | 195 /** |
| 184 * Fired when the checked state changes due to user interaction. | 196 * Fired when the checked state changes due to user interaction. |
| 185 * | 197 * |
| 186 * @event change | 198 * @event change |
| 187 */ | 199 */ |
| 188 | 200 |
| 189 /** | 201 /** |
| 190 * Fired when the checked state changes. | 202 * Fired when the checked state changes. |
| 191 * | 203 * |
| 192 * @event iron-change | 204 * @event iron-change |
| 193 */ | 205 */ |
| 194 | 206 |
| 195 ariaActiveAttribute: { | 207 ariaActiveAttribute: { |
| 196 value: 'aria-checked' | 208 type: String, |
| 197 } | 209 value: 'aria-checked' |
| 198 }, | |
| 199 | |
| 200 attached: function() { | |
| 201 this._isReady = true; | |
| 202 | |
| 203 // Don't stomp over a user-set aria-label. | |
| 204 if (!this.getAttribute('aria-label')) { | |
| 205 this.updateAriaLabel(); | |
| 206 } | 210 } |
| 207 }, | 211 }, |
| 208 | 212 |
| 209 /** | 213 // create the element ripple inside the `radioContainer` |
| 210 * Update the checkbox aria-label. This is a temporary workaround not | 214 _createRipple: function() { |
| 211 * being able to observe changes in <content> | 215 this._rippleContainer = this.$.radioContainer; |
| 212 * (see: https://github.com/Polymer/polymer/issues/1773) | 216 return Polymer.PaperInkyFocusBehaviorImpl._createRipple.call(this); |
| 213 * | |
| 214 * Call this if you manually change the contents of the checkbox | |
| 215 * and want the aria-label to match the new contents. | |
| 216 */ | |
| 217 updateAriaLabel: function() { | |
| 218 this.setAttribute('aria-label', Polymer.dom(this).textContent.trim()); | |
| 219 }, | |
| 220 | |
| 221 _buttonStateChanged: function() { | |
| 222 if (this.disabled) { | |
| 223 return; | |
| 224 } | |
| 225 if (this._isReady) { | |
| 226 this.checked = this.active; | |
| 227 } | |
| 228 } | 217 } |
| 229 }) | 218 }) |
| 230 </script> | 219 </script> |
| 231 | |
| 232 </dom-module> | 220 </dom-module> |
| OLD | NEW |