diff --git a/.gitignore b/.gitignore index d39c5fb..b76b067 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ tests/ # Apple stuff .DS_Store +.idea/ diff --git a/dist/waves.css b/dist/waves.css index 5572ae0..e629a71 100644 --- a/dist/waves.css +++ b/dist/waves.css @@ -1,5 +1,5 @@ /*! - * Waves v0.7.6 + * Waves v0.8.0 * http://fian.my.id/Waves * * Copyright 2014-2018 Alfiana E. Sibuea and other contributors @@ -95,7 +95,7 @@ } .waves-button-input { margin: 0; - padding: 0.85em 1.1em; + padding: 0em; } .waves-input-wrapper { border-radius: 0.2em; diff --git a/dist/waves.js b/dist/waves.js index a528981..ad5eab9 100644 --- a/dist/waves.js +++ b/dist/waves.js @@ -1,5 +1,5 @@ /*! - * Waves v0.7.6 + * Waves v0.8.0 * http://fian.my.id/Waves * * Copyright 2014-2018 Alfiana E. Sibuea and other contributors @@ -106,6 +106,10 @@ // Effect delay (check for scroll before showing effect) delay: 200, + + // Selector to find element to apply effect to. + // Can contain multiple classes (like ".btn, .nav a") + elementSelector: ".waves-effect", show: function(e, element, velocity) { @@ -211,14 +215,16 @@ var parent = element.parentNode; // If input already have parent just pass through - if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) { + if (parent.tagName.toLowerCase() === 'span' && parent.classList.contains('waves-effect')) { return; } // Put element class and style to the specified parent - var wrapper = document.createElement('i'); - wrapper.className = element.className + ' waves-input-wrapper'; - element.className = 'waves-button-input'; + var wrapper = document.createElement('span'); + + // Disable transitions while modifying styles + wrapper.style.transition = 'none'; + element.style.transition = 'none'; // Put element as child parent.replaceChild(wrapper, element); @@ -229,9 +235,18 @@ var color = elementStyle.color; var backgroundColor = elementStyle.backgroundColor; - wrapper.setAttribute('style', 'color:' + color + ';background:' + backgroundColor); - element.setAttribute('style', 'background-color:rgba(0,0,0,0);'); + wrapper.style.color = color; + wrapper.style.background = backgroundColor; + element.style.background = 'transparent'; + + wrapper.className = element.className + ' waves-input-wrapper'; + element.className = 'waves-button-input'; + // Clear transition overrride + setTimeout(function() { + wrapper.style.transition = ''; + element.style.transition = ''; + }, 0); }, // Wrap tag so it can perform the effect @@ -240,12 +255,12 @@ var parent = element.parentNode; // If input already have parent just pass through - if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) { + if (parent.tagName.toLowerCase() === 'span' && parent.classList.contains('waves-effect')) { return; } // Put element as child - var wrapper = document.createElement('i'); + var wrapper = document.createElement('span'); parent.replaceChild(wrapper, element); wrapper.appendChild(element); @@ -358,6 +373,18 @@ } }; + /** + * Browser-compatible version of Element.matches(). + */ + function matches(element, selector) { + var match = document.documentElement.matches || + document.documentElement.matchesSelector || + document.documentElement.webkitMatchesSelector || + document.documentElement.mozMatchesSelector || + document.documentElement.msMatchesSelector || + document.documentElement.oMatchesSelector; + return match.call(element, selector); + } /** * Delegated click handler for .waves-effect element. @@ -372,12 +399,12 @@ var element = null; var target = e.target || e.srcElement; - while (target.parentElement) { - if ( (!(target instanceof SVGElement)) && target.classList.contains('waves-effect')) { + while (target.parentNode) { + if ( (!(target instanceof SVGElement)) && matches(target, Effect.elementSelector)) { element = target; break; } - target = target.parentElement; + target = target.parentNode; } return element; @@ -388,12 +415,6 @@ */ function showEffect(e) { - // Disable effect if element has "disabled" property on it - // In some cases, the event is not triggered by the current element - // if (e.target.getAttribute('disabled') !== null) { - // return; - // } - var element = getWavesEffectElement(e); if (element !== null) { @@ -477,23 +498,45 @@ Effect.delay = options.delay; } + if ('elementSelector' in options) { + Effect.elementSelector = options.elementSelector; + } + + if (!window.WavesReady) { + window.WavesReady = true; + if (isTouchAvailable) { + body.addEventListener('touchstart', showEffect, false); + body.addEventListener('touchcancel', TouchHandler.registerEvent, false); + body.addEventListener('touchend', TouchHandler.registerEvent, false); + } + + body.addEventListener('mousedown', showEffect, false); + } + }; + + Waves.destroy = function() { + + var body = document.body; + if (isTouchAvailable) { - body.addEventListener('touchstart', showEffect, false); - body.addEventListener('touchcancel', TouchHandler.registerEvent, false); - body.addEventListener('touchend', TouchHandler.registerEvent, false); + body.removeEventListener('touchstart', showEffect, false); + body.removeEventListener('touchcancel', TouchHandler.registerEvent, false); + body.removeEventListener('touchend', TouchHandler.registerEvent, false); } - body.addEventListener('mousedown', showEffect, false); + body.removeEventListener('mousedown', showEffect, false); + delete window.WavesReady; + }; /** - * Attach Waves to dynamically loaded inputs, or add .waves-effect and other + * Toggle (Attach/Detach) Waves to dynamically loaded inputs, or add .waves-effect and other * waves classes to a set of elements. Set drag to true if the ripple mouseover * or skimming effect should be applied to the elements. */ - Waves.attach = function(elements, classes) { - + function toggleWaves(elements, classes, type) { + elements = getWavesElements(elements); if (toString.call(classes) === '[object Array]') { @@ -511,13 +554,43 @@ if (['input', 'img'].indexOf(tagName) !== -1) { TagWrapper[tagName](element); - element = element.parentElement; + element = element.parentNode; } + + if (type === 'attach') { + + if (element.className.indexOf(classes) === -1) { + element.className += ' '+classes; + } - if (element.className.indexOf('waves-effect') === -1) { - element.className += ' waves-effect' + classes; + if (!element.classList.contains('waves-effect')) { + element.classList.add('waves-effect'); + } + } + + if (type === 'detach') { + + if (element.className.indexOf(classes) !== -1) { + element.className = element.className.replace(new RegExp(classes, 'g'), ''); + } + + if (element.classList.contains('waves-effect')) { + element.classList.remove('waves-effect'); + } + + } + } + + } + + Waves.attach = function(elements, classes) { + return toggleWaves(elements, classes, 'attach'); + }; + + Waves.detach = function(elements, classes) { + return toggleWaves(elements, classes, 'detach'); }; @@ -558,7 +631,11 @@ mousedown.pageX = centre.x; mousedown.pageY = centre.y; - + + if ('duration' in options) { + Effect.duration = options.duration; + } + Effect.show(mousedown, element); if (options.wait >= 0 && options.wait !== null) { diff --git a/dist/waves.min.css b/dist/waves.min.css index 8dd7658..1901e75 100644 --- a/dist/waves.min.css +++ b/dist/waves.min.css @@ -1,7 +1,7 @@ /*! - * Waves v0.7.6 + * Waves v0.8.0 * http://fian.my.id/Waves * * Copyright 2014-2018 Alfiana E. Sibuea and other contributors * Released under the MIT license - * https://github.com/fians/Waves/blob/master/LICENSE */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:100px;height:100px;margin-top:-50px;margin-left:-50px;opacity:0;background:rgba(0,0,0,.2);background:-webkit-radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);background:-o-radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);background:-moz-radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);background:radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);-webkit-transition:all .5s ease-out;-moz-transition:all .5s ease-out;-o-transition:all .5s ease-out;transition:all .5s ease-out;-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform,opacity;-o-transition-property:-o-transform,opacity;transition-property:transform,opacity;-webkit-transform:scale(0) translate(0,0);-moz-transform:scale(0) translate(0,0);-ms-transform:scale(0) translate(0,0);-o-transform:scale(0) translate(0,0);transform:scale(0) translate(0,0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background:rgba(255,255,255,.4);background:-webkit-radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%);background:-o-radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%);background:-moz-radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%);background:radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%)}.waves-effect.waves-classic .waves-ripple{background:rgba(0,0,0,.2)}.waves-effect.waves-classic.waves-light .waves-ripple{background:rgba(255,255,255,.4)}.waves-notransition{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.waves-button,.waves-circle{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 100%)}.waves-button,.waves-button-input,.waves-button:hover,.waves-button:visited{white-space:nowrap;vertical-align:middle;cursor:pointer;border:none;outline:0;color:inherit;background-color:rgba(0,0,0,0);font-size:1em;line-height:1em;text-align:center;text-decoration:none;z-index:1}.waves-button{padding:.85em 1.1em;border-radius:.2em}.waves-button-input{margin:0;padding:.85em 1.1em}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper.waves-button{padding:0}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%}.waves-float{-webkit-mask-image:none;-webkit-box-shadow:0 1px 1.5px 1px rgba(0,0,0,.12);box-shadow:0 1px 1.5px 1px rgba(0,0,0,.12);-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s}.waves-float:active{-webkit-box-shadow:0 8px 20px 1px rgba(0,0,0,.3);box-shadow:0 8px 20px 1px rgba(0,0,0,.3)}.waves-block{display:block} \ No newline at end of file + * https://github.com/fians/Waves/blob/master/LICENSE */.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:100px;height:100px;margin-top:-50px;margin-left:-50px;opacity:0;background:rgba(0,0,0,.2);background:-webkit-radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);background:-o-radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);background:-moz-radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);background:radial-gradient(rgba(0,0,0,.2) 0,rgba(0,0,0,.3) 40%,rgba(0,0,0,.4) 50%,rgba(0,0,0,.5) 60%,rgba(255,255,255,0) 70%);-webkit-transition:all .5s ease-out;-moz-transition:all .5s ease-out;-o-transition:all .5s ease-out;transition:all .5s ease-out;-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform,opacity;-o-transition-property:-o-transform,opacity;transition-property:transform,opacity;-webkit-transform:scale(0) translate(0,0);-moz-transform:scale(0) translate(0,0);-ms-transform:scale(0) translate(0,0);-o-transform:scale(0) translate(0,0);transform:scale(0) translate(0,0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background:rgba(255,255,255,.4);background:-webkit-radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%);background:-o-radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%);background:-moz-radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%);background:radial-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.3) 40%,rgba(255,255,255,.4) 50%,rgba(255,255,255,.5) 60%,rgba(255,255,255,0) 70%)}.waves-effect.waves-classic .waves-ripple{background:rgba(0,0,0,.2)}.waves-effect.waves-classic.waves-light .waves-ripple{background:rgba(255,255,255,.4)}.waves-notransition{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;transition:none!important}.waves-button,.waves-circle{-webkit-transform:translateZ(0);-moz-transform:translateZ(0);-ms-transform:translateZ(0);-o-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 100%)}.waves-button,.waves-button-input,.waves-button:hover,.waves-button:visited{white-space:nowrap;vertical-align:middle;cursor:pointer;border:none;outline:0;color:inherit;background-color:rgba(0,0,0,0);font-size:1em;line-height:1em;text-align:center;text-decoration:none;z-index:1}.waves-button{padding:.85em 1.1em;border-radius:.2em}.waves-button-input{margin:0;padding:0}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper.waves-button{padding:0}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%}.waves-float{-webkit-mask-image:none;-webkit-box-shadow:0 1px 1.5px 1px rgba(0,0,0,.12);box-shadow:0 1px 1.5px 1px rgba(0,0,0,.12);-webkit-transition:all .3s;-moz-transition:all .3s;-o-transition:all .3s;transition:all .3s}.waves-float:active{-webkit-box-shadow:0 8px 20px 1px rgba(0,0,0,.3);box-shadow:0 8px 20px 1px rgba(0,0,0,.3)}.waves-block{display:block} \ No newline at end of file diff --git a/dist/waves.min.js b/dist/waves.min.js index f368448..077a940 100644 --- a/dist/waves.min.js +++ b/dist/waves.min.js @@ -1,2 +1,10 @@ -!function(t,e){"use strict";"function"==typeof define&&define.amd?define([],function(){return t.Waves=e.call(t),t.Waves}):"object"==typeof exports?module.exports=e.call(t):t.Waves=e.call(t)}("object"==typeof global?global:this,function(){"use strict";function t(t){return null!==t&&t===t.window}function e(e){return t(e)?e:9===e.nodeType&&e.defaultView}function n(t){var e=typeof t;return"function"===e||"object"===e&&!!t}function o(t){return n(t)&&t.nodeType>0}function a(t){var e=f.call(t);return"[object String]"===e?d(t):n(t)&&/^\[object (Array|HTMLCollection|NodeList|Object)\]$/.test(e)&&t.hasOwnProperty("length")?t:o(t)?[t]:[]}function i(t){var n,o,a={top:0,left:0},i=t&&t.ownerDocument;return n=i.documentElement,void 0!==t.getBoundingClientRect&&(a=t.getBoundingClientRect()),o=e(i),{top:a.top+o.pageYOffset-n.clientTop,left:a.left+o.pageXOffset-n.clientLeft}}function r(t){var e="";for(var n in t)t.hasOwnProperty(n)&&(e+=n+":"+t[n]+";");return e}function s(t,e,n){if(n){n.classList.remove("waves-rippling");var o=n.getAttribute("data-x"),a=n.getAttribute("data-y"),i=n.getAttribute("data-scale"),s=n.getAttribute("data-translate"),u=350-(Date.now()-Number(n.getAttribute("data-hold")));u<0&&(u=0),"mousemove"===t.type&&(u=150);var c="mousemove"===t.type?2500:v.duration;setTimeout(function(){var t={top:a+"px",left:o+"px",opacity:"0","-webkit-transition-duration":c+"ms","-moz-transition-duration":c+"ms","-o-transition-duration":c+"ms","transition-duration":c+"ms","-webkit-transform":i+" "+s,"-moz-transform":i+" "+s,"-ms-transform":i+" "+s,"-o-transform":i+" "+s,transform:i+" "+s};n.setAttribute("style",r(t)),setTimeout(function(){try{e.removeChild(n)}catch(t){return!1}},c)},u)}}function u(t){if(!1===h.allowEvent(t))return null;for(var e=null,n=t.target||t.srcElement;n.parentElement;){if(!(n instanceof SVGElement)&&n.classList.contains("waves-effect")){e=n;break}n=n.parentElement}return e}function c(t){var e=u(t);if(null!==e){if(e.disabled||e.getAttribute("disabled")||e.classList.contains("disabled"))return;if(h.registerEvent(t),"touchstart"===t.type&&v.delay){var n=!1,o=setTimeout(function(){o=null,v.show(t,e)},v.delay),a=function(a){o&&(clearTimeout(o),o=null,v.show(t,e)),n||(n=!0,v.hide(a,e)),r()},i=function(t){o&&(clearTimeout(o),o=null),a(t),r()};e.addEventListener("touchmove",i,!1),e.addEventListener("touchend",a,!1),e.addEventListener("touchcancel",a,!1);var r=function(){e.removeEventListener("touchmove",i),e.removeEventListener("touchend",a),e.removeEventListener("touchcancel",a)}}else v.show(t,e),m&&(e.addEventListener("touchend",v.hide,!1),e.addEventListener("touchcancel",v.hide,!1)),e.addEventListener("mouseup",v.hide,!1),e.addEventListener("mouseleave",v.hide,!1)}}var l=l||{},d=document.querySelectorAll.bind(document),f=Object.prototype.toString,m="ontouchstart"in window,v={duration:750,delay:200,show:function(t,e,n){if(2===t.button)return!1;e=e||this;var o=document.createElement("div");o.className="waves-ripple waves-rippling",e.appendChild(o);var a=i(e),s=0,u=0;"touches"in t&&t.touches.length?(s=t.touches[0].pageY-a.top,u=t.touches[0].pageX-a.left):(s=t.pageY-a.top,u=t.pageX-a.left),u=u>=0?u:0,s=s>=0?s:0;var c="scale("+e.clientWidth/100*3+")",l="translate(0,0)";n&&(l="translate("+n.x+"px, "+n.y+"px)"),o.setAttribute("data-hold",Date.now()),o.setAttribute("data-x",u),o.setAttribute("data-y",s),o.setAttribute("data-scale",c),o.setAttribute("data-translate",l);var d={top:s+"px",left:u+"px"};o.classList.add("waves-notransition"),o.setAttribute("style",r(d)),o.classList.remove("waves-notransition"),d["-webkit-transform"]=c+" "+l,d["-moz-transform"]=c+" "+l,d["-ms-transform"]=c+" "+l,d["-o-transform"]=c+" "+l,d.transform=c+" "+l,d.opacity="1";var f="mousemove"===t.type?2500:v.duration;d["-webkit-transition-duration"]=f+"ms",d["-moz-transition-duration"]=f+"ms",d["-o-transition-duration"]=f+"ms",d["transition-duration"]=f+"ms",o.setAttribute("style",r(d))},hide:function(t,e){for(var n=(e=e||this).getElementsByClassName("waves-rippling"),o=0,a=n.length;o=0&&null!==e.wait){var d={type:"mouseup",button:1};setTimeout(function(t,e){return function(){v.hide(t,e)}}(d,o),e.wait)}},l.calm=function(t){for(var e={type:"mouseup",button:1},n=0,o=(t=a(t)).length;n0}function e(a){var b=o.call(a);return"[object String]"===b?n(a):c(a)&&/^\[object (Array|HTMLCollection|NodeList|Object)\]$/.test(b)&&a.hasOwnProperty("length")?a:d(a)?[a]:[]}function f(a){var c,d,e={top:0,left:0},f=a&&a.ownerDocument;return c=f.documentElement,void 0!==a.getBoundingClientRect&&(e=a.getBoundingClientRect()),d=b(f),{top:e.top+d.pageYOffset-c.clientTop,left:e.left+d.pageXOffset-c.clientLeft}}function g(a){var b="";for(var c in a)a.hasOwnProperty(c)&&(b+=c+":"+a[c]+";");return b}function h(a,b,c){if(c){c.classList.remove("waves-rippling");var d=c.getAttribute("data-x"),e=c.getAttribute("data-y"),f=c.getAttribute("data-scale"),h=c.getAttribute("data-translate"),i=Date.now()-Number(c.getAttribute("data-hold")),j=350-i;j<0&&(j=0),"mousemove"===a.type&&(j=150);var k="mousemove"===a.type?2500:q.duration;setTimeout(function(){var a={top:e+"px",left:d+"px",opacity:"0","-webkit-transition-duration":k+"ms","-moz-transition-duration":k+"ms","-o-transition-duration":k+"ms","transition-duration":k+"ms","-webkit-transform":f+" "+h,"-moz-transform":f+" "+h,"-ms-transform":f+" "+h,"-o-transform":f+" "+h,transform:f+" "+h};c.setAttribute("style",g(a)),setTimeout(function(){try{b.removeChild(c)}catch(a){return!1}},k)},j)}}function i(a,b){return(document.documentElement.matches||document.documentElement.matchesSelector||document.documentElement.webkitMatchesSelector||document.documentElement.mozMatchesSelector||document.documentElement.msMatchesSelector||document.documentElement.oMatchesSelector).call(a,b)}function j(a){if(!1===s.allowEvent(a))return null;for(var b=null,c=a.target||a.srcElement;c.parentNode;){if(!(c instanceof SVGElement)&&i(c,q.elementSelector)){b=c;break}c=c.parentNode}return b}function k(a){var b=j(a);if(null!==b){if(b.disabled||b.getAttribute("disabled")||b.classList.contains("disabled"))return;if(s.registerEvent(a),"touchstart"===a.type&&q.delay){var c=!1,d=setTimeout(function(){d=null,q.show(a,b)},q.delay),e=function(e){d&&(clearTimeout(d),d=null,q.show(a,b)),c||(c=!0,q.hide(e,b)),g()},f=function(a){d&&(clearTimeout(d),d=null),e(a),g()};b.addEventListener("touchmove",f,!1),b.addEventListener("touchend",e,!1),b.addEventListener("touchcancel",e,!1);var g=function(){b.removeEventListener("touchmove",f),b.removeEventListener("touchend",e),b.removeEventListener("touchcancel",e)}}else q.show(a,b),p&&(b.addEventListener("touchend",q.hide,!1),b.addEventListener("touchcancel",q.hide,!1)),b.addEventListener("mouseup",q.hide,!1),b.addEventListener("mouseleave",q.hide,!1)}}function l(a,b,c){a=e(a),"[object Array]"===o.call(b)&&(b=b.join(" ")),b=b?" "+b:"";for(var d,f,g=0,h=a.length;g=0?i:0,h=h>=0?h:0;var j="scale("+b.clientWidth/100*3+")",k="translate(0,0)";c&&(k="translate("+c.x+"px, "+c.y+"px)"),d.setAttribute("data-hold",Date.now()),d.setAttribute("data-x",i),d.setAttribute("data-y",h),d.setAttribute("data-scale",j),d.setAttribute("data-translate",k);var l={top:h+"px",left:i+"px"};d.classList.add("waves-notransition"),d.setAttribute("style",g(l)),d.classList.remove("waves-notransition"),l["-webkit-transform"]=j+" "+k,l["-moz-transform"]=j+" "+k,l["-ms-transform"]=j+" "+k,l["-o-transform"]=j+" "+k,l.transform=j+" "+k,l.opacity="1";var m="mousemove"===a.type?2500:q.duration;l["-webkit-transition-duration"]=m+"ms",l["-moz-transition-duration"]=m+"ms",l["-o-transition-duration"]=m+"ms",l["transition-duration"]=m+"ms",d.setAttribute("style",g(l))},hide:function(a,b){b=b||this;for(var c=b.getElementsByClassName("waves-rippling"),d=0,e=c.length;d=0&&null!==b.wait){var m={type:"mouseup",button:1};setTimeout(l(m,d),b.wait)}},m.calm=function(a){a=e(a);for(var b={type:"mouseup",button:1},c=0,d=a.length;c tag so it can perform the effect @@ -240,12 +255,12 @@ var parent = element.parentNode; // If input already have parent just pass through - if (parent.tagName.toLowerCase() === 'i' && parent.classList.contains('waves-effect')) { + if (parent.tagName.toLowerCase() === 'span' && parent.classList.contains('waves-effect')) { return; } // Put element as child - var wrapper = document.createElement('i'); + var wrapper = document.createElement('span'); parent.replaceChild(wrapper, element); wrapper.appendChild(element); @@ -358,6 +373,18 @@ } }; + /** + * Browser-compatible version of Element.matches(). + */ + function matches(element, selector) { + var match = document.documentElement.matches || + document.documentElement.matchesSelector || + document.documentElement.webkitMatchesSelector || + document.documentElement.mozMatchesSelector || + document.documentElement.msMatchesSelector || + document.documentElement.oMatchesSelector; + return match.call(element, selector); + } /** * Delegated click handler for .waves-effect element. @@ -372,12 +399,12 @@ var element = null; var target = e.target || e.srcElement; - while (target.parentElement) { - if ( (!(target instanceof SVGElement)) && target.classList.contains('waves-effect')) { + while (target.parentNode) { + if ( (!(target instanceof SVGElement)) && matches(target, Effect.elementSelector)) { element = target; break; } - target = target.parentElement; + target = target.parentNode; } return element; @@ -388,12 +415,6 @@ */ function showEffect(e) { - // Disable effect if element has "disabled" property on it - // In some cases, the event is not triggered by the current element - // if (e.target.getAttribute('disabled') !== null) { - // return; - // } - var element = getWavesEffectElement(e); if (element !== null) { @@ -477,23 +498,45 @@ Effect.delay = options.delay; } + if ('elementSelector' in options) { + Effect.elementSelector = options.elementSelector; + } + + if (!window.WavesReady) { + window.WavesReady = true; + if (isTouchAvailable) { + body.addEventListener('touchstart', showEffect, false); + body.addEventListener('touchcancel', TouchHandler.registerEvent, false); + body.addEventListener('touchend', TouchHandler.registerEvent, false); + } + + body.addEventListener('mousedown', showEffect, false); + } + }; + + Waves.destroy = function() { + + var body = document.body; + if (isTouchAvailable) { - body.addEventListener('touchstart', showEffect, false); - body.addEventListener('touchcancel', TouchHandler.registerEvent, false); - body.addEventListener('touchend', TouchHandler.registerEvent, false); + body.removeEventListener('touchstart', showEffect, false); + body.removeEventListener('touchcancel', TouchHandler.registerEvent, false); + body.removeEventListener('touchend', TouchHandler.registerEvent, false); } - body.addEventListener('mousedown', showEffect, false); + body.removeEventListener('mousedown', showEffect, false); + delete window.WavesReady; + }; /** - * Attach Waves to dynamically loaded inputs, or add .waves-effect and other + * Toggle (Attach/Detach) Waves to dynamically loaded inputs, or add .waves-effect and other * waves classes to a set of elements. Set drag to true if the ripple mouseover * or skimming effect should be applied to the elements. */ - Waves.attach = function(elements, classes) { - + function toggleWaves(elements, classes, type) { + elements = getWavesElements(elements); if (toString.call(classes) === '[object Array]') { @@ -511,13 +554,43 @@ if (['input', 'img'].indexOf(tagName) !== -1) { TagWrapper[tagName](element); - element = element.parentElement; + element = element.parentNode; } + + if (type === 'attach') { + + if (element.className.indexOf(classes) === -1) { + element.className += ' '+classes; + } - if (element.className.indexOf('waves-effect') === -1) { - element.className += ' waves-effect' + classes; + if (!element.classList.contains('waves-effect')) { + element.classList.add('waves-effect'); + } + } + + if (type === 'detach') { + + if (element.className.indexOf(classes) !== -1) { + element.className = element.className.replace(new RegExp(classes, 'g'), ''); + } + + if (element.classList.contains('waves-effect')) { + element.classList.remove('waves-effect'); + } + + } + } + + } + + Waves.attach = function(elements, classes) { + return toggleWaves(elements, classes, 'attach'); + }; + + Waves.detach = function(elements, classes) { + return toggleWaves(elements, classes, 'detach'); }; @@ -558,7 +631,11 @@ mousedown.pageX = centre.x; mousedown.pageY = centre.y; - + + if ('duration' in options) { + Effect.duration = options.duration; + } + Effect.show(mousedown, element); if (options.wait >= 0 && options.wait !== null) { diff --git a/src/less/waves.less b/src/less/waves.less index e026324..c1311b6 100644 --- a/src/less/waves.less +++ b/src/less/waves.less @@ -1,5 +1,5 @@ /*! - * Waves v0.7.6 + * Waves v0.8.0 * http://fian.my.id/Waves * * Copyright 2014-2018 Alfiana E. Sibuea and other contributors @@ -113,7 +113,7 @@ .waves-button-input { margin: 0; - padding: 0.85em 1.1em; + padding: 0em; } .waves-input-wrapper { diff --git a/src/sass/waves.sass b/src/sass/waves.sass index 60d985c..2167d6a 100644 --- a/src/sass/waves.sass +++ b/src/sass/waves.sass @@ -1,5 +1,5 @@ /*! - * Waves v0.7.6 + * Waves v0.8.0 * http://fian.my.id/Waves * * Copyright 2014-2018 Alfiana E. Sibuea and other contributors @@ -110,7 +110,7 @@ .waves-button-input margin: 0 - padding: 0.85em 1.1em + padding: 0em .waves-input-wrapper border-radius: 0.2em diff --git a/src/scss/waves.scss b/src/scss/waves.scss index 8aa98f3..4d18499 100644 --- a/src/scss/waves.scss +++ b/src/scss/waves.scss @@ -1,5 +1,5 @@ /*! - * Waves v0.7.6 + * Waves v0.8.0 * http://fian.my.id/Waves * * Copyright 2014-2018 Alfiana E. Sibuea and other contributors @@ -113,7 +113,7 @@ .waves-button-input { margin: 0; - padding: 0.85em 1.1em; + padding: 0em; } .waves-input-wrapper {