app/assets/components/paper-spinner/paper-spinner.html in polymer-paper-rails-0.2.5 vs app/assets/components/paper-spinner/paper-spinner.html in polymer-paper-rails-0.2.6
- old
+ new
@@ -27,18 +27,25 @@
}
</style>
<paper-spinner class="blue" active></paper-spinner>
+Alt attribute should be set to provide adequate context for accessibility. If not provided,
+it defaults to 'loading'.
+Empty alt can be provided to mark the element as decorative if alternative content is provided
+in another form (e.g. a text block following the spinner).
+
+##### Example
+ <paper-spinner alt="Loading contacts list" active></paper-spinner>
+
@element paper-spinner
@blurb Element providing material design circular spinner.
@status alpha
@homepage http://polymerlabs.github.io/paper-spinner
-->
-<polymer-element name="paper-spinner" attributes="active">
-
+<polymer-element name="paper-spinner" attributes="active alt" role="progressbar">
<template>
<link rel="stylesheet" href="paper-spinner.css">
<div id="spinnerContainer">
<div class="spinner-layer blue">
@@ -95,22 +102,56 @@
*
* @attribute active
* @type boolean
* @default false
*/
- active: {value: false, reflect: true}
+ active: {value: false, reflect: true},
+
+ /**
+ * Alternative text content for accessibility support.
+ * If alt is present, it will add an aria-label whose content matches alt when active.
+ * If alt is not present, it will default to 'loading' as the alt value.
+ * @attribute alt
+ * @type string
+ * @default 'loading'
+ */
+ alt: {value: 'loading', reflect: true}
},
+ ready: function() {
+ // Allow user-provided `aria-label` take preference to any other text alternative.
+ if (this.hasAttribute('aria-label')) {
+ this.alt = this.getAttribute('aria-label');
+ } else {
+ this.setAttribute('aria-label', this.alt);
+ }
+ if (!this.active) {
+ this.setAttribute('aria-hidden', 'true');
+ }
+ },
+
activeChanged: function() {
if (this.active) {
+ this.$.spinnerContainer.classList.remove('cooldown');
this.$.spinnerContainer.classList.add('active');
+ this.removeAttribute('aria-hidden');
} else {
- this.$.spinnerContainer.classList.add('warmdown');
+ this.$.spinnerContainer.classList.add('cooldown');
+ this.setAttribute('aria-hidden', 'true');
}
},
+ altChanged: function() {
+ if (this.alt === '') {
+ this.setAttribute('aria-hidden', 'true');
+ } else {
+ this.removeAttribute('aria-hidden');
+ }
+ this.setAttribute('aria-label', this.alt);
+ },
+
reset: function() {
- this.$.spinnerContainer.classList.remove('active', 'warmdown');
+ this.$.spinnerContainer.classList.remove('active', 'cooldown');
}
});
</script>
</polymer-element>