{"version":3,"file":"kendo.ripple.min.js","names":["factory","define","amd","window","kendo","util","ripple","once","element","eventName","fn","listener","removeEventListener","remove","addEventListener","activate","containerSelector","options","e","container","target","doc","document","ownerDocument","selector","closest","matches","Element","prototype","el","sel","msMatchesSelector","node","parentElement","test","type","classList","contains","add","_a","createElement","className","blob","appendChild","createRipple","state_1","animated","released","eventType","focusin","keydown","mousedown","pointerdown","touchdown","animationstart","currentTarget","release","getComputedStyle","getPropertyValue","rect","getBoundingClientRect","left","top","clientX","clientY","width","height","dx","dy","size","Math","sqrt","style","offsetWidth","Error","cssText","setTimeout","finishAnimation","state","deactivate","parentNode","removeChild","transition","opacity","deepExtend","register","root","elements","arr","handlers","map","item","defaultOptions","events","global","activator","body","forEach","evt","concat","apply","$","undefined$1","ui","Widget","extend","RippleContainer","init","that","this","call","wrapper","registerListeners","name","nextElementSibling","removeListeners","callback","destroy","plugin","jQuery"],"sources":["kendo.ripple.js"],"mappings":"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","sourcesContent":["(function (factory) {\n typeof define === 'function' && define.amd ? define(['kendo.core'], factory) :\n factory();\n})((function () {\n (function () {\n\n window.kendo.util = window.kendo.util || {};\n window.kendo.util.ripple = window.kendo.util.ripple || {};\n\n var closest = function (element, selector) {\n if (element.closest) {\n return element.closest(selector);\n }\n var matches = Element.prototype.matches ?\n function (el, sel) { return el.matches(sel); }\n : function (el, sel) { return el.msMatchesSelector(sel); };\n var node = element;\n while (node) {\n if (matches(node, selector)) {\n return node;\n }\n node = node.parentElement;\n }\n };\n var createRipple = function (doc) {\n var ripple = doc.createElement('div');\n ripple.className = 'k-ripple';\n var blob = doc.createElement('div');\n blob.className = 'k-ripple-blob';\n ripple.appendChild(blob);\n return [ripple, blob];\n };\n var once = function (element, eventName, fn) {\n var listener = function () {\n fn();\n element.removeEventListener(eventName, listener, false);\n };\n var remove = function () { return element.addEventListener(eventName, listener, false); };\n remove();\n return { remove: remove };\n };\n var activate = function (containerSelector, options) { return function (e) {\n var target = e.target;\n var doc = target.document || target.ownerDocument;\n var container;\n if (options.container) {\n container = options.container(target);\n }\n else {\n container = closest(target, containerSelector);\n }\n if (!container) {\n return;\n }\n // focus event of ripple container triggers double-focus\n var doubleFocus = /focus/i.test(e.type) && container.classList.contains(\"k-ripple-target\");\n if (doubleFocus) {\n return;\n }\n if (!target.classList.contains('k-checkbox') && !target.classList.contains('k-radio')) {\n // suppress focus when animating ripples\n container.classList.add(\"k-ripple-target\");\n var _a = createRipple(doc), ripple = _a[0], blob = _a[1];\n var state_1 = {\n animated: false,\n released: false,\n blob: blob,\n container: container,\n ripple: ripple\n };\n var eventType = {\n 'focusin': 'focusout',\n 'keydown': 'keyup',\n 'mousedown': 'mouseup',\n 'pointerdown': 'pointerup',\n 'touchdown': 'touchup',\n 'animationstart': 'animationend'\n }[e.type];\n once(e.currentTarget, eventType, function () { return release(state_1); });\n container.appendChild(ripple);\n // recalc to allow the effect to animate\n window.getComputedStyle(ripple).getPropertyValue('opacity');\n var rect = container.getBoundingClientRect();\n var left = 0;\n var top = 0;\n if ((/mouse|pointer|touch/).test(e.type)) {\n left = e.clientX - rect.left;\n top = e.clientY - rect.top;\n }\n else {\n left = rect.width / 2;\n top = rect.height / 2;\n }\n // coordinates of the farthest corner\n var xMax = left < rect.width / 2 ? rect.width : 0;\n var yMax = top < rect.height / 2 ? rect.height : 0;\n // distance to the farthest corner\n var dx = left - xMax;\n var dy = top - yMax;\n // blob size is twice the blob radius\n var size = 2 * Math.sqrt(dx * dx + dy * dy);\n var duration = 500;\n blob.style.width = blob.style.height = size + \"px\";\n // force reflow for Safari 11 to align ripple blob\n if (blob.offsetWidth < 0) {\n throw new Error(\"Inconceivable!\");\n }\n blob.style.cssText = \"\\n width: \" + size + \"px;\\n height: \" + size + \"px;\\n transform: translate(-50%, -50%) scale(1);\\n left: \" + left + \"px;\\n top: \" + top + \"px;\\n \";\n setTimeout(function () { return finishAnimation(state_1); }, duration);\n }\n else {\n e.target.classList.remove('k-ripple-focus');\n if (e.type !== 'animationend') {\n e.target.classList.add('k-ripple-focus');\n }\n }\n }; };\n var finishAnimation = function (state) {\n state.animated = true;\n deactivate(state);\n };\n var release = function (state) {\n state.released = true;\n deactivate(state);\n };\n var deactivate = function (state) {\n // deactivation happens when both\n // - the activation event has been released (release)\n // - the ripple has finished animating (finishAnimation)\n if (!state.released || !state.animated) {\n return;\n }\n var blob = state.blob, ripple = state.ripple, container = state.container;\n if (container) {\n once(container, 'blur', function () { return container.classList.remove(\"k-ripple-target\"); });\n }\n if (blob) {\n once(blob, 'transitionend', function () {\n if (ripple && ripple.parentNode) {\n ripple.parentNode.removeChild(ripple);\n }\n });\n blob.style.transition = 'opacity 200ms linear';\n blob.style.opacity = '0';\n }\n };\n /**\n * @hidden\n */\n var register = function (root, elements) {\n var flatten = function (arr) { return [].concat.apply([], arr); };\n var handlers = flatten(elements.map(function (item) {\n var defaultOptions = {\n events: ['mousedown', 'touchdown'],\n global: false\n };\n var selector = item.selector, _a = item.options, options = _a === void 0 ? defaultOptions : _a;\n var activator = activate(selector, options);\n var events = options.events || defaultOptions.events;\n var container = options.global ? document.body : root;\n events.forEach(function (evt) { return container.addEventListener(evt, activator, false); });\n return { events: events, options: options, activator: activator };\n }));\n return function () {\n if (!root) {\n return;\n }\n var removeListener = function (_a) {\n var events = _a.events, options = _a.options, activator = _a.activator;\n var container = options.global ? document.body : root;\n events.forEach(function (evt) { return container.removeEventListener(evt, activator, false); });\n };\n handlers.forEach(removeListener);\n root = null;\n };\n };\n\n kendo.deepExtend(kendo.util.ripple, {\n register: register\n });\n\n })();\n\n var __meta__ = {\n id: \"ripplecontainer\",\n name: \"RippleContainer\",\n category: \"web\",\n depends: [ \"core\" ]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n Widget = ui.Widget,\n extend = $.extend,\n ripple = kendo.util.ripple;\n\n var RippleContainer = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element);\n\n element = that.wrapper = that.element;\n\n that.options = extend({}, that.options, options);\n\n that.registerListeners();\n },\n\n options: {\n name: \"RippleContainer\",\n elements: [\n { selector: \".k-button:not(li)\" },\n { selector: \".k-list > .k-item\", options: { global: true } },\n { selector: \".k-checkbox-label, .k-radio-label\" },\n {\n selector: \".k-checkbox, .k-radio\",\n options: {\n events: [\"focusin\"],\n container: function(el) {\n if (/\\b(k-checkbox|k-radio)\\b/.test(el.className)) {\n return el.nextElementSibling;\n }\n }\n }\n }\n ]\n },\n\n removeListeners: function() {},\n\n registerListeners: function() {\n var that = this;\n var root = that.element[0];\n var elements = that.options.elements;\n\n that.removeListeners();\n\n var callback = ripple.register(root, elements);\n\n that.removeListeners = callback;\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that.removeListeners();\n }\n });\n\n ui.plugin(RippleContainer);\n\n })(window.kendo.jQuery);\n\n}));\n"]}