UNPKG

@material/selection-control

Version:
1,385 lines (1,147 loc) 69.5 kB
/*! Material Components for the Web Copyright (c) 2019 Google Inc. License: MIT */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["selectionControl"] = factory(); else root["mdc"] = root["mdc"] || {}, root["mdc"]["selectionControl"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 7); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * @license * Copyright 2016 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @template A */ var MDCFoundation = function () { _createClass(MDCFoundation, null, [{ key: "cssClasses", /** @return enum{cssClasses} */ get: function get() { // Classes extending MDCFoundation should implement this method to return an object which exports every // CSS class the foundation class needs as a property. e.g. {ACTIVE: 'mdc-component--active'} return {}; } /** @return enum{strings} */ }, { key: "strings", get: function get() { // Classes extending MDCFoundation should implement this method to return an object which exports all // semantic strings as constants. e.g. {ARIA_ROLE: 'tablist'} return {}; } /** @return enum{numbers} */ }, { key: "numbers", get: function get() { // Classes extending MDCFoundation should implement this method to return an object which exports all // of its semantic numbers as constants. e.g. {ANIMATION_DELAY_MS: 350} return {}; } /** @return {!Object} */ }, { key: "defaultAdapter", get: function get() { // Classes extending MDCFoundation may choose to implement this getter in order to provide a convenient // way of viewing the necessary methods of an adapter. In the future, this could also be used for adapter // validation. return {}; } /** * @param {A=} adapter */ }]); function MDCFoundation() { var adapter = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, MDCFoundation); /** @protected {!A} */ this.adapter_ = adapter; } _createClass(MDCFoundation, [{ key: "init", value: function init() { // Subclasses should override this method to perform initialization routines (registering events, etc.) } }, { key: "destroy", value: function destroy() { // Subclasses should override this method to perform de-initialization routines (de-registering events, etc.) } }]); return MDCFoundation; }(); /* harmony default export */ __webpack_exports__["a"] = (MDCFoundation); /***/ }), /* 1 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__foundation__ = __webpack_require__(0); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * @license * Copyright 2016 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @template F */ var MDCComponent = function () { _createClass(MDCComponent, null, [{ key: 'attachTo', /** * @param {!Element} root * @return {!MDCComponent} */ value: function attachTo(root) { // Subclasses which extend MDCBase should provide an attachTo() method that takes a root element and // returns an instantiated component with its root set to that element. Also note that in the cases of // subclasses, an explicit foundation class will not have to be passed in; it will simply be initialized // from getDefaultFoundation(). return new MDCComponent(root, new __WEBPACK_IMPORTED_MODULE_0__foundation__["a" /* default */]()); } /** * @param {!Element} root * @param {F=} foundation * @param {...?} args */ }]); function MDCComponent(root) { var foundation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; _classCallCheck(this, MDCComponent); /** @protected {!Element} */ this.root_ = root; for (var _len = arguments.length, args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } this.initialize.apply(this, args); // Note that we initialize foundation here and not within the constructor's default param so that // this.root_ is defined and can be used within the foundation class. /** @protected {!F} */ this.foundation_ = foundation === undefined ? this.getDefaultFoundation() : foundation; this.foundation_.init(); this.initialSyncWithDOM(); } _createClass(MDCComponent, [{ key: 'initialize', value: function initialize() /* ...args */{} // Subclasses can override this to do any additional setup work that would be considered part of a // "constructor". Essentially, it is a hook into the parent constructor before the foundation is // initialized. Any additional arguments besides root and foundation will be passed in here. /** * @return {!F} foundation */ }, { key: 'getDefaultFoundation', value: function getDefaultFoundation() { // Subclasses must override this method to return a properly configured foundation class for the // component. throw new Error('Subclasses must override getDefaultFoundation to return a properly configured ' + 'foundation class'); } }, { key: 'initialSyncWithDOM', value: function initialSyncWithDOM() { // Subclasses should override this method if they need to perform work to synchronize with a host DOM // object. An example of this would be a form control wrapper that needs to synchronize its internal state // to some property or attribute of the host DOM. Please note: this is *not* the place to perform DOM // reads/writes that would cause layout / paint, as this is called synchronously from within the constructor. } }, { key: 'destroy', value: function destroy() { // Subclasses may implement this method to release any resources / deregister any listeners they have // attached. An example of this might be deregistering a resize event from the window object. this.foundation_.destroy(); } /** * Wrapper method to add an event listener to the component's root element. This is most useful when * listening for custom events. * @param {string} evtType * @param {!Function} handler */ }, { key: 'listen', value: function listen(evtType, handler) { this.root_.addEventListener(evtType, handler); } /** * Wrapper method to remove an event listener to the component's root element. This is most useful when * unlistening for custom events. * @param {string} evtType * @param {!Function} handler */ }, { key: 'unlisten', value: function unlisten(evtType, handler) { this.root_.removeEventListener(evtType, handler); } /** * Fires a cross-browser-compatible custom event from the component root of the given type, * with the given data. * @param {string} evtType * @param {!Object} evtData * @param {boolean=} shouldBubble */ }, { key: 'emit', value: function emit(evtType, evtData) { var shouldBubble = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; var evt = void 0; if (typeof CustomEvent === 'function') { evt = new CustomEvent(evtType, { detail: evtData, bubbles: shouldBubble }); } else { evt = document.createEvent('CustomEvent'); evt.initCustomEvent(evtType, shouldBubble, false, evtData); } this.root_.dispatchEvent(evt); } }]); return MDCComponent; }(); /* harmony default export */ __webpack_exports__["a"] = (MDCComponent); /***/ }), /* 2 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "supportsCssVariables", function() { return supportsCssVariables; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "applyPassive", function() { return applyPassive; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMatchesProperty", function() { return getMatchesProperty; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getNormalizedEventCoords", function() { return getNormalizedEventCoords; }); /** * @license * Copyright 2016 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * Stores result from supportsCssVariables to avoid redundant processing to detect CSS custom variable support. * @private {boolean|undefined} */ var supportsCssVariables_ = void 0; /** * Stores result from applyPassive to avoid redundant processing to detect passive event listener support. * @private {boolean|undefined} */ var supportsPassive_ = void 0; /** * @param {!Window} windowObj * @return {boolean} */ function detectEdgePseudoVarBug(windowObj) { // Detect versions of Edge with buggy var() support // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11495448/ var document = windowObj.document; var node = document.createElement('div'); node.className = 'mdc-ripple-surface--test-edge-var-bug'; document.body.appendChild(node); // The bug exists if ::before style ends up propagating to the parent element. // Additionally, getComputedStyle returns null in iframes with display: "none" in Firefox, // but Firefox is known to support CSS custom properties correctly. // See: https://bugzilla.mozilla.org/show_bug.cgi?id=548397 var computedStyle = windowObj.getComputedStyle(node); var hasPseudoVarBug = computedStyle !== null && computedStyle.borderTopStyle === 'solid'; node.remove(); return hasPseudoVarBug; } /** * @param {!Window} windowObj * @param {boolean=} forceRefresh * @return {boolean|undefined} */ function supportsCssVariables(windowObj) { var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; var supportsCssVariables = supportsCssVariables_; if (typeof supportsCssVariables_ === 'boolean' && !forceRefresh) { return supportsCssVariables; } var supportsFunctionPresent = windowObj.CSS && typeof windowObj.CSS.supports === 'function'; if (!supportsFunctionPresent) { return; } var explicitlySupportsCssVars = windowObj.CSS.supports('--css-vars', 'yes'); // See: https://bugs.webkit.org/show_bug.cgi?id=154669 // See: README section on Safari var weAreFeatureDetectingSafari10plus = windowObj.CSS.supports('(--css-vars: yes)') && windowObj.CSS.supports('color', '#00000000'); if (explicitlySupportsCssVars || weAreFeatureDetectingSafari10plus) { supportsCssVariables = !detectEdgePseudoVarBug(windowObj); } else { supportsCssVariables = false; } if (!forceRefresh) { supportsCssVariables_ = supportsCssVariables; } return supportsCssVariables; } // /** * Determine whether the current browser supports passive event listeners, and if so, use them. * @param {!Window=} globalObj * @param {boolean=} forceRefresh * @return {boolean|!EventListenerOptions} */ function applyPassive() { var globalObj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : window; var forceRefresh = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; if (supportsPassive_ === undefined || forceRefresh) { var isSupported = false; try { globalObj.document.addEventListener('test', null, { get passive() { isSupported = true; return isSupported; } }); } catch (e) {} supportsPassive_ = isSupported; } return supportsPassive_ ? /** @type {!EventListenerOptions} */{ passive: true } : false; } /** * @param {!Object} HTMLElementPrototype * @return {string} */ function getMatchesProperty(HTMLElementPrototype) { /** * Order is important because we return the first existing method we find. * Do not change the order of the items in the below array. */ var matchesMethods = ['matches', 'webkitMatchesSelector', 'msMatchesSelector']; var method = 'matches'; for (var i = 0; i < matchesMethods.length; i++) { var matchesMethod = matchesMethods[i]; if (matchesMethod in HTMLElementPrototype) { method = matchesMethod; break; } } return method; } /** * @param {!Event} ev * @param {{x: number, y: number}} pageOffset * @param {!ClientRect} clientRect * @return {{x: number, y: number}} */ function getNormalizedEventCoords(ev, pageOffset, clientRect) { var x = pageOffset.x, y = pageOffset.y; var documentX = x + clientRect.left; var documentY = y + clientRect.top; var normalizedX = void 0; var normalizedY = void 0; // Determine touch point relative to the ripple container. if (ev.type === 'touchstart') { ev = /** @type {!TouchEvent} */ev; normalizedX = ev.changedTouches[0].pageX - documentX; normalizedY = ev.changedTouches[0].pageY - documentY; } else { ev = /** @type {!MouseEvent} */ev; normalizedX = ev.pageX - documentX; normalizedY = ev.pageY - documentY; } return { x: normalizedX, y: normalizedY }; } /***/ }), /* 3 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } /** * @license * Copyright 2016 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /* eslint no-unused-vars: [2, {"args": "none"}] */ /** * Adapter for MDC Ripple. Provides an interface for managing * - classes * - dom * - CSS variables * - position * - dimensions * - scroll position * - event handlers * - unbounded, active and disabled states * * Additionally, provides type information for the adapter to the Closure * compiler. * * Implement this adapter for your framework of choice to delegate updates to * the component in your framework of choice. See architecture documentation * for more details. * https://github.com/material-components/material-components-web/blob/master/docs/code/architecture.md * * @record */ var MDCRippleAdapter = function () { function MDCRippleAdapter() { _classCallCheck(this, MDCRippleAdapter); } _createClass(MDCRippleAdapter, [{ key: "browserSupportsCssVars", /** @return {boolean} */ value: function browserSupportsCssVars() {} /** @return {boolean} */ }, { key: "isUnbounded", value: function isUnbounded() {} /** @return {boolean} */ }, { key: "isSurfaceActive", value: function isSurfaceActive() {} /** @return {boolean} */ }, { key: "isSurfaceDisabled", value: function isSurfaceDisabled() {} /** @param {string} className */ }, { key: "addClass", value: function addClass(className) {} /** @param {string} className */ }, { key: "removeClass", value: function removeClass(className) {} /** @param {!EventTarget} target */ }, { key: "containsEventTarget", value: function containsEventTarget(target) {} /** * @param {string} evtType * @param {!Function} handler */ }, { key: "registerInteractionHandler", value: function registerInteractionHandler(evtType, handler) {} /** * @param {string} evtType * @param {!Function} handler */ }, { key: "deregisterInteractionHandler", value: function deregisterInteractionHandler(evtType, handler) {} /** * @param {string} evtType * @param {!Function} handler */ }, { key: "registerDocumentInteractionHandler", value: function registerDocumentInteractionHandler(evtType, handler) {} /** * @param {string} evtType * @param {!Function} handler */ }, { key: "deregisterDocumentInteractionHandler", value: function deregisterDocumentInteractionHandler(evtType, handler) {} /** * @param {!Function} handler */ }, { key: "registerResizeHandler", value: function registerResizeHandler(handler) {} /** * @param {!Function} handler */ }, { key: "deregisterResizeHandler", value: function deregisterResizeHandler(handler) {} /** * @param {string} varName * @param {?number|string} value */ }, { key: "updateCssVariable", value: function updateCssVariable(varName, value) {} /** @return {!ClientRect} */ }, { key: "computeBoundingRect", value: function computeBoundingRect() {} /** @return {{x: number, y: number}} */ }, { key: "getWindowPageOffset", value: function getWindowPageOffset() {} }]); return MDCRippleAdapter; }(); /* unused harmony default export */ var _unused_webpack_default_export = (MDCRippleAdapter); /***/ }), /* 4 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRipple", function() { return MDCRipple; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RippleCapableSurface", function() { return RippleCapableSurface; }); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_component__ = __webpack_require__(1); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__foundation__ = __webpack_require__(5); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(2); /* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, "MDCRippleFoundation", function() { return __WEBPACK_IMPORTED_MODULE_2__foundation__["a"]; }); /* harmony reexport (module object) */ __webpack_require__.d(__webpack_exports__, "util", function() { return __WEBPACK_IMPORTED_MODULE_3__util__; }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @license * Copyright 2016 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @extends MDCComponent<!MDCRippleFoundation> */ var MDCRipple = function (_MDCComponent) { _inherits(MDCRipple, _MDCComponent); /** @param {...?} args */ function MDCRipple() { var _ref; _classCallCheck(this, MDCRipple); for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } /** @type {boolean} */ var _this = _possibleConstructorReturn(this, (_ref = MDCRipple.__proto__ || Object.getPrototypeOf(MDCRipple)).call.apply(_ref, [this].concat(args))); _this.disabled = false; /** @private {boolean} */ _this.unbounded_; return _this; } /** * @param {!Element} root * @param {{isUnbounded: (boolean|undefined)}=} options * @return {!MDCRipple} */ _createClass(MDCRipple, [{ key: 'setUnbounded_', /** * Closure Compiler throws an access control error when directly accessing a * protected or private property inside a getter/setter, like unbounded above. * By accessing the protected property inside a method, we solve that problem. * That's why this function exists. * @private */ value: function setUnbounded_() { this.foundation_.setUnbounded(this.unbounded_); } }, { key: 'activate', value: function activate() { this.foundation_.activate(); } }, { key: 'deactivate', value: function deactivate() { this.foundation_.deactivate(); } }, { key: 'layout', value: function layout() { this.foundation_.layout(); } /** * @return {!MDCRippleFoundation} * @override */ }, { key: 'getDefaultFoundation', value: function getDefaultFoundation() { return new __WEBPACK_IMPORTED_MODULE_2__foundation__["a" /* default */](MDCRipple.createAdapter(this)); } /** @override */ }, { key: 'initialSyncWithDOM', value: function initialSyncWithDOM() { this.unbounded = 'mdcRippleIsUnbounded' in this.root_.dataset; } }, { key: 'unbounded', /** @return {boolean} */ get: function get() { return this.unbounded_; } /** @param {boolean} unbounded */ , set: function set(unbounded) { this.unbounded_ = Boolean(unbounded); this.setUnbounded_(); } }], [{ key: 'attachTo', value: function attachTo(root) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref2$isUnbounded = _ref2.isUnbounded, isUnbounded = _ref2$isUnbounded === undefined ? undefined : _ref2$isUnbounded; var ripple = new MDCRipple(root); // Only override unbounded behavior if option is explicitly specified if (isUnbounded !== undefined) { ripple.unbounded = /** @type {boolean} */isUnbounded; } return ripple; } /** * @param {!RippleCapableSurface} instance * @return {!MDCRippleAdapter} */ }, { key: 'createAdapter', value: function createAdapter(instance) { var MATCHES = __WEBPACK_IMPORTED_MODULE_3__util__["getMatchesProperty"](HTMLElement.prototype); return { browserSupportsCssVars: function browserSupportsCssVars() { return __WEBPACK_IMPORTED_MODULE_3__util__["supportsCssVariables"](window); }, isUnbounded: function isUnbounded() { return instance.unbounded; }, isSurfaceActive: function isSurfaceActive() { return instance.root_[MATCHES](':active'); }, isSurfaceDisabled: function isSurfaceDisabled() { return instance.disabled; }, addClass: function addClass(className) { return instance.root_.classList.add(className); }, removeClass: function removeClass(className) { return instance.root_.classList.remove(className); }, containsEventTarget: function containsEventTarget(target) { return instance.root_.contains(target); }, registerInteractionHandler: function registerInteractionHandler(evtType, handler) { return instance.root_.addEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]()); }, deregisterInteractionHandler: function deregisterInteractionHandler(evtType, handler) { return instance.root_.removeEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]()); }, registerDocumentInteractionHandler: function registerDocumentInteractionHandler(evtType, handler) { return document.documentElement.addEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]()); }, deregisterDocumentInteractionHandler: function deregisterDocumentInteractionHandler(evtType, handler) { return document.documentElement.removeEventListener(evtType, handler, __WEBPACK_IMPORTED_MODULE_3__util__["applyPassive"]()); }, registerResizeHandler: function registerResizeHandler(handler) { return window.addEventListener('resize', handler); }, deregisterResizeHandler: function deregisterResizeHandler(handler) { return window.removeEventListener('resize', handler); }, updateCssVariable: function updateCssVariable(varName, value) { return instance.root_.style.setProperty(varName, value); }, computeBoundingRect: function computeBoundingRect() { return instance.root_.getBoundingClientRect(); }, getWindowPageOffset: function getWindowPageOffset() { return { x: window.pageXOffset, y: window.pageYOffset }; } }; } }]); return MDCRipple; }(__WEBPACK_IMPORTED_MODULE_0__material_base_component__["a" /* default */]); /** * See Material Design spec for more details on when to use ripples. * https://material.io/guidelines/motion/choreography.html#choreography-creation * @record */ var RippleCapableSurface = function RippleCapableSurface() { _classCallCheck(this, RippleCapableSurface); }; /** @protected {!Element} */ RippleCapableSurface.prototype.root_; /** * Whether or not the ripple bleeds out of the bounds of the element. * @type {boolean|undefined} */ RippleCapableSurface.prototype.unbounded; /** * Whether or not the ripple is attached to a disabled component. * @type {boolean|undefined} */ RippleCapableSurface.prototype.disabled; /***/ }), /* 5 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__material_base_foundation__ = __webpack_require__(0); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__adapter__ = __webpack_require__(3); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__constants__ = __webpack_require__(6); /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util__ = __webpack_require__(2); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /** * @license * Copyright 2016 Google Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ /** * @typedef {{ * isActivated: (boolean|undefined), * hasDeactivationUXRun: (boolean|undefined), * wasActivatedByPointer: (boolean|undefined), * wasElementMadeActive: (boolean|undefined), * activationEvent: (!Event|undefined), * isProgrammatic: (boolean|undefined) * }} */ var ActivationStateType = void 0; /** * @typedef {{ * activate: (string|undefined), * deactivate: (string|undefined), * focus: (string|undefined), * blur: (string|undefined) * }} */ var ListenerInfoType = void 0; /** * @typedef {{ * activate: function(!Event), * deactivate: function(!Event=), * focus: function(), * blur: function() * }} */ var ListenersType = void 0; /** * @typedef {{ * x: number, * y: number * }} */ var PointType = void 0; // Activation events registered on the root element of each instance for activation var ACTIVATION_EVENT_TYPES = ['touchstart', 'pointerdown', 'mousedown', 'keydown']; // Deactivation events registered on documentElement when a pointer-related down event occurs var POINTER_DEACTIVATION_EVENT_TYPES = ['touchend', 'pointerup', 'mouseup', 'contextmenu']; // Tracks activations that have occurred on the current frame, to avoid simultaneous nested activations /** @type {!Array<!EventTarget>} */ var activatedTargets = []; /** * @extends {MDCFoundation<!MDCRippleAdapter>} */ var MDCRippleFoundation = function (_MDCFoundation) { _inherits(MDCRippleFoundation, _MDCFoundation); _createClass(MDCRippleFoundation, null, [{ key: 'cssClasses', get: function get() { return __WEBPACK_IMPORTED_MODULE_2__constants__["a" /* cssClasses */]; } }, { key: 'strings', get: function get() { return __WEBPACK_IMPORTED_MODULE_2__constants__["c" /* strings */]; } }, { key: 'numbers', get: function get() { return __WEBPACK_IMPORTED_MODULE_2__constants__["b" /* numbers */]; } }, { key: 'defaultAdapter', get: function get() { return { browserSupportsCssVars: function browserSupportsCssVars() /* boolean - cached */{}, isUnbounded: function isUnbounded() /* boolean */{}, isSurfaceActive: function isSurfaceActive() /* boolean */{}, isSurfaceDisabled: function isSurfaceDisabled() /* boolean */{}, addClass: function addClass() /* className: string */{}, removeClass: function removeClass() /* className: string */{}, containsEventTarget: function containsEventTarget() /* target: !EventTarget */{}, registerInteractionHandler: function registerInteractionHandler() /* evtType: string, handler: EventListener */{}, deregisterInteractionHandler: function deregisterInteractionHandler() /* evtType: string, handler: EventListener */{}, registerDocumentInteractionHandler: function registerDocumentInteractionHandler() /* evtType: string, handler: EventListener */{}, deregisterDocumentInteractionHandler: function deregisterDocumentInteractionHandler() /* evtType: string, handler: EventListener */{}, registerResizeHandler: function registerResizeHandler() /* handler: EventListener */{}, deregisterResizeHandler: function deregisterResizeHandler() /* handler: EventListener */{}, updateCssVariable: function updateCssVariable() /* varName: string, value: string */{}, computeBoundingRect: function computeBoundingRect() /* ClientRect */{}, getWindowPageOffset: function getWindowPageOffset() /* {x: number, y: number} */{} }; } }]); function MDCRippleFoundation(adapter) { _classCallCheck(this, MDCRippleFoundation); /** @private {number} */ var _this = _possibleConstructorReturn(this, (MDCRippleFoundation.__proto__ || Object.getPrototypeOf(MDCRippleFoundation)).call(this, _extends(MDCRippleFoundation.defaultAdapter, adapter))); _this.layoutFrame_ = 0; /** @private {!ClientRect} */ _this.frame_ = /** @type {!ClientRect} */{ width: 0, height: 0 }; /** @private {!ActivationStateType} */ _this.activationState_ = _this.defaultActivationState_(); /** @private {number} */ _this.initialSize_ = 0; /** @private {number} */ _this.maxRadius_ = 0; /** @private {function(!Event)} */ _this.activateHandler_ = function (e) { return _this.activate_(e); }; /** @private {function(!Event=)} */ _this.deactivateHandler_ = function () { return _this.deactivate_(); }; /** @private {function(!Event=)} */ _this.focusHandler_ = function () { return _this.handleFocus(); }; /** @private {function(!Event=)} */ _this.blurHandler_ = function () { return _this.handleBlur(); }; /** @private {!Function} */ _this.resizeHandler_ = function () { return _this.layout(); }; /** @private {{left: number, top:number}} */ _this.unboundedCoords_ = { left: 0, top: 0 }; /** @private {number} */ _this.fgScale_ = 0; /** @private {number} */ _this.activationTimer_ = 0; /** @private {number} */ _this.fgDeactivationRemovalTimer_ = 0; /** @private {boolean} */ _this.activationAnimationHasEnded_ = false; /** @private {!Function} */ _this.activationTimerCallback_ = function () { _this.activationAnimationHasEnded_ = true; _this.runDeactivationUXLogicIfReady_(); }; /** @private {!Event|undefined} */ _this.previousActivationEvent_; return _this; } /** * We compute this property so that we are not querying information about the client * until the point in time where the foundation requests it. This prevents scenarios where * client-side feature-detection may happen too early, such as when components are rendered on the server * and then initialized at mount time on the client. * @return {boolean} * @private */ _createClass(MDCRippleFoundation, [{ key: 'supportsPressRipple_', value: function supportsPressRipple_() { return this.adapter_.browserSupportsCssVars(); } /** * @return {!ActivationStateType} */ }, { key: 'defaultActivationState_', value: function defaultActivationState_() { return { isActivated: false, hasDeactivationUXRun: false, wasActivatedByPointer: false, wasElementMadeActive: false, activationEvent: undefined, isProgrammatic: false }; } /** @override */ }, { key: 'init', value: function init() { var _this2 = this; var supportsPressRipple = this.supportsPressRipple_(); this.registerRootHandlers_(supportsPressRipple); if (supportsPressRipple) { var _MDCRippleFoundation$ = MDCRippleFoundation.cssClasses, ROOT = _MDCRippleFoundation$.ROOT, UNBOUNDED = _MDCRippleFoundation$.UNBOUNDED; requestAnimationFrame(function () { _this2.adapter_.addClass(ROOT); if (_this2.adapter_.isUnbounded()) { _this2.adapter_.addClass(UNBOUNDED); // Unbounded ripples need layout logic applied immediately to set coordinates for both shade and ripple _this2.layoutInternal_(); } }); } } /** @override */ }, { key: 'destroy', value: function destroy() { var _this3 = this; if (this.supportsPressRipple_()) { if (this.activationTimer_) { clearTimeout(this.activationTimer_); this.activationTimer_ = 0; this.adapter_.removeClass(MDCRippleFoundation.cssClasses.FG_ACTIVATION); } if (this.fgDeactivationRemovalTimer_) { clearTimeout(this.fgDeactivationRemovalTimer_); this.fgDeactivationRemovalTimer_ = 0; this.adapter_.removeClass(MDCRippleFoundation.cssClasses.FG_DEACTIVATION); } var _MDCRippleFoundation$2 = MDCRippleFoundation.cssClasses, ROOT = _MDCRippleFoundation$2.ROOT, UNBOUNDED = _MDCRippleFoundation$2.UNBOUNDED; requestAnimationFrame(function () { _this3.adapter_.removeClass(ROOT); _this3.adapter_.removeClass(UNBOUNDED); _this3.removeCssVars_(); }); } this.deregisterRootHandlers_(); this.deregisterDeactivationHandlers_(); } /** * @param {boolean} supportsPressRipple Passed from init to save a redundant function call * @private */ }, { key: 'registerRootHandlers_', value: function registerRootHandlers_(supportsPressRipple) { var _this4 = this; if (supportsPressRipple) { ACTIVATION_EVENT_TYPES.forEach(function (type) { _this4.adapter_.registerInteractionHandler(type, _this4.activateHandler_); }); if (this.adapter_.isUnbounded()) { this.adapter_.registerResizeHandler(this.resizeHandler_); } } this.adapter_.registerInteractionHandler('focus', this.focusHandler_); this.adapter_.registerInteractionHandler('blur', this.blurHandler_); } /** * @param {!Event} e * @private */ }, { key: 'registerDeactivationHandlers_', value: function registerDeactivationHandlers_(e) { var _this5 = this; if (e.type === 'keydown') { this.adapter_.registerInteractionHandler('keyup', this.deactivateHandler_); } else { POINTER_DEACTIVATION_EVENT_TYPES.forEach(function (type) { _this5.adapter_.registerDocumentInteractionHandler(type, _this5.deactivateHandler_); }); } } /** @private */ }, { key: 'deregisterRootHandlers_', value: function deregisterRootHandlers_() { var _this6 = this; ACTIVATION_EVENT_TYPES.forEach(function (type) { _this6.adapter_.deregisterInteractionHandler(type, _this6.activateHandler_); }); this.adapter_.deregisterInteractionHandler('focus', this.focusHandler_); this.adapter_.deregisterInteractionHandler('blur', this.blurHandler_); if (this.adapter_.isUnbounded()) { this.adapter_.deregisterResizeHandler(this.resizeHandler_); } } /** @private */ }, { key: 'deregisterDeactivationHandlers_', value: function deregisterDeactivationHandlers_() { var _this7 = this; this.adapter_.deregisterInteractionHandler('keyup', this.deactivateHandler_); POINTER_DEACTIVATION_EVENT_TYPES.forEach(function (type) { _this7.adapter_.deregisterDocumentInteractionHandler(type, _this7.deactivateHandler_); }); } /** @private */ }, { key: 'removeCssVars_', value: function removeCssVars_() { var _this8 = this; var strings = MDCRippleFoundation.strings; Object.keys(strings).forEach(function (k) { if (k.indexOf('VAR_') === 0) {