material_design_lite-rails 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cfdf556de039619cbef0ad3cdb17d9b6ab48df49
4
- data.tar.gz: 1f5f32e46cc6eb9bdb13e6ad2ddcec9909533379
3
+ metadata.gz: d3b63e9602083c05a4eee06a292a0833fec32e92
4
+ data.tar.gz: c5871a118f4e38855a0add8db3ee3320f1111415
5
5
  SHA512:
6
- metadata.gz: 92761b8b19607057e7e20fe2cd2c4b747307ccaac0e17532d5f6cee64b448638d3f6c9334f281d80b551ec579bd6b29d5bbb8b13491c655f915fef46bd1fe20b
7
- data.tar.gz: 15debac0c7e16d48b4d453aabc148ee9282e59cd973565ba0ca8a5624ecab2da68795db5b2a2e1e413274346cc08e5194767a9396ba8e548e3ace52aadf8c7a0
6
+ metadata.gz: 149b17475b32bd9abe60e766cd97c80c2cf2e916bd2db4ba10312fa1b83d0693fd7eb61594c60e896534be436e1ef5e52db38b3bf5f5bdbd33167691d25d40fb
7
+ data.tar.gz: 319b801a7fd0f8404b8bae6cea2b133622a13953d80ba2d1f83546885c5e926a8e6ce40e0f5316a51325d00c6d548803059e3954f8a475c6f371d41fa4ec84b3
@@ -1,5 +1,5 @@
1
1
  module MaterialDesignLite
2
2
  module Rails
3
- VERSION = "1.0.3"
3
+ VERSION = "1.0.5"
4
4
  end
5
5
  end
@@ -26,7 +26,66 @@
26
26
  * @author Jason Mayes.
27
27
  */
28
28
  /* exported componentHandler */
29
- window.componentHandler = (function() {
29
+
30
+ // Pre-defining the componentHandler interface, for closure documentation and
31
+ // static verification.
32
+ var componentHandler = {
33
+ /**
34
+ * Searches existing DOM for elements of our component type and upgrades them
35
+ * if they have not already been upgraded.
36
+ *
37
+ * @param {string=} optJsClass the programatic name of the element class we
38
+ * need to create a new instance of.
39
+ * @param {string=} optCssClass the name of the CSS class elements of this
40
+ * type will have.
41
+ */
42
+ upgradeDom: function(optJsClass, optCssClass) {},
43
+ /**
44
+ * Upgrades a specific element rather than all in the DOM.
45
+ *
46
+ * @param {!Element} element The element we wish to upgrade.
47
+ * @param {string=} optJsClass Optional name of the class we want to upgrade
48
+ * the element to.
49
+ */
50
+ upgradeElement: function(element, optJsClass) {},
51
+ /**
52
+ * Upgrades a specific list of elements rather than all in the DOM.
53
+ *
54
+ * @param {!Element|!Array<!Element>|!NodeList|!HTMLCollection} elements
55
+ * The elements we wish to upgrade.
56
+ */
57
+ upgradeElements: function(elements) {},
58
+ /**
59
+ * Upgrades all registered components found in the current DOM. This is
60
+ * automatically called on window load.
61
+ */
62
+ upgradeAllRegistered: function() {},
63
+ /**
64
+ * Allows user to be alerted to any upgrades that are performed for a given
65
+ * component type
66
+ *
67
+ * @param {string} jsClass The class name of the MDL component we wish
68
+ * to hook into for any upgrades performed.
69
+ * @param {function(!HTMLElement)} callback The function to call upon an
70
+ * upgrade. This function should expect 1 parameter - the HTMLElement which
71
+ * got upgraded.
72
+ */
73
+ registerUpgradedCallback: function(jsClass, callback) {},
74
+ /**
75
+ * Registers a class for future use and attempts to upgrade existing DOM.
76
+ *
77
+ * @param {componentHandler.ComponentConfigPublic} config the registration configuration
78
+ */
79
+ register: function(config) {},
80
+ /**
81
+ * Downgrade either a given node, an array of nodes, or a NodeList.
82
+ *
83
+ * @param {!Node|!Array<!Node>|!NodeList} nodes
84
+ */
85
+ downgradeElements: function(nodes) {}
86
+ };
87
+
88
+ componentHandler = (function() {
30
89
  'use strict';
31
90
 
32
91
  /** @type {!Array<componentHandler.ComponentConfig>} */
@@ -42,15 +101,15 @@ window.componentHandler = (function() {
42
101
  * Searches registered components for a class we are interested in using.
43
102
  * Optionally replaces a match with passed object if specified.
44
103
  *
45
- * @param {String} name The name of a class we want to use.
104
+ * @param {string} name The name of a class we want to use.
46
105
  * @param {componentHandler.ComponentConfig=} optReplace Optional object to replace match with.
47
- * @return {!Object|Boolean}
106
+ * @return {!Object|boolean}
48
107
  * @private
49
108
  */
50
109
  function findRegisteredClass_(name, optReplace) {
51
110
  for (var i = 0; i < registeredComponents_.length; i++) {
52
111
  if (registeredComponents_[i].className === name) {
53
- if (optReplace !== undefined) {
112
+ if (typeof optReplace !== 'undefined') {
54
113
  registeredComponents_[i] = optReplace;
55
114
  }
56
115
  return registeredComponents_[i];
@@ -62,8 +121,8 @@ window.componentHandler = (function() {
62
121
  /**
63
122
  * Returns an array of the classNames of the upgraded classes on the element.
64
123
  *
65
- * @param {!HTMLElement} element The element to fetch data from.
66
- * @return {!Array<String>}
124
+ * @param {!Element} element The element to fetch data from.
125
+ * @return {!Array<string>}
67
126
  * @private
68
127
  */
69
128
  function getUpgradedListOfElement_(element) {
@@ -76,9 +135,9 @@ window.componentHandler = (function() {
76
135
  * Returns true if the given element has already been upgraded for the given
77
136
  * class.
78
137
  *
79
- * @param {!HTMLElement} element The element we want to check.
80
- * @param {String} jsClass The class to check for.
81
- * @returns {Boolean}
138
+ * @param {!Element} element The element we want to check.
139
+ * @param {string} jsClass The class to check for.
140
+ * @returns {boolean}
82
141
  * @private
83
142
  */
84
143
  function isElementUpgraded_(element, jsClass) {
@@ -90,20 +149,21 @@ window.componentHandler = (function() {
90
149
  * Searches existing DOM for elements of our component type and upgrades them
91
150
  * if they have not already been upgraded.
92
151
  *
93
- * @param {String=} optJsClass the programatic name of the element class we
152
+ * @param {string=} optJsClass the programatic name of the element class we
94
153
  * need to create a new instance of.
95
- * @param {String=} optCssClass the name of the CSS class elements of this
154
+ * @param {string=} optCssClass the name of the CSS class elements of this
96
155
  * type will have.
97
156
  */
98
157
  function upgradeDomInternal(optJsClass, optCssClass) {
99
- if (optJsClass === undefined && optCssClass === undefined) {
158
+ if (typeof optJsClass === 'undefined' &&
159
+ typeof optCssClass === 'undefined') {
100
160
  for (var i = 0; i < registeredComponents_.length; i++) {
101
161
  upgradeDomInternal(registeredComponents_[i].className,
102
162
  registeredComponents_[i].cssClass);
103
163
  }
104
164
  } else {
105
- var jsClass = /** @type {String} */ (optJsClass);
106
- if (optCssClass === undefined) {
165
+ var jsClass = /** @type {string} */ (optJsClass);
166
+ if (typeof optCssClass === 'undefined') {
107
167
  var registeredClass = findRegisteredClass_(jsClass);
108
168
  if (registeredClass) {
109
169
  optCssClass = registeredClass.cssClass;
@@ -120,8 +180,8 @@ window.componentHandler = (function() {
120
180
  /**
121
181
  * Upgrades a specific element rather than all in the DOM.
122
182
  *
123
- * @param {!HTMLElement} element The element we wish to upgrade.
124
- * @param {String=} optJsClass Optional name of the class we want to upgrade
183
+ * @param {!Element} element The element we wish to upgrade.
184
+ * @param {string=} optJsClass Optional name of the class we want to upgrade
125
185
  * the element to.
126
186
  */
127
187
  function upgradeElementInternal(element, optJsClass) {
@@ -180,7 +240,7 @@ window.componentHandler = (function() {
180
240
  /**
181
241
  * Upgrades a specific list of elements rather than all in the DOM.
182
242
  *
183
- * @param {!HTMLElement|!Array<!HTMLElement>|!NodeList|!HTMLCollection} elements
243
+ * @param {!Element|!Array<!Element>|!NodeList|!HTMLCollection} elements
184
244
  * The elements we wish to upgrade.
185
245
  */
186
246
  function upgradeElementsInternal(elements) {
@@ -194,10 +254,10 @@ window.componentHandler = (function() {
194
254
  for (var i = 0, n = elements.length, element; i < n; i++) {
195
255
  element = elements[i];
196
256
  if (element instanceof HTMLElement) {
257
+ upgradeElementInternal(element);
197
258
  if (element.children.length > 0) {
198
259
  upgradeElementsInternal(element.children);
199
260
  }
200
- upgradeElementInternal(element);
201
261
  }
202
262
  }
203
263
  }
@@ -205,20 +265,32 @@ window.componentHandler = (function() {
205
265
  /**
206
266
  * Registers a class for future use and attempts to upgrade existing DOM.
207
267
  *
208
- * @param {{constructor: !Function, classAsString: String, cssClass: String, widget: String}} config
268
+ * @param {componentHandler.ComponentConfigPublic} config
209
269
  */
210
270
  function registerInternal(config) {
271
+ // In order to support both Closure-compiled and uncompiled code accessing
272
+ // this method, we need to allow for both the dot and array syntax for
273
+ // property access. You'll therefore see the `foo.bar || foo['bar']`
274
+ // pattern repeated across this method.
275
+ var widgetMissing = (typeof config.widget === 'undefined' &&
276
+ typeof config['widget'] === 'undefined');
277
+ var widget = true;
278
+
279
+ if (!widgetMissing) {
280
+ widget = config.widget || config['widget'];
281
+ }
282
+
211
283
  var newConfig = /** @type {componentHandler.ComponentConfig} */ ({
212
- 'classConstructor': config.constructor,
213
- 'className': config.classAsString,
214
- 'cssClass': config.cssClass,
215
- 'widget': config.widget === undefined ? true : config.widget,
216
- 'callbacks': []
284
+ classConstructor: config.constructor || config['constructor'],
285
+ className: config.classAsString || config['classAsString'],
286
+ cssClass: config.cssClass || config['cssClass'],
287
+ widget: widget,
288
+ callbacks: []
217
289
  });
218
290
 
219
291
  registeredComponents_.forEach(function(item) {
220
292
  if (item.cssClass === newConfig.cssClass) {
221
- throw new Error('The provided cssClass has already been registered.');
293
+ throw new Error('The provided cssClass has already been registered: ' + item.cssClass);
222
294
  }
223
295
  if (item.className === newConfig.className) {
224
296
  throw new Error('The provided className has already been registered');
@@ -243,7 +315,7 @@ window.componentHandler = (function() {
243
315
  * Allows user to be alerted to any upgrades that are performed for a given
244
316
  * component type
245
317
  *
246
- * @param {String} jsClass The class name of the MDL component we wish
318
+ * @param {string} jsClass The class name of the MDL component we wish
247
319
  * to hook into for any upgrades performed.
248
320
  * @param {function(!HTMLElement)} callback The function to call upon an
249
321
  * upgrade. This function should expect 1 parameter - the HTMLElement which
@@ -315,6 +387,10 @@ window.componentHandler = (function() {
315
387
  * @param {!Node|!Array<!Node>|!NodeList} nodes
316
388
  */
317
389
  function downgradeNodesInternal(nodes) {
390
+ /**
391
+ * Auxiliary function to downgrade a single node.
392
+ * @param {!Node} node the node to be downgraded
393
+ */
318
394
  var downgradeNode = function(node) {
319
395
  deconstructComponentInternal(findCreatedComponentByNodeInternal(node));
320
396
  };
@@ -342,24 +418,18 @@ window.componentHandler = (function() {
342
418
  };
343
419
  })();
344
420
 
345
- window.addEventListener('load', function() {
346
- 'use strict';
347
-
348
- /**
349
- * Performs a "Cutting the mustard" test. If the browser supports the features
350
- * tested, adds a mdl-js class to the <html> element. It then upgrades all MDL
351
- * components requiring JavaScript.
352
- */
353
- if ('classList' in document.createElement('div') &&
354
- 'querySelector' in document &&
355
- 'addEventListener' in window && Array.prototype.forEach) {
356
- document.documentElement.classList.add('mdl-js');
357
- componentHandler.upgradeAllRegistered();
358
- } else {
359
- componentHandler.upgradeElement =
360
- componentHandler.register = function() {};
361
- }
362
- });
421
+ /**
422
+ * Describes the type of a registered component type managed by
423
+ * componentHandler. Provided for benefit of the Closure compiler.
424
+ *
425
+ * @typedef {{
426
+ * constructor: Function,
427
+ * classAsString: string,
428
+ * cssClass: string,
429
+ * widget: (string|boolean|undefined)
430
+ * }}
431
+ */
432
+ componentHandler.ComponentConfigPublic; // jshint ignore:line
363
433
 
364
434
  /**
365
435
  * Describes the type of a registered component type managed by
@@ -367,9 +437,9 @@ window.addEventListener('load', function() {
367
437
  *
368
438
  * @typedef {{
369
439
  * constructor: !Function,
370
- * className: String,
371
- * cssClass: String,
372
- * widget: String,
440
+ * className: string,
441
+ * cssClass: string,
442
+ * widget: (string|boolean),
373
443
  * callbacks: !Array<function(!HTMLElement)>
374
444
  * }}
375
445
  */
@@ -381,14 +451,53 @@ componentHandler.ComponentConfig; // jshint ignore:line
381
451
  *
382
452
  * @typedef {{
383
453
  * element_: !HTMLElement,
384
- * className: String,
385
- * classAsString: String,
386
- * cssClass: String,
387
- * widget: String
454
+ * className: string,
455
+ * classAsString: string,
456
+ * cssClass: string,
457
+ * widget: string
388
458
  * }}
389
459
  */
390
460
  componentHandler.Component; // jshint ignore:line
391
461
 
462
+ // Export all symbols, for the benefit of Closure compiler.
463
+ // No effect on uncompiled code.
464
+ componentHandler['upgradeDom'] = componentHandler.upgradeDom;
465
+ componentHandler['upgradeElement'] = componentHandler.upgradeElement;
466
+ componentHandler['upgradeElements'] = componentHandler.upgradeElements;
467
+ componentHandler['upgradeAllRegistered'] =
468
+ componentHandler.upgradeAllRegistered;
469
+ componentHandler['registerUpgradedCallback'] =
470
+ componentHandler.registerUpgradedCallback;
471
+ componentHandler['register'] = componentHandler.register;
472
+ componentHandler['downgradeElements'] = componentHandler.downgradeElements;
473
+ window.componentHandler = componentHandler;
474
+ window['componentHandler'] = componentHandler;
475
+
476
+ window.addEventListener('load', function() {
477
+ 'use strict';
478
+
479
+ /**
480
+ * Performs a "Cutting the mustard" test. If the browser supports the features
481
+ * tested, adds a mdl-js class to the <html> element. It then upgrades all MDL
482
+ * components requiring JavaScript.
483
+ */
484
+ if ('classList' in document.createElement('div') &&
485
+ 'querySelector' in document &&
486
+ 'addEventListener' in window && Array.prototype.forEach) {
487
+ document.documentElement.classList.add('mdl-js');
488
+ componentHandler.upgradeAllRegistered();
489
+ } else {
490
+ /**
491
+ * Dummy function to avoid JS errors.
492
+ */
493
+ componentHandler.upgradeElement = function() {};
494
+ /**
495
+ * Dummy function to avoid JS errors.
496
+ */
497
+ componentHandler.register = function() {};
498
+ }
499
+ });
500
+
392
501
  // Source: https://github.com/darius/requestAnimationFrame/blob/master/requestAnimationFrame.js
393
502
  // Adapted from https://gist.github.com/paulirish/1579671 which derived from
394
503
  // http://paulirish.com/2011/requestanimationframe-for-smart-animating/
@@ -397,9 +506,14 @@ componentHandler.Component; // jshint ignore:line
397
506
  // Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavič, Darius Bacon
398
507
  // MIT license
399
508
  if (!Date.now) {
509
+ /**
510
+ * Date.now polyfill.
511
+ * @return {number} the current Date
512
+ */
400
513
  Date.now = function () {
401
514
  return new Date().getTime();
402
515
  };
516
+ Date['now'] = Date.now;
403
517
  }
404
518
  var vendors = [
405
519
  'webkit',
@@ -409,9 +523,15 @@ for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
409
523
  var vp = vendors[i];
410
524
  window.requestAnimationFrame = window[vp + 'RequestAnimationFrame'];
411
525
  window.cancelAnimationFrame = window[vp + 'CancelAnimationFrame'] || window[vp + 'CancelRequestAnimationFrame'];
526
+ window['requestAnimationFrame'] = window.requestAnimationFrame;
527
+ window['cancelAnimationFrame'] = window.cancelAnimationFrame;
412
528
  }
413
529
  if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
414
530
  var lastTime = 0;
531
+ /**
532
+ * requestAnimationFrame polyfill.
533
+ * @param {!Function} callback the callback function.
534
+ */
415
535
  window.requestAnimationFrame = function (callback) {
416
536
  var now = Date.now();
417
537
  var nextTime = Math.max(lastTime + 16, now);
@@ -420,6 +540,8 @@ if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || !window.requestAn
420
540
  }, nextTime - now);
421
541
  };
422
542
  window.cancelAnimationFrame = clearTimeout;
543
+ window['requestAnimationFrame'] = window.requestAnimationFrame;
544
+ window['cancelAnimationFrame'] = window.cancelAnimationFrame;
423
545
  }
424
546
  /**
425
547
  * @license
@@ -449,11 +571,11 @@ var MaterialButton = function MaterialButton(element) {
449
571
  // Initialize instance.
450
572
  this.init();
451
573
  };
452
- window.MaterialButton = MaterialButton;
574
+ window['MaterialButton'] = MaterialButton;
453
575
  /**
454
576
  * Store constants in one place so they can be updated easily.
455
577
  *
456
- * @enum {String | Number}
578
+ * @enum {string | number}
457
579
  * @private
458
580
  */
459
581
  MaterialButton.prototype.Constant_ = {};
@@ -462,7 +584,7 @@ MaterialButton.prototype.Constant_ = {};
462
584
  * JavaScript. This allows us to simply change it in one place should we
463
585
  * decide to modify at a later date.
464
586
  *
465
- * @enum {String}
587
+ * @enum {string}
466
588
  * @private
467
589
  */
468
590
  MaterialButton.prototype.CssClasses_ = {
@@ -490,6 +612,7 @@ MaterialButton.prototype.blurHandler_ = function (event) {
490
612
  MaterialButton.prototype.disable = function () {
491
613
  this.element_.disabled = true;
492
614
  };
615
+ MaterialButton.prototype['disable'] = MaterialButton.prototype.disable;
493
616
  /**
494
617
  * Enable button.
495
618
  *
@@ -498,6 +621,7 @@ MaterialButton.prototype.disable = function () {
498
621
  MaterialButton.prototype.enable = function () {
499
622
  this.element_.disabled = false;
500
623
  };
624
+ MaterialButton.prototype['enable'] = MaterialButton.prototype.enable;
501
625
  /**
502
626
  * Initialize element.
503
627
  */
@@ -559,6 +683,7 @@ componentHandler.register({
559
683
  * Implements MDL component design pattern defined at:
560
684
  * https://github.com/jasonmayes/mdl-component-design-pattern
561
685
  *
686
+ * @constructor
562
687
  * @param {HTMLElement} element The element that will be upgraded.
563
688
  */
564
689
  var MaterialCheckbox = function MaterialCheckbox(element) {
@@ -566,11 +691,11 @@ var MaterialCheckbox = function MaterialCheckbox(element) {
566
691
  // Initialize instance.
567
692
  this.init();
568
693
  };
569
- window.MaterialCheckbox = MaterialCheckbox;
694
+ window['MaterialCheckbox'] = MaterialCheckbox;
570
695
  /**
571
696
  * Store constants in one place so they can be updated easily.
572
697
  *
573
- * @enum {String | Number}
698
+ * @enum {string | number}
574
699
  * @private
575
700
  */
576
701
  MaterialCheckbox.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
@@ -579,7 +704,7 @@ MaterialCheckbox.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
579
704
  * JavaScript. This allows us to simply change it in one place should we
580
705
  * decide to modify at a later date.
581
706
  *
582
- * @enum {String}
707
+ * @enum {string}
583
708
  * @private
584
709
  */
585
710
  MaterialCheckbox.prototype.CssClasses_ = {
@@ -645,10 +770,9 @@ MaterialCheckbox.prototype.updateClasses_ = function () {
645
770
  /**
646
771
  * Add blur.
647
772
  *
648
- * @param {Event} event The event that fired.
649
773
  * @private
650
774
  */
651
- MaterialCheckbox.prototype.blur_ = function (event) {
775
+ MaterialCheckbox.prototype.blur_ = function () {
652
776
  // TODO: figure out why there's a focus event being fired after our blur,
653
777
  // so that we can avoid this hack.
654
778
  window.setTimeout(function () {
@@ -668,6 +792,7 @@ MaterialCheckbox.prototype.checkToggleState = function () {
668
792
  this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
669
793
  }
670
794
  };
795
+ MaterialCheckbox.prototype['checkToggleState'] = MaterialCheckbox.prototype.checkToggleState;
671
796
  /**
672
797
  * Check the inputs disabled state and update display.
673
798
  *
@@ -680,6 +805,7 @@ MaterialCheckbox.prototype.checkDisabled = function () {
680
805
  this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
681
806
  }
682
807
  };
808
+ MaterialCheckbox.prototype['checkDisabled'] = MaterialCheckbox.prototype.checkDisabled;
683
809
  /**
684
810
  * Disable checkbox.
685
811
  *
@@ -689,6 +815,7 @@ MaterialCheckbox.prototype.disable = function () {
689
815
  this.inputElement_.disabled = true;
690
816
  this.updateClasses_();
691
817
  };
818
+ MaterialCheckbox.prototype['disable'] = MaterialCheckbox.prototype.disable;
692
819
  /**
693
820
  * Enable checkbox.
694
821
  *
@@ -698,6 +825,7 @@ MaterialCheckbox.prototype.enable = function () {
698
825
  this.inputElement_.disabled = false;
699
826
  this.updateClasses_();
700
827
  };
828
+ MaterialCheckbox.prototype['enable'] = MaterialCheckbox.prototype.enable;
701
829
  /**
702
830
  * Check checkbox.
703
831
  *
@@ -707,6 +835,7 @@ MaterialCheckbox.prototype.check = function () {
707
835
  this.inputElement_.checked = true;
708
836
  this.updateClasses_();
709
837
  };
838
+ MaterialCheckbox.prototype['check'] = MaterialCheckbox.prototype.check;
710
839
  /**
711
840
  * Uncheck checkbox.
712
841
  *
@@ -716,6 +845,7 @@ MaterialCheckbox.prototype.uncheck = function () {
716
845
  this.inputElement_.checked = false;
717
846
  this.updateClasses_();
718
847
  };
848
+ MaterialCheckbox.prototype['uncheck'] = MaterialCheckbox.prototype.uncheck;
719
849
  /**
720
850
  * Initialize element.
721
851
  */
@@ -799,6 +929,7 @@ componentHandler.register({
799
929
  * Implements MDL component design pattern defined at:
800
930
  * https://github.com/jasonmayes/mdl-component-design-pattern
801
931
  *
932
+ * @constructor
802
933
  * @param {HTMLElement} element The element that will be upgraded.
803
934
  */
804
935
  var MaterialIconToggle = function MaterialIconToggle(element) {
@@ -806,11 +937,11 @@ var MaterialIconToggle = function MaterialIconToggle(element) {
806
937
  // Initialize instance.
807
938
  this.init();
808
939
  };
809
- window.MaterialIconToggle = MaterialIconToggle;
940
+ window['MaterialIconToggle'] = MaterialIconToggle;
810
941
  /**
811
942
  * Store constants in one place so they can be updated easily.
812
943
  *
813
- * @enum {String | Number}
944
+ * @enum {string | number}
814
945
  * @private
815
946
  */
816
947
  MaterialIconToggle.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
@@ -819,7 +950,7 @@ MaterialIconToggle.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
819
950
  * JavaScript. This allows us to simply change it in one place should we
820
951
  * decide to modify at a later date.
821
952
  *
822
- * @enum {String}
953
+ * @enum {string}
823
954
  * @private
824
955
  */
825
956
  MaterialIconToggle.prototype.CssClasses_ = {
@@ -881,10 +1012,9 @@ MaterialIconToggle.prototype.updateClasses_ = function () {
881
1012
  /**
882
1013
  * Add blur.
883
1014
  *
884
- * @param {Event} event The event that fired.
885
1015
  * @private
886
1016
  */
887
- MaterialIconToggle.prototype.blur_ = function (event) {
1017
+ MaterialIconToggle.prototype.blur_ = function () {
888
1018
  // TODO: figure out why there's a focus event being fired after our blur,
889
1019
  // so that we can avoid this hack.
890
1020
  window.setTimeout(function () {
@@ -904,6 +1034,7 @@ MaterialIconToggle.prototype.checkToggleState = function () {
904
1034
  this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
905
1035
  }
906
1036
  };
1037
+ MaterialIconToggle.prototype['checkToggleState'] = MaterialIconToggle.prototype.checkToggleState;
907
1038
  /**
908
1039
  * Check the inputs disabled state and update display.
909
1040
  *
@@ -916,6 +1047,7 @@ MaterialIconToggle.prototype.checkDisabled = function () {
916
1047
  this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
917
1048
  }
918
1049
  };
1050
+ MaterialIconToggle.prototype['checkDisabled'] = MaterialIconToggle.prototype.checkDisabled;
919
1051
  /**
920
1052
  * Disable icon toggle.
921
1053
  *
@@ -925,6 +1057,7 @@ MaterialIconToggle.prototype.disable = function () {
925
1057
  this.inputElement_.disabled = true;
926
1058
  this.updateClasses_();
927
1059
  };
1060
+ MaterialIconToggle.prototype['disable'] = MaterialIconToggle.prototype.disable;
928
1061
  /**
929
1062
  * Enable icon toggle.
930
1063
  *
@@ -934,6 +1067,7 @@ MaterialIconToggle.prototype.enable = function () {
934
1067
  this.inputElement_.disabled = false;
935
1068
  this.updateClasses_();
936
1069
  };
1070
+ MaterialIconToggle.prototype['enable'] = MaterialIconToggle.prototype.enable;
937
1071
  /**
938
1072
  * Check icon toggle.
939
1073
  *
@@ -943,6 +1077,7 @@ MaterialIconToggle.prototype.check = function () {
943
1077
  this.inputElement_.checked = true;
944
1078
  this.updateClasses_();
945
1079
  };
1080
+ MaterialIconToggle.prototype['check'] = MaterialIconToggle.prototype.check;
946
1081
  /**
947
1082
  * Uncheck icon toggle.
948
1083
  *
@@ -952,6 +1087,7 @@ MaterialIconToggle.prototype.uncheck = function () {
952
1087
  this.inputElement_.checked = false;
953
1088
  this.updateClasses_();
954
1089
  };
1090
+ MaterialIconToggle.prototype['uncheck'] = MaterialIconToggle.prototype.uncheck;
955
1091
  /**
956
1092
  * Initialize element.
957
1093
  */
@@ -1026,6 +1162,7 @@ componentHandler.register({
1026
1162
  * Implements MDL component design pattern defined at:
1027
1163
  * https://github.com/jasonmayes/mdl-component-design-pattern
1028
1164
  *
1165
+ * @constructor
1029
1166
  * @param {HTMLElement} element The element that will be upgraded.
1030
1167
  */
1031
1168
  var MaterialMenu = function MaterialMenu(element) {
@@ -1033,11 +1170,11 @@ var MaterialMenu = function MaterialMenu(element) {
1033
1170
  // Initialize instance.
1034
1171
  this.init();
1035
1172
  };
1036
- window.MaterialMenu = MaterialMenu;
1173
+ window['MaterialMenu'] = MaterialMenu;
1037
1174
  /**
1038
1175
  * Store constants in one place so they can be updated easily.
1039
1176
  *
1040
- * @enum {String | Number}
1177
+ * @enum {string | number}
1041
1178
  * @private
1042
1179
  */
1043
1180
  MaterialMenu.prototype.Constant_ = {
@@ -1052,7 +1189,7 @@ MaterialMenu.prototype.Constant_ = {
1052
1189
  /**
1053
1190
  * Keycodes, for code readability.
1054
1191
  *
1055
- * @enum {Number}
1192
+ * @enum {number}
1056
1193
  * @private
1057
1194
  */
1058
1195
  MaterialMenu.prototype.Keycodes_ = {
@@ -1067,7 +1204,7 @@ MaterialMenu.prototype.Keycodes_ = {
1067
1204
  * JavaScript. This allows us to simply change it in one place should we
1068
1205
  * decide to modify at a later date.
1069
1206
  *
1070
- * @enum {String}
1207
+ * @enum {string}
1071
1208
  * @private
1072
1209
  */
1073
1210
  MaterialMenu.prototype.CssClasses_ = {
@@ -1278,14 +1415,14 @@ MaterialMenu.prototype.handleItemClick_ = function (evt) {
1278
1415
  * it), and applies it. This allows us to animate from or to the correct point,
1279
1416
  * that is, the point it's aligned to in the "for" element.
1280
1417
  *
1281
- * @param {Number} height Height of the clip rectangle
1282
- * @param {Number} width Width of the clip rectangle
1418
+ * @param {number} height Height of the clip rectangle
1419
+ * @param {number} width Width of the clip rectangle
1283
1420
  * @private
1284
1421
  */
1285
1422
  MaterialMenu.prototype.applyClip_ = function (height, width) {
1286
1423
  if (this.element_.classList.contains(this.CssClasses_.UNALIGNED)) {
1287
1424
  // Do not clip.
1288
- this.element_.style.clip = null;
1425
+ this.element_.style.clip = '';
1289
1426
  } else if (this.element_.classList.contains(this.CssClasses_.BOTTOM_RIGHT)) {
1290
1427
  // Clip to the top right corner of the menu.
1291
1428
  this.element_.style.clip = 'rect(0 ' + width + 'px ' + '0 ' + width + 'px)';
@@ -1297,7 +1434,7 @@ MaterialMenu.prototype.applyClip_ = function (height, width) {
1297
1434
  this.element_.style.clip = 'rect(' + height + 'px ' + width + 'px ' + height + 'px ' + width + 'px)';
1298
1435
  } else {
1299
1436
  // Default: do not clip (same as clipping to the top left corner).
1300
- this.element_.style.clip = null;
1437
+ this.element_.style.clip = '';
1301
1438
  }
1302
1439
  };
1303
1440
  /**
@@ -1368,6 +1505,7 @@ MaterialMenu.prototype.show = function (evt) {
1368
1505
  document.addEventListener('click', callback);
1369
1506
  }
1370
1507
  };
1508
+ MaterialMenu.prototype['show'] = MaterialMenu.prototype.show;
1371
1509
  /**
1372
1510
  * Hides the menu.
1373
1511
  *
@@ -1392,6 +1530,7 @@ MaterialMenu.prototype.hide = function () {
1392
1530
  this.addAnimationEndListener_();
1393
1531
  }
1394
1532
  };
1533
+ MaterialMenu.prototype['hide'] = MaterialMenu.prototype.hide;
1395
1534
  /**
1396
1535
  * Displays or hides the menu, depending on current state.
1397
1536
  *
@@ -1404,6 +1543,7 @@ MaterialMenu.prototype.toggle = function (evt) {
1404
1543
  this.show(evt);
1405
1544
  }
1406
1545
  };
1546
+ MaterialMenu.prototype['toggle'] = MaterialMenu.prototype.toggle;
1407
1547
  /**
1408
1548
  * Downgrade the component.
1409
1549
  *
@@ -1445,6 +1585,7 @@ componentHandler.register({
1445
1585
  * Implements MDL component design pattern defined at:
1446
1586
  * https://github.com/jasonmayes/mdl-component-design-pattern
1447
1587
  *
1588
+ * @constructor
1448
1589
  * @param {HTMLElement} element The element that will be upgraded.
1449
1590
  */
1450
1591
  var MaterialProgress = function MaterialProgress(element) {
@@ -1452,11 +1593,11 @@ var MaterialProgress = function MaterialProgress(element) {
1452
1593
  // Initialize instance.
1453
1594
  this.init();
1454
1595
  };
1455
- window.MaterialProgress = MaterialProgress;
1596
+ window['MaterialProgress'] = MaterialProgress;
1456
1597
  /**
1457
1598
  * Store constants in one place so they can be updated easily.
1458
1599
  *
1459
- * @enum {String | Number}
1600
+ * @enum {string | number}
1460
1601
  * @private
1461
1602
  */
1462
1603
  MaterialProgress.prototype.Constant_ = {};
@@ -1465,14 +1606,14 @@ MaterialProgress.prototype.Constant_ = {};
1465
1606
  * JavaScript. This allows us to simply change it in one place should we
1466
1607
  * decide to modify at a later date.
1467
1608
  *
1468
- * @enum {String}
1609
+ * @enum {string}
1469
1610
  * @private
1470
1611
  */
1471
1612
  MaterialProgress.prototype.CssClasses_ = { INDETERMINATE_CLASS: 'mdl-progress__indeterminate' };
1472
1613
  /**
1473
1614
  * Set the current progress of the progressbar.
1474
1615
  *
1475
- * @param {Number} p Percentage of the progress (0-100)
1616
+ * @param {number} p Percentage of the progress (0-100)
1476
1617
  * @public
1477
1618
  */
1478
1619
  MaterialProgress.prototype.setProgress = function (p) {
@@ -1481,16 +1622,18 @@ MaterialProgress.prototype.setProgress = function (p) {
1481
1622
  }
1482
1623
  this.progressbar_.style.width = p + '%';
1483
1624
  };
1625
+ MaterialProgress.prototype['setProgress'] = MaterialProgress.prototype.setProgress;
1484
1626
  /**
1485
1627
  * Set the current progress of the buffer.
1486
1628
  *
1487
- * @param {Number} p Percentage of the buffer (0-100)
1629
+ * @param {number} p Percentage of the buffer (0-100)
1488
1630
  * @public
1489
1631
  */
1490
1632
  MaterialProgress.prototype.setBuffer = function (p) {
1491
1633
  this.bufferbar_.style.width = p + '%';
1492
1634
  this.auxbar_.style.width = 100 - p + '%';
1493
1635
  };
1636
+ MaterialProgress.prototype['setBuffer'] = MaterialProgress.prototype.setBuffer;
1494
1637
  /**
1495
1638
  * Initialize element.
1496
1639
  */
@@ -1553,6 +1696,7 @@ componentHandler.register({
1553
1696
  * Implements MDL component design pattern defined at:
1554
1697
  * https://github.com/jasonmayes/mdl-component-design-pattern
1555
1698
  *
1699
+ * @constructor
1556
1700
  * @param {HTMLElement} element The element that will be upgraded.
1557
1701
  */
1558
1702
  var MaterialRadio = function MaterialRadio(element) {
@@ -1560,11 +1704,11 @@ var MaterialRadio = function MaterialRadio(element) {
1560
1704
  // Initialize instance.
1561
1705
  this.init();
1562
1706
  };
1563
- window.MaterialRadio = MaterialRadio;
1707
+ window['MaterialRadio'] = MaterialRadio;
1564
1708
  /**
1565
1709
  * Store constants in one place so they can be updated easily.
1566
1710
  *
1567
- * @enum {String | Number}
1711
+ * @enum {string | number}
1568
1712
  * @private
1569
1713
  */
1570
1714
  MaterialRadio.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
@@ -1573,7 +1717,7 @@ MaterialRadio.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
1573
1717
  * JavaScript. This allows us to simply change it in one place should we
1574
1718
  * decide to modify at a later date.
1575
1719
  *
1576
- * @enum {String}
1720
+ * @enum {string}
1577
1721
  * @private
1578
1722
  */
1579
1723
  MaterialRadio.prototype.CssClasses_ = {
@@ -1605,7 +1749,7 @@ MaterialRadio.prototype.onChange_ = function (event) {
1605
1749
  var button = radios[i].querySelector('.' + this.CssClasses_.RADIO_BTN);
1606
1750
  // Different name == different group, so no point updating those.
1607
1751
  if (button.getAttribute('name') === this.btnElement_.getAttribute('name')) {
1608
- radios[i].MaterialRadio.updateClasses_();
1752
+ radios[i]['MaterialRadio'].updateClasses_();
1609
1753
  }
1610
1754
  }
1611
1755
  };
@@ -1648,10 +1792,9 @@ MaterialRadio.prototype.updateClasses_ = function () {
1648
1792
  /**
1649
1793
  * Add blur.
1650
1794
  *
1651
- * @param {Event} event The event that fired.
1652
1795
  * @private
1653
1796
  */
1654
- MaterialRadio.prototype.blur_ = function (event) {
1797
+ MaterialRadio.prototype.blur_ = function () {
1655
1798
  // TODO: figure out why there's a focus event being fired after our blur,
1656
1799
  // so that we can avoid this hack.
1657
1800
  window.setTimeout(function () {
@@ -1671,6 +1814,7 @@ MaterialRadio.prototype.checkDisabled = function () {
1671
1814
  this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
1672
1815
  }
1673
1816
  };
1817
+ MaterialRadio.prototype['checkDisabled'] = MaterialRadio.prototype.checkDisabled;
1674
1818
  /**
1675
1819
  * Check the components toggled state.
1676
1820
  *
@@ -1683,6 +1827,7 @@ MaterialRadio.prototype.checkToggleState = function () {
1683
1827
  this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
1684
1828
  }
1685
1829
  };
1830
+ MaterialRadio.prototype['checkToggleState'] = MaterialRadio.prototype.checkToggleState;
1686
1831
  /**
1687
1832
  * Disable radio.
1688
1833
  *
@@ -1692,6 +1837,7 @@ MaterialRadio.prototype.disable = function () {
1692
1837
  this.btnElement_.disabled = true;
1693
1838
  this.updateClasses_();
1694
1839
  };
1840
+ MaterialRadio.prototype['disable'] = MaterialRadio.prototype.disable;
1695
1841
  /**
1696
1842
  * Enable radio.
1697
1843
  *
@@ -1701,6 +1847,7 @@ MaterialRadio.prototype.enable = function () {
1701
1847
  this.btnElement_.disabled = false;
1702
1848
  this.updateClasses_();
1703
1849
  };
1850
+ MaterialRadio.prototype['enable'] = MaterialRadio.prototype.enable;
1704
1851
  /**
1705
1852
  * Check radio.
1706
1853
  *
@@ -1710,6 +1857,7 @@ MaterialRadio.prototype.check = function () {
1710
1857
  this.btnElement_.checked = true;
1711
1858
  this.updateClasses_();
1712
1859
  };
1860
+ MaterialRadio.prototype['check'] = MaterialRadio.prototype.check;
1713
1861
  /**
1714
1862
  * Uncheck radio.
1715
1863
  *
@@ -1719,6 +1867,7 @@ MaterialRadio.prototype.uncheck = function () {
1719
1867
  this.btnElement_.checked = false;
1720
1868
  this.updateClasses_();
1721
1869
  };
1870
+ MaterialRadio.prototype['uncheck'] = MaterialRadio.prototype.uncheck;
1722
1871
  /**
1723
1872
  * Initialize element.
1724
1873
  */
@@ -1781,6 +1930,7 @@ componentHandler.register({
1781
1930
  * Implements MDL component design pattern defined at:
1782
1931
  * https://github.com/jasonmayes/mdl-component-design-pattern
1783
1932
  *
1933
+ * @constructor
1784
1934
  * @param {HTMLElement} element The element that will be upgraded.
1785
1935
  */
1786
1936
  var MaterialSlider = function MaterialSlider(element) {
@@ -1790,11 +1940,11 @@ var MaterialSlider = function MaterialSlider(element) {
1790
1940
  // Initialize instance.
1791
1941
  this.init();
1792
1942
  };
1793
- window.MaterialSlider = MaterialSlider;
1943
+ window['MaterialSlider'] = MaterialSlider;
1794
1944
  /**
1795
1945
  * Store constants in one place so they can be updated easily.
1796
1946
  *
1797
- * @enum {String | Number}
1947
+ * @enum {string | number}
1798
1948
  * @private
1799
1949
  */
1800
1950
  MaterialSlider.prototype.Constant_ = {};
@@ -1803,7 +1953,7 @@ MaterialSlider.prototype.Constant_ = {};
1803
1953
  * JavaScript. This allows us to simply change it in one place should we
1804
1954
  * decide to modify at a later date.
1805
1955
  *
1806
- * @enum {String}
1956
+ * @enum {string}
1807
1957
  * @private
1808
1958
  */
1809
1959
  MaterialSlider.prototype.CssClasses_ = {
@@ -1850,6 +2000,7 @@ MaterialSlider.prototype.onMouseUp_ = function (event) {
1850
2000
  *
1851
2001
  * @param {Event} event The event that fired.
1852
2002
  * @private
2003
+ * @suppress {missingProperties}
1853
2004
  */
1854
2005
  MaterialSlider.prototype.onContainerMouseDown_ = function (event) {
1855
2006
  // If this click is not on the parent element (but rather some child)
@@ -1871,10 +2022,9 @@ MaterialSlider.prototype.onContainerMouseDown_ = function (event) {
1871
2022
  /**
1872
2023
  * Handle updating of values.
1873
2024
  *
1874
- * @param {Event} event The event that fired.
1875
2025
  * @private
1876
2026
  */
1877
- MaterialSlider.prototype.updateValueStyles_ = function (event) {
2027
+ MaterialSlider.prototype.updateValueStyles_ = function () {
1878
2028
  // Calculate and apply percentages to div structure behind slider.
1879
2029
  var fraction = (this.element_.value - this.element_.min) / (this.element_.max - this.element_.min);
1880
2030
  if (fraction === 0) {
@@ -1898,6 +2048,7 @@ MaterialSlider.prototype.updateValueStyles_ = function (event) {
1898
2048
  MaterialSlider.prototype.disable = function () {
1899
2049
  this.element_.disabled = true;
1900
2050
  };
2051
+ MaterialSlider.prototype['disable'] = MaterialSlider.prototype.disable;
1901
2052
  /**
1902
2053
  * Enable slider.
1903
2054
  *
@@ -1906,10 +2057,11 @@ MaterialSlider.prototype.disable = function () {
1906
2057
  MaterialSlider.prototype.enable = function () {
1907
2058
  this.element_.disabled = false;
1908
2059
  };
2060
+ MaterialSlider.prototype['enable'] = MaterialSlider.prototype.enable;
1909
2061
  /**
1910
2062
  * Update slider value.
1911
2063
  *
1912
- * @param {Number} value The value to which to set the control (optional).
2064
+ * @param {number} value The value to which to set the control (optional).
1913
2065
  * @public
1914
2066
  */
1915
2067
  MaterialSlider.prototype.change = function (value) {
@@ -1918,6 +2070,7 @@ MaterialSlider.prototype.change = function (value) {
1918
2070
  }
1919
2071
  this.updateValueStyles_();
1920
2072
  };
2073
+ MaterialSlider.prototype['change'] = MaterialSlider.prototype.change;
1921
2074
  /**
1922
2075
  * Initialize element.
1923
2076
  */
@@ -2011,11 +2164,11 @@ var MaterialSpinner = function MaterialSpinner(element) {
2011
2164
  // Initialize instance.
2012
2165
  this.init();
2013
2166
  };
2014
- window.MaterialSpinner = MaterialSpinner;
2167
+ window['MaterialSpinner'] = MaterialSpinner;
2015
2168
  /**
2016
2169
  * Store constants in one place so they can be updated easily.
2017
2170
  *
2018
- * @enum {String | Number}
2171
+ * @enum {string | number}
2019
2172
  * @private
2020
2173
  */
2021
2174
  MaterialSpinner.prototype.Constant_ = { MDL_SPINNER_LAYER_COUNT: 4 };
@@ -2024,7 +2177,7 @@ MaterialSpinner.prototype.Constant_ = { MDL_SPINNER_LAYER_COUNT: 4 };
2024
2177
  * JavaScript. This allows us to simply change it in one place should we
2025
2178
  * decide to modify at a later date.
2026
2179
  *
2027
- * @enum {String}
2180
+ * @enum {string}
2028
2181
  * @private
2029
2182
  */
2030
2183
  MaterialSpinner.prototype.CssClasses_ = {
@@ -2038,7 +2191,7 @@ MaterialSpinner.prototype.CssClasses_ = {
2038
2191
  /**
2039
2192
  * Auxiliary method to create a spinner layer.
2040
2193
  *
2041
- * @param {Number} index Index of the layer to be created.
2194
+ * @param {number} index Index of the layer to be created.
2042
2195
  * @public
2043
2196
  */
2044
2197
  MaterialSpinner.prototype.createLayer = function (index) {
@@ -2068,6 +2221,7 @@ MaterialSpinner.prototype.createLayer = function (index) {
2068
2221
  layer.appendChild(rightClipper);
2069
2222
  this.element_.appendChild(layer);
2070
2223
  };
2224
+ MaterialSpinner.prototype['createLayer'] = MaterialSpinner.prototype.createLayer;
2071
2225
  /**
2072
2226
  * Stops the spinner animation.
2073
2227
  * Public method for users who need to stop the spinner for any reason.
@@ -2077,6 +2231,7 @@ MaterialSpinner.prototype.createLayer = function (index) {
2077
2231
  MaterialSpinner.prototype.stop = function () {
2078
2232
  this.element_.classList.remove('is-active');
2079
2233
  };
2234
+ MaterialSpinner.prototype['stop'] = MaterialSpinner.prototype.stop;
2080
2235
  /**
2081
2236
  * Starts the spinner animation.
2082
2237
  * Public method for users who need to manually start the spinner for any reason
@@ -2087,6 +2242,7 @@ MaterialSpinner.prototype.stop = function () {
2087
2242
  MaterialSpinner.prototype.start = function () {
2088
2243
  this.element_.classList.add('is-active');
2089
2244
  };
2245
+ MaterialSpinner.prototype['start'] = MaterialSpinner.prototype.start;
2090
2246
  /**
2091
2247
  * Initialize element.
2092
2248
  */
@@ -2127,6 +2283,7 @@ componentHandler.register({
2127
2283
  * Implements MDL component design pattern defined at:
2128
2284
  * https://github.com/jasonmayes/mdl-component-design-pattern
2129
2285
  *
2286
+ * @constructor
2130
2287
  * @param {HTMLElement} element The element that will be upgraded.
2131
2288
  */
2132
2289
  var MaterialSwitch = function MaterialSwitch(element) {
@@ -2134,11 +2291,11 @@ var MaterialSwitch = function MaterialSwitch(element) {
2134
2291
  // Initialize instance.
2135
2292
  this.init();
2136
2293
  };
2137
- window.MaterialSwitch = MaterialSwitch;
2294
+ window['MaterialSwitch'] = MaterialSwitch;
2138
2295
  /**
2139
2296
  * Store constants in one place so they can be updated easily.
2140
2297
  *
2141
- * @enum {String | Number}
2298
+ * @enum {string | number}
2142
2299
  * @private
2143
2300
  */
2144
2301
  MaterialSwitch.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
@@ -2147,7 +2304,7 @@ MaterialSwitch.prototype.Constant_ = { TINY_TIMEOUT: 0.001 };
2147
2304
  * JavaScript. This allows us to simply change it in one place should we
2148
2305
  * decide to modify at a later date.
2149
2306
  *
2150
- * @enum {String}
2307
+ * @enum {string}
2151
2308
  * @private
2152
2309
  */
2153
2310
  MaterialSwitch.prototype.CssClasses_ = {
@@ -2214,7 +2371,7 @@ MaterialSwitch.prototype.updateClasses_ = function () {
2214
2371
  *
2215
2372
  * @private
2216
2373
  */
2217
- MaterialSwitch.prototype.blur_ = function (event) {
2374
+ MaterialSwitch.prototype.blur_ = function () {
2218
2375
  // TODO: figure out why there's a focus event being fired after our blur,
2219
2376
  // so that we can avoid this hack.
2220
2377
  window.setTimeout(function () {
@@ -2234,6 +2391,7 @@ MaterialSwitch.prototype.checkDisabled = function () {
2234
2391
  this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
2235
2392
  }
2236
2393
  };
2394
+ MaterialSwitch.prototype['checkDisabled'] = MaterialSwitch.prototype.checkDisabled;
2237
2395
  /**
2238
2396
  * Check the components toggled state.
2239
2397
  *
@@ -2246,6 +2404,7 @@ MaterialSwitch.prototype.checkToggleState = function () {
2246
2404
  this.element_.classList.remove(this.CssClasses_.IS_CHECKED);
2247
2405
  }
2248
2406
  };
2407
+ MaterialSwitch.prototype['checkToggleState'] = MaterialSwitch.prototype.checkToggleState;
2249
2408
  /**
2250
2409
  * Disable switch.
2251
2410
  *
@@ -2255,6 +2414,7 @@ MaterialSwitch.prototype.disable = function () {
2255
2414
  this.inputElement_.disabled = true;
2256
2415
  this.updateClasses_();
2257
2416
  };
2417
+ MaterialSwitch.prototype['disable'] = MaterialSwitch.prototype.disable;
2258
2418
  /**
2259
2419
  * Enable switch.
2260
2420
  *
@@ -2264,6 +2424,7 @@ MaterialSwitch.prototype.enable = function () {
2264
2424
  this.inputElement_.disabled = false;
2265
2425
  this.updateClasses_();
2266
2426
  };
2427
+ MaterialSwitch.prototype['enable'] = MaterialSwitch.prototype.enable;
2267
2428
  /**
2268
2429
  * Activate switch.
2269
2430
  *
@@ -2273,6 +2434,7 @@ MaterialSwitch.prototype.on = function () {
2273
2434
  this.inputElement_.checked = true;
2274
2435
  this.updateClasses_();
2275
2436
  };
2437
+ MaterialSwitch.prototype['on'] = MaterialSwitch.prototype.on;
2276
2438
  /**
2277
2439
  * Deactivate switch.
2278
2440
  *
@@ -2282,6 +2444,7 @@ MaterialSwitch.prototype.off = function () {
2282
2444
  this.inputElement_.checked = false;
2283
2445
  this.updateClasses_();
2284
2446
  };
2447
+ MaterialSwitch.prototype['off'] = MaterialSwitch.prototype.off;
2285
2448
  /**
2286
2449
  * Initialize element.
2287
2450
  */
@@ -2364,6 +2527,7 @@ componentHandler.register({
2364
2527
  * Implements MDL component design pattern defined at:
2365
2528
  * https://github.com/jasonmayes/mdl-component-design-pattern
2366
2529
  *
2530
+ * @constructor
2367
2531
  * @param {HTMLElement} element The element that will be upgraded.
2368
2532
  */
2369
2533
  var MaterialTabs = function MaterialTabs(element) {
@@ -2372,11 +2536,11 @@ var MaterialTabs = function MaterialTabs(element) {
2372
2536
  // Initialize instance.
2373
2537
  this.init();
2374
2538
  };
2375
- window.MaterialTabs = MaterialTabs;
2539
+ window['MaterialTabs'] = MaterialTabs;
2376
2540
  /**
2377
2541
  * Store constants in one place so they can be updated easily.
2378
2542
  *
2379
- * @enum {String}
2543
+ * @enum {string}
2380
2544
  * @private
2381
2545
  */
2382
2546
  MaterialTabs.prototype.Constant_ = {};
@@ -2385,7 +2549,7 @@ MaterialTabs.prototype.Constant_ = {};
2385
2549
  * JavaScript. This allows us to simply change it in one place should we
2386
2550
  * decide to modify at a later date.
2387
2551
  *
2388
- * @enum {String}
2552
+ * @enum {string}
2389
2553
  * @private
2390
2554
  */
2391
2555
  MaterialTabs.prototype.CssClasses_ = {
@@ -2444,6 +2608,13 @@ MaterialTabs.prototype.init = function () {
2444
2608
  this.initTabs_();
2445
2609
  }
2446
2610
  };
2611
+ /**
2612
+ * Constructor for an individual tab.
2613
+ *
2614
+ * @constructor
2615
+ * @param {HTMLElement} tab The HTML element for the tab.
2616
+ * @param {MaterialTabs} ctx The MaterialTabs object that owns the tab.
2617
+ */
2447
2618
  function MaterialTab(tab, ctx) {
2448
2619
  if (tab) {
2449
2620
  if (ctx.element_.classList.contains(ctx.CssClasses_.MDL_JS_RIPPLE_EFFECT)) {
@@ -2494,6 +2665,7 @@ componentHandler.register({
2494
2665
  * Implements MDL component design pattern defined at:
2495
2666
  * https://github.com/jasonmayes/mdl-component-design-pattern
2496
2667
  *
2668
+ * @constructor
2497
2669
  * @param {HTMLElement} element The element that will be upgraded.
2498
2670
  */
2499
2671
  var MaterialTextfield = function MaterialTextfield(element) {
@@ -2502,11 +2674,11 @@ var MaterialTextfield = function MaterialTextfield(element) {
2502
2674
  // Initialize instance.
2503
2675
  this.init();
2504
2676
  };
2505
- window.MaterialTextfield = MaterialTextfield;
2677
+ window['MaterialTextfield'] = MaterialTextfield;
2506
2678
  /**
2507
2679
  * Store constants in one place so they can be updated easily.
2508
2680
  *
2509
- * @enum {String | Number}
2681
+ * @enum {string | number}
2510
2682
  * @private
2511
2683
  */
2512
2684
  MaterialTextfield.prototype.Constant_ = {
@@ -2518,7 +2690,7 @@ MaterialTextfield.prototype.Constant_ = {
2518
2690
  * JavaScript. This allows us to simply change it in one place should we
2519
2691
  * decide to modify at a later date.
2520
2692
  *
2521
- * @enum {String}
2693
+ * @enum {string}
2522
2694
  * @private
2523
2695
  */
2524
2696
  MaterialTextfield.prototype.CssClasses_ = {
@@ -2585,6 +2757,7 @@ MaterialTextfield.prototype.checkDisabled = function () {
2585
2757
  this.element_.classList.remove(this.CssClasses_.IS_DISABLED);
2586
2758
  }
2587
2759
  };
2760
+ MaterialTextfield.prototype['checkDisabled'] = MaterialTextfield.prototype.checkDisabled;
2588
2761
  /**
2589
2762
  * Check the validity state and update field accordingly.
2590
2763
  *
@@ -2597,6 +2770,7 @@ MaterialTextfield.prototype.checkValidity = function () {
2597
2770
  this.element_.classList.add(this.CssClasses_.IS_INVALID);
2598
2771
  }
2599
2772
  };
2773
+ MaterialTextfield.prototype['checkValidity'] = MaterialTextfield.prototype.checkValidity;
2600
2774
  /**
2601
2775
  * Check the dirty state and update field accordingly.
2602
2776
  *
@@ -2609,6 +2783,7 @@ MaterialTextfield.prototype.checkDirty = function () {
2609
2783
  this.element_.classList.remove(this.CssClasses_.IS_DIRTY);
2610
2784
  }
2611
2785
  };
2786
+ MaterialTextfield.prototype['checkDirty'] = MaterialTextfield.prototype.checkDirty;
2612
2787
  /**
2613
2788
  * Disable text field.
2614
2789
  *
@@ -2618,6 +2793,7 @@ MaterialTextfield.prototype.disable = function () {
2618
2793
  this.input_.disabled = true;
2619
2794
  this.updateClasses_();
2620
2795
  };
2796
+ MaterialTextfield.prototype['disable'] = MaterialTextfield.prototype.disable;
2621
2797
  /**
2622
2798
  * Enable text field.
2623
2799
  *
@@ -2627,18 +2803,22 @@ MaterialTextfield.prototype.enable = function () {
2627
2803
  this.input_.disabled = false;
2628
2804
  this.updateClasses_();
2629
2805
  };
2806
+ MaterialTextfield.prototype['enable'] = MaterialTextfield.prototype.enable;
2630
2807
  /**
2631
2808
  * Update text field value.
2632
2809
  *
2633
- * @param {String} value The value to which to set the control (optional).
2810
+ * @param {string} value The value to which to set the control (optional).
2634
2811
  * @public
2635
2812
  */
2636
2813
  MaterialTextfield.prototype.change = function (value) {
2637
2814
  if (value) {
2638
2815
  this.input_.value = value;
2816
+ } else {
2817
+ this.input_.value = '';
2639
2818
  }
2640
2819
  this.updateClasses_();
2641
2820
  };
2821
+ MaterialTextfield.prototype['change'] = MaterialTextfield.prototype.change;
2642
2822
  /**
2643
2823
  * Initialize element.
2644
2824
  */
@@ -2712,6 +2892,7 @@ componentHandler.register({
2712
2892
  * Implements MDL component design pattern defined at:
2713
2893
  * https://github.com/jasonmayes/mdl-component-design-pattern
2714
2894
  *
2895
+ * @constructor
2715
2896
  * @param {HTMLElement} element The element that will be upgraded.
2716
2897
  */
2717
2898
  var MaterialTooltip = function MaterialTooltip(element) {
@@ -2719,11 +2900,11 @@ var MaterialTooltip = function MaterialTooltip(element) {
2719
2900
  // Initialize instance.
2720
2901
  this.init();
2721
2902
  };
2722
- window.MaterialTooltip = MaterialTooltip;
2903
+ window['MaterialTooltip'] = MaterialTooltip;
2723
2904
  /**
2724
2905
  * Store constants in one place so they can be updated easily.
2725
2906
  *
2726
- * @enum {String | Number}
2907
+ * @enum {string | number}
2727
2908
  * @private
2728
2909
  */
2729
2910
  MaterialTooltip.prototype.Constant_ = {};
@@ -2732,7 +2913,7 @@ MaterialTooltip.prototype.Constant_ = {};
2732
2913
  * JavaScript. This allows us to simply change it in one place should we
2733
2914
  * decide to modify at a later date.
2734
2915
  *
2735
- * @enum {String}
2916
+ * @enum {string}
2736
2917
  * @private
2737
2918
  */
2738
2919
  MaterialTooltip.prototype.CssClasses_ = { IS_ACTIVE: 'is-active' };
@@ -2836,6 +3017,7 @@ componentHandler.register({
2836
3017
  * Implements MDL component design pattern defined at:
2837
3018
  * https://github.com/jasonmayes/mdl-component-design-pattern
2838
3019
  *
3020
+ * @constructor
2839
3021
  * @param {HTMLElement} element The element that will be upgraded.
2840
3022
  */
2841
3023
  var MaterialLayout = function MaterialLayout(element) {
@@ -2843,11 +3025,11 @@ var MaterialLayout = function MaterialLayout(element) {
2843
3025
  // Initialize instance.
2844
3026
  this.init();
2845
3027
  };
2846
- window.MaterialLayout = MaterialLayout;
3028
+ window['MaterialLayout'] = MaterialLayout;
2847
3029
  /**
2848
3030
  * Store constants in one place so they can be updated easily.
2849
3031
  *
2850
- * @enum {String | Number}
3032
+ * @enum {string | number}
2851
3033
  * @private
2852
3034
  */
2853
3035
  MaterialLayout.prototype.Constant_ = {
@@ -2860,7 +3042,7 @@ MaterialLayout.prototype.Constant_ = {
2860
3042
  /**
2861
3043
  * Modes.
2862
3044
  *
2863
- * @enum {Number}
3045
+ * @enum {number}
2864
3046
  * @private
2865
3047
  */
2866
3048
  MaterialLayout.prototype.Mode_ = {
@@ -2874,7 +3056,7 @@ MaterialLayout.prototype.Mode_ = {
2874
3056
  * JavaScript. This allows us to simply change it in one place should we
2875
3057
  * decide to modify at a later date.
2876
3058
  *
2877
- * @enum {String}
3059
+ * @enum {string}
2878
3060
  * @private
2879
3061
  */
2880
3062
  MaterialLayout.prototype.CssClasses_ = {
@@ -3056,13 +3238,24 @@ MaterialLayout.prototype.init = function () {
3056
3238
  this.contentScrollHandler_();
3057
3239
  }
3058
3240
  }
3241
+ /**
3242
+ * Prevents an event from triggering the default behaviour.
3243
+ * @param {Event} ev the event to eat.
3244
+ */
3059
3245
  var eatEvent = function (ev) {
3060
3246
  ev.preventDefault();
3061
3247
  };
3062
3248
  // Add drawer toggling button to our layout, if we have an openable drawer.
3063
3249
  if (this.drawer_) {
3064
- var drawerButton = document.createElement('div');
3065
- drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);
3250
+ var drawerButton = this.element_.querySelector('.' + this.CssClasses_.DRAWER_BTN);
3251
+ if (typeof drawerButton === 'undefined' || drawerButton === null) {
3252
+ drawerButton = document.createElement('div');
3253
+ drawerButton.classList.add(this.CssClasses_.DRAWER_BTN);
3254
+ var drawerButtonIcon = document.createElement('i');
3255
+ drawerButtonIcon.classList.add(this.CssClasses_.ICON);
3256
+ drawerButtonIcon.textContent = this.Constant_.MENU_ICON;
3257
+ drawerButton.appendChild(drawerButtonIcon);
3258
+ }
3066
3259
  if (this.drawer_.classList.contains(this.CssClasses_.ON_LARGE_SCREEN)) {
3067
3260
  //If drawer has ON_LARGE_SCREEN class then add it to the drawer toggle button as well.
3068
3261
  drawerButton.classList.add(this.CssClasses_.ON_LARGE_SCREEN);
@@ -3070,10 +3263,6 @@ MaterialLayout.prototype.init = function () {
3070
3263
  //If drawer has ON_SMALL_SCREEN class then add it to the drawer toggle button as well.
3071
3264
  drawerButton.classList.add(this.CssClasses_.ON_SMALL_SCREEN);
3072
3265
  }
3073
- var drawerButtonIcon = document.createElement('i');
3074
- drawerButtonIcon.classList.add(this.CssClasses_.ICON);
3075
- drawerButtonIcon.textContent = this.Constant_.MENU_ICON;
3076
- drawerButton.appendChild(drawerButtonIcon);
3077
3266
  drawerButton.addEventListener('click', this.drawerToggleHandler_.bind(this));
3078
3267
  // Add a class if the layout has a drawer, for altering the left padding.
3079
3268
  // Adds the HAS_DRAWER to the elements since this.header_ may or may
@@ -3152,6 +3341,15 @@ MaterialLayout.prototype.init = function () {
3152
3341
  this.element_.classList.add(this.CssClasses_.IS_UPGRADED);
3153
3342
  }
3154
3343
  };
3344
+ /**
3345
+ * Constructor for an individual tab.
3346
+ *
3347
+ * @constructor
3348
+ * @param {HTMLElement} tab The HTML element for the tab.
3349
+ * @param {!Array<HTMLElement>} tabs Array with HTML elements for all tabs.
3350
+ * @param {!Array<HTMLElement>} panels Array with HTML elements for all panels.
3351
+ * @param {MaterialLayout} layout The MaterialLayout object that owns the tab.
3352
+ */
3155
3353
  function MaterialLayoutTab(tab, tabs, panels, layout) {
3156
3354
  if (tab) {
3157
3355
  if (layout.tabBar_.classList.contains(layout.CssClasses_.JS_RIPPLE_EFFECT)) {
@@ -3202,6 +3400,7 @@ componentHandler.register({
3202
3400
  * Implements MDL component design pattern defined at:
3203
3401
  * https://github.com/jasonmayes/mdl-component-design-pattern
3204
3402
  *
3403
+ * @constructor
3205
3404
  * @param {HTMLElement} element The element that will be upgraded.
3206
3405
  */
3207
3406
  var MaterialDataTable = function MaterialDataTable(element) {
@@ -3209,11 +3408,11 @@ var MaterialDataTable = function MaterialDataTable(element) {
3209
3408
  // Initialize instance.
3210
3409
  this.init();
3211
3410
  };
3212
- window.MaterialDataTable = MaterialDataTable;
3411
+ window['MaterialDataTable'] = MaterialDataTable;
3213
3412
  /**
3214
3413
  * Store constants in one place so they can be updated easily.
3215
3414
  *
3216
- * @enum {String | Number}
3415
+ * @enum {string | number}
3217
3416
  * @private
3218
3417
  */
3219
3418
  MaterialDataTable.prototype.Constant_ = {};
@@ -3222,7 +3421,7 @@ MaterialDataTable.prototype.Constant_ = {};
3222
3421
  * JavaScript. This allows us to simply change it in one place should we
3223
3422
  * decide to modify at a later date.
3224
3423
  *
3225
- * @enum {String}
3424
+ * @enum {string}
3226
3425
  * @private
3227
3426
  */
3228
3427
  MaterialDataTable.prototype.CssClasses_ = {
@@ -3235,12 +3434,12 @@ MaterialDataTable.prototype.CssClasses_ = {
3235
3434
  * Generates and returns a function that toggles the selection state of a
3236
3435
  * single row (or multiple rows).
3237
3436
  *
3238
- * @param {HTMLElement} checkbox Checkbox that toggles the selection state.
3437
+ * @param {Element} checkbox Checkbox that toggles the selection state.
3239
3438
  * @param {HTMLElement} row Row to toggle when checkbox changes.
3240
- * @param {HTMLElement[]} rows Rows to toggle when checkbox changes.
3439
+ * @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.
3241
3440
  * @private
3242
3441
  */
3243
- MaterialDataTable.prototype.selectRow_ = function (checkbox, row, rows) {
3442
+ MaterialDataTable.prototype.selectRow_ = function (checkbox, row, opt_rows) {
3244
3443
  if (row) {
3245
3444
  return function () {
3246
3445
  if (checkbox.checked) {
@@ -3250,21 +3449,21 @@ MaterialDataTable.prototype.selectRow_ = function (checkbox, row, rows) {
3250
3449
  }
3251
3450
  }.bind(this);
3252
3451
  }
3253
- if (rows) {
3452
+ if (opt_rows) {
3254
3453
  return function () {
3255
3454
  var i;
3256
3455
  var el;
3257
3456
  if (checkbox.checked) {
3258
- for (i = 0; i < rows.length; i++) {
3259
- el = rows[i].querySelector('td').querySelector('.mdl-checkbox');
3260
- el.MaterialCheckbox.check();
3261
- rows[i].classList.add(this.CssClasses_.IS_SELECTED);
3457
+ for (i = 0; i < opt_rows.length; i++) {
3458
+ el = opt_rows[i].querySelector('td').querySelector('.mdl-checkbox');
3459
+ el['MaterialCheckbox'].check();
3460
+ opt_rows[i].classList.add(this.CssClasses_.IS_SELECTED);
3262
3461
  }
3263
3462
  } else {
3264
- for (i = 0; i < rows.length; i++) {
3265
- el = rows[i].querySelector('td').querySelector('.mdl-checkbox');
3266
- el.MaterialCheckbox.uncheck();
3267
- rows[i].classList.remove(this.CssClasses_.IS_SELECTED);
3463
+ for (i = 0; i < opt_rows.length; i++) {
3464
+ el = opt_rows[i].querySelector('td').querySelector('.mdl-checkbox');
3465
+ el['MaterialCheckbox'].uncheck();
3466
+ opt_rows[i].classList.remove(this.CssClasses_.IS_SELECTED);
3268
3467
  }
3269
3468
  }
3270
3469
  }.bind(this);
@@ -3275,10 +3474,10 @@ MaterialDataTable.prototype.selectRow_ = function (checkbox, row, rows) {
3275
3474
  * event handling.
3276
3475
  *
3277
3476
  * @param {HTMLElement} row Row to toggle when checkbox changes.
3278
- * @param {HTMLElement[]} rows Rows to toggle when checkbox changes.
3477
+ * @param {(Array<Object>|NodeList)=} opt_rows Rows to toggle when checkbox changes.
3279
3478
  * @private
3280
3479
  */
3281
- MaterialDataTable.prototype.createCheckbox_ = function (row, rows) {
3480
+ MaterialDataTable.prototype.createCheckbox_ = function (row, opt_rows) {
3282
3481
  var label = document.createElement('label');
3283
3482
  label.classList.add('mdl-checkbox');
3284
3483
  label.classList.add('mdl-js-checkbox');
@@ -3289,8 +3488,8 @@ MaterialDataTable.prototype.createCheckbox_ = function (row, rows) {
3289
3488
  checkbox.classList.add('mdl-checkbox__input');
3290
3489
  if (row) {
3291
3490
  checkbox.addEventListener('change', this.selectRow_(checkbox, row));
3292
- } else if (rows) {
3293
- checkbox.addEventListener('change', this.selectRow_(checkbox, null, rows));
3491
+ } else if (opt_rows) {
3492
+ checkbox.addEventListener('change', this.selectRow_(checkbox, null, opt_rows));
3294
3493
  }
3295
3494
  label.appendChild(checkbox);
3296
3495
  componentHandler.upgradeElement(label, 'MaterialCheckbox');
@@ -3349,6 +3548,7 @@ componentHandler.register({
3349
3548
  * Implements MDL component design pattern defined at:
3350
3549
  * https://github.com/jasonmayes/mdl-component-design-pattern
3351
3550
  *
3551
+ * @constructor
3352
3552
  * @param {HTMLElement} element The element that will be upgraded.
3353
3553
  */
3354
3554
  var MaterialRipple = function MaterialRipple(element) {
@@ -3356,11 +3556,11 @@ var MaterialRipple = function MaterialRipple(element) {
3356
3556
  // Initialize instance.
3357
3557
  this.init();
3358
3558
  };
3359
- window.MaterialRipple = MaterialRipple;
3559
+ window['MaterialRipple'] = MaterialRipple;
3360
3560
  /**
3361
3561
  * Store constants in one place so they can be updated easily.
3362
3562
  *
3363
- * @enum {String | Number}
3563
+ * @enum {string | number}
3364
3564
  * @private
3365
3565
  */
3366
3566
  MaterialRipple.prototype.Constant_ = {
@@ -3375,7 +3575,7 @@ MaterialRipple.prototype.Constant_ = {
3375
3575
  * JavaScript. This allows us to simply change it in one place should we
3376
3576
  * decide to modify at a later date.
3377
3577
  *
3378
- * @enum {String}
3578
+ * @enum {string}
3379
3579
  * @private
3380
3580
  */
3381
3581
  MaterialRipple.prototype.CssClasses_ = {
@@ -3472,19 +3672,40 @@ MaterialRipple.prototype.init = function () {
3472
3672
  this.element_.addEventListener('mouseleave', this.boundUpHandler);
3473
3673
  this.element_.addEventListener('touchend', this.boundUpHandler);
3474
3674
  this.element_.addEventListener('blur', this.boundUpHandler);
3675
+ /**
3676
+ * Getter for frameCount_.
3677
+ * @return {number} the frame count.
3678
+ */
3475
3679
  this.getFrameCount = function () {
3476
3680
  return this.frameCount_;
3477
3681
  };
3682
+ /**
3683
+ * Setter for frameCount_.
3684
+ * @param {number} fC the frame count.
3685
+ */
3478
3686
  this.setFrameCount = function (fC) {
3479
3687
  this.frameCount_ = fC;
3480
3688
  };
3689
+ /**
3690
+ * Getter for rippleElement_.
3691
+ * @return {Element} the ripple element.
3692
+ */
3481
3693
  this.getRippleElement = function () {
3482
3694
  return this.rippleElement_;
3483
3695
  };
3696
+ /**
3697
+ * Sets the ripple X and Y coordinates.
3698
+ * @param {number} newX the new X coordinate
3699
+ * @param {number} newY the new Y coordinate
3700
+ */
3484
3701
  this.setRippleXY = function (newX, newY) {
3485
3702
  this.x_ = newX;
3486
3703
  this.y_ = newY;
3487
3704
  };
3705
+ /**
3706
+ * Sets the ripple styles.
3707
+ * @param {boolean} start whether or not this is the start frame.
3708
+ */
3488
3709
  this.setRippleStyles = function (start) {
3489
3710
  if (this.rippleElement_ !== null) {
3490
3711
  var transformString;
@@ -3512,6 +3733,9 @@ MaterialRipple.prototype.init = function () {
3512
3733
  }
3513
3734
  }
3514
3735
  };
3736
+ /**
3737
+ * Handles an animation frame.
3738
+ */
3515
3739
  this.animFrameHandler = function () {
3516
3740
  if (this.frameCount_-- > 0) {
3517
3741
  window.requestAnimationFrame(this.animFrameHandler.bind(this));