class-change
Advanced tools
+3
-1
| sudo: required | ||
| dist: trusty | ||
| language: node_js | ||
@@ -6,3 +7,4 @@ node_js: "stable" | ||
| addons: | ||
| chrome: stable | ||
| hosts: | ||
| - travis.dev | ||
@@ -9,0 +11,0 @@ notifications: |
+8
-0
| # Change Log | ||
| ## 1.1.5 | ||
| *2019-01-08* | ||
| - Update dependencies | ||
| - Update unit test configuration (Karma+Travis) | ||
| - Update CDN links (switch from unpkg to jsdelivr) | ||
| ## 1.1.4 | ||
@@ -4,0 +12,0 @@ |
| /*! | ||
| * class-change | ||
| * v1.1.4 | ||
| * v1.1.5 | ||
| * https://jhildenbiddle.github.io/class-change | ||
| * (c) 2018 John Hildenbiddle <http://hildenbiddle.com> | ||
| * (c) 2016-2019 John Hildenbiddle <http://hildenbiddle.com> | ||
| * MIT license | ||
@@ -7,0 +7,0 @@ */ |
| /*! | ||
| * class-change | ||
| * v1.1.4 | ||
| * v1.1.5 | ||
| * https://jhildenbiddle.github.io/class-change | ||
| * (c) 2018 John Hildenbiddle <http://hildenbiddle.com> | ||
| * (c) 2016-2019 John Hildenbiddle <http://hildenbiddle.com> | ||
| * MIT license | ||
| */ | ||
| function classNamesToArray(e){return"string"==typeof e&&(e=e.trim().replace(/\s+/g," ").split(" ")),Array.isArray(e)&&(e=(e=e.map(function(e){return e&&e.length?e.trim():null})).filter(Boolean)),e}function elementsToArray(e){return"string"==typeof e?e=Array.apply(null,document.querySelectorAll(e)):e instanceof window.HTMLCollection||e instanceof window.NodeList?e=Array.apply(null,e):e&&!Array.isArray(e)&&(e=[e]),Array.isArray(e)?e.filter(function(e,t,a){return a.indexOf(e)===t}):[]}function getClosest(e,t){for(var a=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector,n=null,r=e;r&&r!==document;){if(a.call(r,t)){n=r;break}r=r.parentNode}return n}function getParents(e,t){for(var a=e.matches||e.matchesSelector||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector,n=[],r=e.parentNode;r&&r!==document;)(!t||t&&a.call(r,t))&&n.push(r),r=r.parentNode;return n}function matchesSelector(e,t){return(e.matches||e.matchesSelector||e.webkitMatchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector).call(e,t)}function addClass(e,t){var a=elementsToArray(e);return a.forEach(function(e,a){var n=classNamesToArray(t instanceof Function?t(e,a):t);if(n&&n.length){var r=e.className.length?e.className.split(" "):[],o=n.filter(function(e){return-1===r.indexOf(e)}),c=r.concat(o);e.className=c.join(" ")}}),1===a.length?a[0]:a}function removeClass(e,t){var a=elementsToArray(e);return a.forEach(function(e,a){var n=classNamesToArray(t instanceof Function?t(e,a):t);if(e.className.trim().length&&n&&n.length){var r=e.className.split(" ").filter(function(e){return-1===n.indexOf(e)});r.length?e.className=r.join(" "):e.removeAttribute("class")}}),1===a.length?a[0]:a}var classChange={add:addClass,remove:removeClass};function toggleClass(e,t,a){if(!0===a)return classChange.add(e,t);if(!1===a)return classChange.remove(e,t);var n=elementsToArray(e);return n.forEach(function(e,a){var n=classNamesToArray(t instanceof Function?t(e,a):t);if(n&&n.length){var r=e.className.length?e.className.split(" "):[],o=r.filter(function(e){return-1===n.indexOf(e)}),c=n.filter(function(e){return-1===r.indexOf(e)}),s=o.concat(c);e.className=s.join(" ")}}),1===n.length?n[0]:n}var classChange$1={add:addClass,remove:removeClass,toggle:toggleClass};function addRemoveAttrListener(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];t="boolean"==typeof e?e:t;var a=elementsToArray(e="boolean"==typeof e?document:e),n=!1===e||!1===t?"removeEventListener":"addEventListener";return a.forEach(function(e){e[n]("click",handleAttrEvent)}),{remove:function(){a.forEach(function(e){e.removeEventListener("click",handleAttrEvent)})}}}function handleAttrEvent(e){var t=[e.target].concat(getParents(e.target)),a=["add","remove","toggle"];t.forEach(function(e){if(matchesSelector(e,"[data-class-add],[data-class-remove],[data-class-toggle]")){var t={};a.forEach(function(a){var n=e.getAttribute("data-class-".concat(a));if(n&&n.length){var r=e.getAttribute("data-class-".concat(a,"-closest"))||e.getAttribute("data-class-closest"),o=e.getAttribute("data-class-".concat(a,"-parents"))||e.getAttribute("data-class-parents"),c=e.getAttribute("data-class-".concat(a,"-siblings"))||e.getAttribute("data-class-siblings"),s=e.getAttribute("data-class-".concat(a,"-target"))||e.getAttribute("data-class-target"),l=[];if(r){var i=getClosest(e,r);l=l.concat(i)}if(o){var f=getParents(e,o);l=l.concat(f)}if(c)elementsToArray(e.parentNode.children).forEach(function(t){var a=t!==e,n=matchesSelector(t,c);a&&n&&l.push(t)});if(s){var u=elementsToArray(document.querySelectorAll(s));l=l.concat(u)}t[a]={target:l.length?l:e,classNames:n}}}),a.forEach(function(e){t[e]&&classChange$1[e](t[e].target,t[e].classNames)})}})}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var classChange$2={add:addClass,remove:removeClass,toggle:toggleClass};function addChangeListener(e){var t={target:elementsToArray(e.target||document.body),event:e.event||"click",match:e.match||!0,change:e.change||!0,add:e.add||null,remove:e.remove||null,toggle:e.toggle||null};function a(e){handleChangeEvent(e,t)}return t.target.forEach(function(e){e.addEventListener(t.event,a)}),{remove:function(){t.target.forEach(function(e){e.removeEventListener(t.event,a)})}}}function handleChangeEvent(e,t){var a,n=t.match instanceof Function?t.match(e):t.match;if(!0===n)n=[e.target],a=e.target;else if("string"==typeof n){var r=matchesSelector(e.target,n);a=r?e.target:getParents(e.target).filter(function(e){return matchesSelector(e,n)})[0]||null,n=elementsToArray(n)}else if("object"===_typeof(n)){var o=e.target===n;n=elementsToArray(n),a=o?e.target:n[n.indexOf(e.target)]||getParents(e.target).filter(function(e){return-1!==n.indexOf(e)})[0]||null}if(a){var c=n.indexOf(a),s=t.change instanceof Function?t.change(e,a,c):t.change;s=!0===s?[e.target]:elementsToArray(s),["toggle","remove","add"].forEach(function(n){if(t[n]instanceof Function)s.forEach(function(r,o){var s=t[n](e,a,c,r,o);classChange$2[n](r,s)});else{var r=t[n];classChange$2[n](s,r)}})}}var index={add:addClass,attrs:addRemoveAttrListener,listener:addChangeListener,remove:removeClass,toggle:toggleClass};export default index; | ||
| function t(t){return"string"==typeof t&&(t=t.trim().replace(/\s+/g," ").split(" ")),Array.isArray(t)&&(t=(t=t.map(function(t){return t&&t.length?t.trim():null})).filter(Boolean)),t}function e(t){return"string"==typeof t?t=Array.apply(null,document.querySelectorAll(t)):t instanceof window.HTMLCollection||t instanceof window.NodeList?t=Array.apply(null,t):t&&!Array.isArray(t)&&(t=[t]),Array.isArray(t)?t.filter(function(t,e,n){return n.indexOf(t)===e}):[]}function n(t,e){for(var n=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector,a=[],r=t.parentNode;r&&r!==document;)(!e||e&&n.call(r,e))&&a.push(r),r=r.parentNode;return a}function a(t,e){return(t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector).call(t,e)}function r(n,a){var r=e(n);return r.forEach(function(e,n){var r=t(a instanceof Function?a(e,n):a);if(r&&r.length){var c=e.className.length?e.className.split(" "):[],o=r.filter(function(t){return-1===c.indexOf(t)}),i=c.concat(o);e.className=i.join(" ")}}),1===r.length?r[0]:r}function c(n,a){var r=e(n);return r.forEach(function(e,n){var r=t(a instanceof Function?a(e,n):a);if(e.className.trim().length&&r&&r.length){var c=e.className.split(" ").filter(function(t){return-1===r.indexOf(t)});c.length?e.className=c.join(" "):e.removeAttribute("class")}}),1===r.length?r[0]:r}var o={add:r,remove:c};function i(n,a,r){if(!0===r)return o.add(n,a);if(!1===r)return o.remove(n,a);var c=e(n);return c.forEach(function(e,n){var r=t(a instanceof Function?a(e,n):a);if(r&&r.length){var c=e.className.length?e.className.split(" "):[],o=c.filter(function(t){return-1===r.indexOf(t)}),i=r.filter(function(t){return-1===c.indexOf(t)}),l=o.concat(i);e.className=l.join(" ")}}),1===c.length?c[0]:c}var l={add:r,remove:c,toggle:i};function s(t){var r=[t.target].concat(n(t.target)),c=["add","remove","toggle"];r.forEach(function(t){if(a(t,"[data-class-add],[data-class-remove],[data-class-toggle]")){var r={};c.forEach(function(c){var o=t.getAttribute("data-class-".concat(c));if(o&&o.length){var i=t.getAttribute("data-class-".concat(c,"-closest"))||t.getAttribute("data-class-closest"),l=t.getAttribute("data-class-".concat(c,"-parents"))||t.getAttribute("data-class-parents"),s=t.getAttribute("data-class-".concat(c,"-siblings"))||t.getAttribute("data-class-siblings"),f=t.getAttribute("data-class-".concat(c,"-target"))||t.getAttribute("data-class-target"),u=[];if(i){var g=function(t,e){for(var n=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector,a=null,r=t;r&&r!==document;){if(n.call(r,e)){a=r;break}r=r.parentNode}return a}(t,i);u=u.concat(g)}if(l){var d=n(t,l);u=u.concat(d)}if(s)e(t.parentNode.children).forEach(function(e){var n=e!==t,r=a(e,s);n&&r&&u.push(e)});if(f){var m=e(document.querySelectorAll(f));u=u.concat(m)}r[c]={target:u.length?u:t,classNames:o}}}),c.forEach(function(t){r[t]&&l[t](r[t].target,r[t].classNames)})}})}function f(t){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u={add:r,remove:c,toggle:i};export default{add:r,attrs:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];n="boolean"==typeof t?t:n;var a=e(t="boolean"==typeof t?document:t),r=!1===t||!1===n?"removeEventListener":"addEventListener";return a.forEach(function(t){t[r]("click",s)}),{remove:function(){a.forEach(function(t){t.removeEventListener("click",s)})}}},listener:function(t){var r={target:e(t.target||document.body),event:t.event||"click",match:t.match||!0,change:t.change||!0,add:t.add||null,remove:t.remove||null,toggle:t.toggle||null};function c(t){!function(t,r){var c,o=r.match instanceof Function?r.match(t):r.match;if(!0===o)o=[t.target],c=t.target;else if("string"==typeof o){var i=a(t.target,o);c=i?t.target:n(t.target).filter(function(t){return a(t,o)})[0]||null,o=e(o)}else if("object"===f(o)){var l=t.target===o;o=e(o),c=l?t.target:o[o.indexOf(t.target)]||n(t.target).filter(function(t){return-1!==o.indexOf(t)})[0]||null}if(c){var s=o.indexOf(c),g=r.change instanceof Function?r.change(t,c,s):r.change;g=!0===g?[t.target]:e(g),["toggle","remove","add"].forEach(function(e){if(r[e]instanceof Function)g.forEach(function(n,a){var o=r[e](t,c,s,n,a);u[e](n,o)});else{var n=r[e];u[e](g,n)}})}}(t,r)}return r.target.forEach(function(t){t.addEventListener(r.event,c)}),{remove:function(){r.target.forEach(function(t){t.removeEventListener(r.event,c)})}}},remove:c,toggle:i}; | ||
| //# sourceMappingURL=class-change.esm.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"class-change.esm.min.js","sources":["../src/util.js","../src/add.js","../src/remove.js","../src/toggle.js","../src/attrs.js","../src/listener.js","../src/index.js"],"sourcesContent":["// Exports\n// =============================================================================\n/**\n * Converts space-separates list of class names to an array (if necessary) then\n * trims each array item.\n *\n * @export\n * @param {(array|string)} classNames\n * @returns {array}\n */\nexport function classNamesToArray(classNames) {\n // String - Trim and convert to Array\n if (typeof classNames === 'string') {\n classNames = classNames.trim().replace(/\\s+/g, ' ').split(' ');\n }\n\n if (Array.isArray(classNames)) {\n // Trim items\n classNames = classNames.map(name => name && name.length ? name.trim() : null);\n\n // Filter out \"falsey\" values\n classNames = classNames.filter(Boolean);\n }\n\n return classNames;\n}\n\n/**\n * Converts a CSS selector (string), Element, HTMLCollection or NodeList to an\n * array (returns array as-is).\n * - Array: [Element, Element, ...]\n * - Element: document.body\n * - HTMLCollection: document.getElementsByTagName('p')\n * - NodeList: document.querySelectorAll('p')\n * - String (CSS selector): 'p'\n *\n * @export\n * @param {(array|element|htmlcollection|nodelist|string)} elements\n * @param {boolean} [removeDuplicates=true]\n * @returns {array}\n */\nexport function elementsToArray(elements) {\n // CSS Selector\n if (typeof elements === 'string') {\n elements = Array.apply(null, document.querySelectorAll(elements));\n }\n // HTMLCollection / NodeList\n else if (elements instanceof window.HTMLCollection || elements instanceof window.NodeList) {\n elements = Array.apply(null, elements);\n }\n // Node/Element (assumed)\n else if (elements && !Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (Array.isArray(elements)) {\n // Remove duplicate\n return elements.filter((value, index, self) => self.indexOf(value) === index);\n }\n else {\n return [];\n }\n}\n\n/**\n * Matches self or finds closest ancestor (excluding document) node that match a\n * CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getClosest(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n let matchedElm = null;\n let testElm = elm;\n\n while (testElm && testElm !== document) {\n if (matches.call(testElm, matchSelector)) {\n matchedElm = testElm;\n break;\n }\n\n testElm = testElm.parentNode;\n }\n\n return matchedElm;\n}\n\n/**\n * Finds all parent nodes (excluding document), optionally limited to only those\n * that match a CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getParents(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n const parentElms = [];\n\n let testElm = elm.parentNode;\n\n while (testElm && testElm !== document) {\n if (!matchSelector || matchSelector && matches.call(testElm, matchSelector)) {\n parentElms.push(testElm);\n }\n\n testElm = testElm.parentNode;\n }\n\n return parentElms;\n}\n\n/**\n * Cross-browser wrapper for native \"matches\" method\n *\n * @export\n * @param {element} elm\n * @param {string} selector\n * @returns {boolean}\n */\nexport function matchesSelector(elm, selector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n return matches.call(elm, selector);\n}\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Add class name(s) to target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to add class name(s) to\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction addClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = elmClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default addClass;\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Remove class name(s) from target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to remove class name(s) from\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction removeClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (elm.className.trim().length && classArray && classArray.length) {\n const elmClassArray = elm.className.split(' ');\n const finalClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n\n // Standardize result of setting empty \"class\" attribute.\n // Internet Explorer and Edge automatically remove the \"class\"\n // attribute when it is set to \"\". Other browsers (Chrome, Firefox,\n // Safari) will set the attribute to \"\". The difference in these\n // behaviors throws off unit tests, so the following code emulates\n // IE/Edge behavior of removing the attribute when the value is \"\".\n if (finalClassArray.length) {\n elm.className = finalClassArray.join(' ');\n }\n else {\n elm.removeAttribute('class');\n }\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default removeClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove };\n\n\n// Functions\n// =============================================================================\n/**\n * Toggle class name(s) on target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to toggle class name(s) on\n * @param {(array|function|string)} classNames - Array, space-separated list, or\n * function that returns array/string of class name(s)\n * @param {boolean} [forceTrueFalse] - Force add when true, remove when false\n * @returns {(array|element)} - Target(s)\n */\nfunction toggleClass(target, classNames, forceTrueFalse) {\n if (forceTrueFalse === true) {\n return classChange.add(target, classNames);\n }\n else if (forceTrueFalse === false) {\n return classChange.remove(target, classNames);\n }\n else {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const keepClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = keepClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default toggleClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport { elementsToArray, matchesSelector, getClosest, getParents } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds or removes click/tap event listener(s) on elements that have\n * data-class-* attributes and trigger associated method(s).\n *\n * @param {(array|element|htmlcollection|nodelist|string)} [listenerTarget=document]\n * @param {boolean} [addTrueRemoveFalse=true]\n */\nfunction addRemoveAttrListener(listenerTarget = document, addTrueRemoveFalse = true) {\n // Allow boolean for listenerTarget\n // true = add default listener, false = remove default listener\n addTrueRemoveFalse = typeof(listenerTarget) === 'boolean' ? listenerTarget : addTrueRemoveFalse;\n listenerTarget = typeof(listenerTarget) === 'boolean' ? document : listenerTarget;\n\n const elms = elementsToArray(listenerTarget);\n const method = listenerTarget === false || addTrueRemoveFalse === false ? 'removeEventListener' : 'addEventListener';\n\n elms.forEach(function(elm) {\n elm[method]('click', handleAttrEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n elms.forEach(function(elm) {\n elm.removeEventListener('click', handleAttrEvent);\n });\n }\n };\n}\n\n/**\n * Handles click/tap events triggered via data-class-* attributes.\n *\n * @param {object} evt\n */\nfunction handleAttrEvent(evt) {\n const elms = [evt.target].concat(getParents(evt.target));\n const matchSelector = '[data-class-add],[data-class-remove],[data-class-toggle]';\n const methods = ['add', 'remove', 'toggle'];\n\n elms.forEach(function(elm) {\n const hasAttr = matchesSelector(elm, matchSelector);\n\n if (hasAttr) {\n const changeTasks = {};\n\n methods.forEach(function(method) {\n const classNames = elm.getAttribute(`data-class-${method}`);\n\n if (classNames && classNames.length) {\n const closestAttr = elm.getAttribute(`data-class-${method}-closest`) || elm.getAttribute('data-class-closest');\n const parentsAttr = elm.getAttribute(`data-class-${method}-parents`) || elm.getAttribute('data-class-parents');\n const siblingsAttr = elm.getAttribute(`data-class-${method}-siblings`) || elm.getAttribute('data-class-siblings');\n const targetAttr = elm.getAttribute(`data-class-${method}-target`) || elm.getAttribute('data-class-target');\n\n let changeElms = [];\n\n if (closestAttr) {\n const elms = getClosest(elm, closestAttr);\n changeElms = changeElms.concat(elms);\n }\n if (parentsAttr) {\n const elms = getParents(elm, parentsAttr);\n changeElms = changeElms.concat(elms);\n }\n if (siblingsAttr) {\n const siblingElms = elementsToArray(elm.parentNode.children);\n\n siblingElms.forEach(function(siblingElm) {\n const isSibling = siblingElm !== elm;\n const isMatch = matchesSelector(siblingElm, siblingsAttr);\n\n if (isSibling && isMatch) {\n changeElms.push(siblingElm);\n }\n });\n }\n if (targetAttr) {\n const elms = elementsToArray(document.querySelectorAll(targetAttr));\n changeElms = changeElms.concat(elms);\n }\n\n changeTasks[method] = {\n target: changeElms.length ? changeElms : elm,\n classNames\n };\n }\n });\n\n methods.forEach(function(method) {\n if (changeTasks[method]) {\n classChange[method](changeTasks[method].target, changeTasks[method].classNames);\n }\n });\n }\n });\n}\n\n\n// Exports\n// =============================================================================\nexport default addRemoveAttrListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport * as util from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds classChange event listener(s) and returns a remove() method\n *\n * @param {object} options\n * @param {(array|element|htmlcollection|nodelist|string)} [options.target=document]\n * @param {string} [options.event=\"click\"]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.match=true]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.change=true]\n * @param {(array|function|string)} [options.add]\n * @param {(array|function|string)} [options.remove]\n * @param {(array|function|string)} [options.toggle]\n * @returns {object} Remove method\n */\nfunction addChangeListener(options) {\n const settings = {\n target: util.elementsToArray(options.target || document.body),\n event : options.event || 'click',\n match : options.match || true,\n change: options.change || true,\n add : options.add || null,\n remove: options.remove || null,\n toggle: options.toggle || null\n };\n\n function triggerChangeEvent(evt) {\n handleChangeEvent(evt, settings);\n }\n\n settings.target.forEach(function(target) {\n target.addEventListener(settings.event, triggerChangeEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n settings.target.forEach(function(target) {\n target.removeEventListener(settings.event, triggerChangeEvent);\n });\n }\n };\n}\n\n/**\n * Detects if an event matches the one defined in settings and changes class\n * names on elements accordingly\n *\n * @param {object} evt - Event object\n * @param {object} settings - Listener settings\n */\nfunction handleChangeEvent(evt, settings) {\n let matchElms = settings.match instanceof Function ? settings.match(evt) : settings.match;\n let matchedElm;\n\n // Match: Event target\n /* istanbul ignore else */\n if (matchElms === true) {\n matchElms = [evt.target];\n matchedElm = evt.target;\n }\n // Match: CSS selector\n else if (typeof matchElms === 'string') {\n const isMatch = util.matchesSelector(evt.target, matchElms);\n\n matchedElm = isMatch ? evt.target : util.getParents(evt.target).filter(elm => util.matchesSelector(elm, matchElms))[0] || null;\n matchElms = util.elementsToArray(matchElms);\n }\n // Match: Array, Element, HTMLCollection, NodeList\n else if (typeof matchElms === 'object') {\n const isMatch = evt.target === matchElms;\n\n matchElms = util.elementsToArray(matchElms);\n matchedElm = isMatch ? evt.target : matchElms[matchElms.indexOf(evt.target)] || util.getParents(evt.target).filter(elm => matchElms.indexOf(elm) !== -1)[0] || null;\n }\n\n // Change\n if (matchedElm) {\n const matchedElmIndex = matchElms.indexOf(matchedElm);\n let changeElms = settings.change instanceof Function ? settings.change(evt, matchedElm, matchedElmIndex) : settings.change;\n\n changeElms = changeElms === true ? [evt.target] : util.elementsToArray(changeElms);\n\n ['toggle', 'remove', 'add'].forEach(changeType => {\n // If settings value is a function, call for each element with args\n if (settings[changeType] instanceof Function) {\n changeElms.forEach((changeElm, changeElmIndex) => {\n const classNames = settings[changeType](evt, matchedElm, matchedElmIndex, changeElm, changeElmIndex);\n\n classChange[changeType](changeElm, classNames);\n });\n }\n else {\n const classNames = settings[changeType];\n\n classChange[changeType](changeElms, classNames);\n }\n });\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default addChangeListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport attrs from './attrs.js';\nimport listener from './listener.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\n\n\n// Exports\n// =============================================================================\nexport default { add, attrs, listener, remove, toggle };\n"],"names":["classNamesToArray","classNames","trim","replace","split","Array","isArray","map","name","length","filter","Boolean","elementsToArray","elements","apply","document","querySelectorAll","window","HTMLCollection","NodeList","value","index","self","indexOf","getClosest","elm","matchSelector","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","matchedElm","testElm","call","parentNode","getParents","parentElms","push","selector","addClass","target","elms","forEach","i","classArray","Function","elmClassArray","className","newClassArray","finalClassArray","concat","join","removeClass","removeAttribute","classChange","add","remove","toggleClass","forceTrueFalse","keepClassArray","toggle","addRemoveAttrListener","listenerTarget","addTrueRemoveFalse","method","handleAttrEvent","removeEventListener","evt","methods","changeTasks","getAttribute","closestAttr","parentsAttr","siblingsAttr","targetAttr","changeElms","children","siblingElm","isSibling","isMatch","addChangeListener","options","settings","util","body","event","match","change","triggerChangeEvent","handleChangeEvent","addEventListener","matchElms","_typeof","matchedElmIndex","changeType","changeElm","changeElmIndex","attrs","listener"],"mappings":"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"} | ||
| {"version":3,"file":"class-change.esm.min.js","sources":["../src/util.js","../src/add.js","../src/remove.js","../src/toggle.js","../src/attrs.js","../src/listener.js","../src/index.js"],"sourcesContent":["// Exports\n// =============================================================================\n/**\n * Converts space-separates list of class names to an array (if necessary) then\n * trims each array item.\n *\n * @export\n * @param {(array|string)} classNames\n * @returns {array}\n */\nexport function classNamesToArray(classNames) {\n // String - Trim and convert to Array\n if (typeof classNames === 'string') {\n classNames = classNames.trim().replace(/\\s+/g, ' ').split(' ');\n }\n\n if (Array.isArray(classNames)) {\n // Trim items\n classNames = classNames.map(name => name && name.length ? name.trim() : null);\n\n // Filter out \"falsey\" values\n classNames = classNames.filter(Boolean);\n }\n\n return classNames;\n}\n\n/**\n * Converts a CSS selector (string), Element, HTMLCollection or NodeList to an\n * array (returns array as-is).\n * - Array: [Element, Element, ...]\n * - Element: document.body\n * - HTMLCollection: document.getElementsByTagName('p')\n * - NodeList: document.querySelectorAll('p')\n * - String (CSS selector): 'p'\n *\n * @export\n * @param {(array|element|htmlcollection|nodelist|string)} elements\n * @param {boolean} [removeDuplicates=true]\n * @returns {array}\n */\nexport function elementsToArray(elements) {\n // CSS Selector\n if (typeof elements === 'string') {\n elements = Array.apply(null, document.querySelectorAll(elements));\n }\n // HTMLCollection / NodeList\n else if (elements instanceof window.HTMLCollection || elements instanceof window.NodeList) {\n elements = Array.apply(null, elements);\n }\n // Node/Element (assumed)\n else if (elements && !Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (Array.isArray(elements)) {\n // Remove duplicate\n return elements.filter((value, index, self) => self.indexOf(value) === index);\n }\n else {\n return [];\n }\n}\n\n/**\n * Matches self or finds closest ancestor (excluding document) node that match a\n * CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getClosest(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n let matchedElm = null;\n let testElm = elm;\n\n while (testElm && testElm !== document) {\n if (matches.call(testElm, matchSelector)) {\n matchedElm = testElm;\n break;\n }\n\n testElm = testElm.parentNode;\n }\n\n return matchedElm;\n}\n\n/**\n * Finds all parent nodes (excluding document), optionally limited to only those\n * that match a CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getParents(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n const parentElms = [];\n\n let testElm = elm.parentNode;\n\n while (testElm && testElm !== document) {\n if (!matchSelector || matchSelector && matches.call(testElm, matchSelector)) {\n parentElms.push(testElm);\n }\n\n testElm = testElm.parentNode;\n }\n\n return parentElms;\n}\n\n/**\n * Cross-browser wrapper for native \"matches\" method\n *\n * @export\n * @param {element} elm\n * @param {string} selector\n * @returns {boolean}\n */\nexport function matchesSelector(elm, selector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n return matches.call(elm, selector);\n}\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Add class name(s) to target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to add class name(s) to\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction addClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = elmClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default addClass;\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Remove class name(s) from target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to remove class name(s) from\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction removeClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (elm.className.trim().length && classArray && classArray.length) {\n const elmClassArray = elm.className.split(' ');\n const finalClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n\n // Standardize result of setting empty \"class\" attribute.\n // Internet Explorer and Edge automatically remove the \"class\"\n // attribute when it is set to \"\". Other browsers (Chrome, Firefox,\n // Safari) will set the attribute to \"\". The difference in these\n // behaviors throws off unit tests, so the following code emulates\n // IE/Edge behavior of removing the attribute when the value is \"\".\n if (finalClassArray.length) {\n elm.className = finalClassArray.join(' ');\n }\n else {\n elm.removeAttribute('class');\n }\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default removeClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove };\n\n\n// Functions\n// =============================================================================\n/**\n * Toggle class name(s) on target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to toggle class name(s) on\n * @param {(array|function|string)} classNames - Array, space-separated list, or\n * function that returns array/string of class name(s)\n * @param {boolean} [forceTrueFalse] - Force add when true, remove when false\n * @returns {(array|element)} - Target(s)\n */\nfunction toggleClass(target, classNames, forceTrueFalse) {\n if (forceTrueFalse === true) {\n return classChange.add(target, classNames);\n }\n else if (forceTrueFalse === false) {\n return classChange.remove(target, classNames);\n }\n else {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const keepClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = keepClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default toggleClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport { elementsToArray, matchesSelector, getClosest, getParents } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds or removes click/tap event listener(s) on elements that have\n * data-class-* attributes and trigger associated method(s).\n *\n * @param {(array|element|htmlcollection|nodelist|string)} [listenerTarget=document]\n * @param {boolean} [addTrueRemoveFalse=true]\n */\nfunction addRemoveAttrListener(listenerTarget = document, addTrueRemoveFalse = true) {\n // Allow boolean for listenerTarget\n // true = add default listener, false = remove default listener\n addTrueRemoveFalse = typeof(listenerTarget) === 'boolean' ? listenerTarget : addTrueRemoveFalse;\n listenerTarget = typeof(listenerTarget) === 'boolean' ? document : listenerTarget;\n\n const elms = elementsToArray(listenerTarget);\n const method = listenerTarget === false || addTrueRemoveFalse === false ? 'removeEventListener' : 'addEventListener';\n\n elms.forEach(function(elm) {\n elm[method]('click', handleAttrEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n elms.forEach(function(elm) {\n elm.removeEventListener('click', handleAttrEvent);\n });\n }\n };\n}\n\n/**\n * Handles click/tap events triggered via data-class-* attributes.\n *\n * @param {object} evt\n */\nfunction handleAttrEvent(evt) {\n const elms = [evt.target].concat(getParents(evt.target));\n const matchSelector = '[data-class-add],[data-class-remove],[data-class-toggle]';\n const methods = ['add', 'remove', 'toggle'];\n\n elms.forEach(function(elm) {\n const hasAttr = matchesSelector(elm, matchSelector);\n\n if (hasAttr) {\n const changeTasks = {};\n\n methods.forEach(function(method) {\n const classNames = elm.getAttribute(`data-class-${method}`);\n\n if (classNames && classNames.length) {\n const closestAttr = elm.getAttribute(`data-class-${method}-closest`) || elm.getAttribute('data-class-closest');\n const parentsAttr = elm.getAttribute(`data-class-${method}-parents`) || elm.getAttribute('data-class-parents');\n const siblingsAttr = elm.getAttribute(`data-class-${method}-siblings`) || elm.getAttribute('data-class-siblings');\n const targetAttr = elm.getAttribute(`data-class-${method}-target`) || elm.getAttribute('data-class-target');\n\n let changeElms = [];\n\n if (closestAttr) {\n const elms = getClosest(elm, closestAttr);\n changeElms = changeElms.concat(elms);\n }\n if (parentsAttr) {\n const elms = getParents(elm, parentsAttr);\n changeElms = changeElms.concat(elms);\n }\n if (siblingsAttr) {\n const siblingElms = elementsToArray(elm.parentNode.children);\n\n siblingElms.forEach(function(siblingElm) {\n const isSibling = siblingElm !== elm;\n const isMatch = matchesSelector(siblingElm, siblingsAttr);\n\n if (isSibling && isMatch) {\n changeElms.push(siblingElm);\n }\n });\n }\n if (targetAttr) {\n const elms = elementsToArray(document.querySelectorAll(targetAttr));\n changeElms = changeElms.concat(elms);\n }\n\n changeTasks[method] = {\n target: changeElms.length ? changeElms : elm,\n classNames\n };\n }\n });\n\n methods.forEach(function(method) {\n if (changeTasks[method]) {\n classChange[method](changeTasks[method].target, changeTasks[method].classNames);\n }\n });\n }\n });\n}\n\n\n// Exports\n// =============================================================================\nexport default addRemoveAttrListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport * as util from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds classChange event listener(s) and returns a remove() method\n *\n * @param {object} options\n * @param {(array|element|htmlcollection|nodelist|string)} [options.target=document]\n * @param {string} [options.event=\"click\"]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.match=true]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.change=true]\n * @param {(array|function|string)} [options.add]\n * @param {(array|function|string)} [options.remove]\n * @param {(array|function|string)} [options.toggle]\n * @returns {object} Remove method\n */\nfunction addChangeListener(options) {\n const settings = {\n target: util.elementsToArray(options.target || document.body),\n event : options.event || 'click',\n match : options.match || true,\n change: options.change || true,\n add : options.add || null,\n remove: options.remove || null,\n toggle: options.toggle || null\n };\n\n function triggerChangeEvent(evt) {\n handleChangeEvent(evt, settings);\n }\n\n settings.target.forEach(function(target) {\n target.addEventListener(settings.event, triggerChangeEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n settings.target.forEach(function(target) {\n target.removeEventListener(settings.event, triggerChangeEvent);\n });\n }\n };\n}\n\n/**\n * Detects if an event matches the one defined in settings and changes class\n * names on elements accordingly\n *\n * @param {object} evt - Event object\n * @param {object} settings - Listener settings\n */\nfunction handleChangeEvent(evt, settings) {\n let matchElms = settings.match instanceof Function ? settings.match(evt) : settings.match;\n let matchedElm;\n\n // Match: Event target\n /* istanbul ignore else */\n if (matchElms === true) {\n matchElms = [evt.target];\n matchedElm = evt.target;\n }\n // Match: CSS selector\n else if (typeof matchElms === 'string') {\n const isMatch = util.matchesSelector(evt.target, matchElms);\n\n matchedElm = isMatch ? evt.target : util.getParents(evt.target).filter(elm => util.matchesSelector(elm, matchElms))[0] || null;\n matchElms = util.elementsToArray(matchElms);\n }\n // Match: Array, Element, HTMLCollection, NodeList\n else if (typeof matchElms === 'object') {\n const isMatch = evt.target === matchElms;\n\n matchElms = util.elementsToArray(matchElms);\n matchedElm = isMatch ? evt.target : matchElms[matchElms.indexOf(evt.target)] || util.getParents(evt.target).filter(elm => matchElms.indexOf(elm) !== -1)[0] || null;\n }\n\n // Change\n if (matchedElm) {\n const matchedElmIndex = matchElms.indexOf(matchedElm);\n let changeElms = settings.change instanceof Function ? settings.change(evt, matchedElm, matchedElmIndex) : settings.change;\n\n changeElms = changeElms === true ? [evt.target] : util.elementsToArray(changeElms);\n\n ['toggle', 'remove', 'add'].forEach(changeType => {\n // If settings value is a function, call for each element with args\n if (settings[changeType] instanceof Function) {\n changeElms.forEach((changeElm, changeElmIndex) => {\n const classNames = settings[changeType](evt, matchedElm, matchedElmIndex, changeElm, changeElmIndex);\n\n classChange[changeType](changeElm, classNames);\n });\n }\n else {\n const classNames = settings[changeType];\n\n classChange[changeType](changeElms, classNames);\n }\n });\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default addChangeListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport attrs from './attrs.js';\nimport listener from './listener.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\n\n\n// Exports\n// =============================================================================\nexport default { add, attrs, listener, remove, toggle };\n"],"names":["classNamesToArray","classNames","trim","replace","split","Array","isArray","map","name","length","filter","Boolean","elementsToArray","elements","apply","document","querySelectorAll","window","HTMLCollection","NodeList","value","index","self","indexOf","getParents","elm","matchSelector","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","parentElms","testElm","parentNode","call","push","selector","addClass","target","elms","forEach","i","classArray","Function","elmClassArray","className","newClassArray","finalClassArray","concat","join","removeClass","removeAttribute","classChange","add","remove","toggleClass","forceTrueFalse","keepClassArray","toggle","handleAttrEvent","evt","methods","changeTasks","method","getAttribute","closestAttr","parentsAttr","siblingsAttr","targetAttr","changeElms","matchedElm","getClosest","children","siblingElm","isSibling","isMatch","attrs","listenerTarget","addTrueRemoveFalse","removeEventListener","listener","options","settings","util","body","event","match","change","triggerChangeEvent","matchElms","_typeof","matchedElmIndex","changeType","changeElm","changeElmIndex","handleChangeEvent","addEventListener"],"mappings":"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"} |
| /*! | ||
| * class-change | ||
| * v1.1.4 | ||
| * v1.1.5 | ||
| * https://jhildenbiddle.github.io/class-change | ||
| * (c) 2018 John Hildenbiddle <http://hildenbiddle.com> | ||
| * (c) 2016-2019 John Hildenbiddle <http://hildenbiddle.com> | ||
| * MIT license | ||
| */ | ||
| (function(global, factory) { | ||
| typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.classChange = factory(); | ||
| typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global = global || self, | ||
| global.classChange = factory()); | ||
| })(this, function() { | ||
@@ -11,0 +12,0 @@ "use strict"; |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"class-change.js","sources":["../src/util.js","../src/add.js","../src/remove.js","../src/toggle.js","../src/attrs.js","../src/listener.js","../src/index.js"],"sourcesContent":["// Exports\n// =============================================================================\n/**\n * Converts space-separates list of class names to an array (if necessary) then\n * trims each array item.\n *\n * @export\n * @param {(array|string)} classNames\n * @returns {array}\n */\nexport function classNamesToArray(classNames) {\n // String - Trim and convert to Array\n if (typeof classNames === 'string') {\n classNames = classNames.trim().replace(/\\s+/g, ' ').split(' ');\n }\n\n if (Array.isArray(classNames)) {\n // Trim items\n classNames = classNames.map(name => name && name.length ? name.trim() : null);\n\n // Filter out \"falsey\" values\n classNames = classNames.filter(Boolean);\n }\n\n return classNames;\n}\n\n/**\n * Converts a CSS selector (string), Element, HTMLCollection or NodeList to an\n * array (returns array as-is).\n * - Array: [Element, Element, ...]\n * - Element: document.body\n * - HTMLCollection: document.getElementsByTagName('p')\n * - NodeList: document.querySelectorAll('p')\n * - String (CSS selector): 'p'\n *\n * @export\n * @param {(array|element|htmlcollection|nodelist|string)} elements\n * @param {boolean} [removeDuplicates=true]\n * @returns {array}\n */\nexport function elementsToArray(elements) {\n // CSS Selector\n if (typeof elements === 'string') {\n elements = Array.apply(null, document.querySelectorAll(elements));\n }\n // HTMLCollection / NodeList\n else if (elements instanceof window.HTMLCollection || elements instanceof window.NodeList) {\n elements = Array.apply(null, elements);\n }\n // Node/Element (assumed)\n else if (elements && !Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (Array.isArray(elements)) {\n // Remove duplicate\n return elements.filter((value, index, self) => self.indexOf(value) === index);\n }\n else {\n return [];\n }\n}\n\n/**\n * Matches self or finds closest ancestor (excluding document) node that match a\n * CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getClosest(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n let matchedElm = null;\n let testElm = elm;\n\n while (testElm && testElm !== document) {\n if (matches.call(testElm, matchSelector)) {\n matchedElm = testElm;\n break;\n }\n\n testElm = testElm.parentNode;\n }\n\n return matchedElm;\n}\n\n/**\n * Finds all parent nodes (excluding document), optionally limited to only those\n * that match a CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getParents(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n const parentElms = [];\n\n let testElm = elm.parentNode;\n\n while (testElm && testElm !== document) {\n if (!matchSelector || matchSelector && matches.call(testElm, matchSelector)) {\n parentElms.push(testElm);\n }\n\n testElm = testElm.parentNode;\n }\n\n return parentElms;\n}\n\n/**\n * Cross-browser wrapper for native \"matches\" method\n *\n * @export\n * @param {element} elm\n * @param {string} selector\n * @returns {boolean}\n */\nexport function matchesSelector(elm, selector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n return matches.call(elm, selector);\n}\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Add class name(s) to target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to add class name(s) to\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction addClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = elmClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default addClass;\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Remove class name(s) from target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to remove class name(s) from\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction removeClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (elm.className.trim().length && classArray && classArray.length) {\n const elmClassArray = elm.className.split(' ');\n const finalClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n\n // Standardize result of setting empty \"class\" attribute.\n // Internet Explorer and Edge automatically remove the \"class\"\n // attribute when it is set to \"\". Other browsers (Chrome, Firefox,\n // Safari) will set the attribute to \"\". The difference in these\n // behaviors throws off unit tests, so the following code emulates\n // IE/Edge behavior of removing the attribute when the value is \"\".\n if (finalClassArray.length) {\n elm.className = finalClassArray.join(' ');\n }\n else {\n elm.removeAttribute('class');\n }\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default removeClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove };\n\n\n// Functions\n// =============================================================================\n/**\n * Toggle class name(s) on target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to toggle class name(s) on\n * @param {(array|function|string)} classNames - Array, space-separated list, or\n * function that returns array/string of class name(s)\n * @param {boolean} [forceTrueFalse] - Force add when true, remove when false\n * @returns {(array|element)} - Target(s)\n */\nfunction toggleClass(target, classNames, forceTrueFalse) {\n if (forceTrueFalse === true) {\n return classChange.add(target, classNames);\n }\n else if (forceTrueFalse === false) {\n return classChange.remove(target, classNames);\n }\n else {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const keepClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = keepClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default toggleClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport { elementsToArray, matchesSelector, getClosest, getParents } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds or removes click/tap event listener(s) on elements that have\n * data-class-* attributes and trigger associated method(s).\n *\n * @param {(array|element|htmlcollection|nodelist|string)} [listenerTarget=document]\n * @param {boolean} [addTrueRemoveFalse=true]\n */\nfunction addRemoveAttrListener(listenerTarget = document, addTrueRemoveFalse = true) {\n // Allow boolean for listenerTarget\n // true = add default listener, false = remove default listener\n addTrueRemoveFalse = typeof(listenerTarget) === 'boolean' ? listenerTarget : addTrueRemoveFalse;\n listenerTarget = typeof(listenerTarget) === 'boolean' ? document : listenerTarget;\n\n const elms = elementsToArray(listenerTarget);\n const method = listenerTarget === false || addTrueRemoveFalse === false ? 'removeEventListener' : 'addEventListener';\n\n elms.forEach(function(elm) {\n elm[method]('click', handleAttrEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n elms.forEach(function(elm) {\n elm.removeEventListener('click', handleAttrEvent);\n });\n }\n };\n}\n\n/**\n * Handles click/tap events triggered via data-class-* attributes.\n *\n * @param {object} evt\n */\nfunction handleAttrEvent(evt) {\n const elms = [evt.target].concat(getParents(evt.target));\n const matchSelector = '[data-class-add],[data-class-remove],[data-class-toggle]';\n const methods = ['add', 'remove', 'toggle'];\n\n elms.forEach(function(elm) {\n const hasAttr = matchesSelector(elm, matchSelector);\n\n if (hasAttr) {\n const changeTasks = {};\n\n methods.forEach(function(method) {\n const classNames = elm.getAttribute(`data-class-${method}`);\n\n if (classNames && classNames.length) {\n const closestAttr = elm.getAttribute(`data-class-${method}-closest`) || elm.getAttribute('data-class-closest');\n const parentsAttr = elm.getAttribute(`data-class-${method}-parents`) || elm.getAttribute('data-class-parents');\n const siblingsAttr = elm.getAttribute(`data-class-${method}-siblings`) || elm.getAttribute('data-class-siblings');\n const targetAttr = elm.getAttribute(`data-class-${method}-target`) || elm.getAttribute('data-class-target');\n\n let changeElms = [];\n\n if (closestAttr) {\n const elms = getClosest(elm, closestAttr);\n changeElms = changeElms.concat(elms);\n }\n if (parentsAttr) {\n const elms = getParents(elm, parentsAttr);\n changeElms = changeElms.concat(elms);\n }\n if (siblingsAttr) {\n const siblingElms = elementsToArray(elm.parentNode.children);\n\n siblingElms.forEach(function(siblingElm) {\n const isSibling = siblingElm !== elm;\n const isMatch = matchesSelector(siblingElm, siblingsAttr);\n\n if (isSibling && isMatch) {\n changeElms.push(siblingElm);\n }\n });\n }\n if (targetAttr) {\n const elms = elementsToArray(document.querySelectorAll(targetAttr));\n changeElms = changeElms.concat(elms);\n }\n\n changeTasks[method] = {\n target: changeElms.length ? changeElms : elm,\n classNames\n };\n }\n });\n\n methods.forEach(function(method) {\n if (changeTasks[method]) {\n classChange[method](changeTasks[method].target, changeTasks[method].classNames);\n }\n });\n }\n });\n}\n\n\n// Exports\n// =============================================================================\nexport default addRemoveAttrListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport * as util from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds classChange event listener(s) and returns a remove() method\n *\n * @param {object} options\n * @param {(array|element|htmlcollection|nodelist|string)} [options.target=document]\n * @param {string} [options.event=\"click\"]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.match=true]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.change=true]\n * @param {(array|function|string)} [options.add]\n * @param {(array|function|string)} [options.remove]\n * @param {(array|function|string)} [options.toggle]\n * @returns {object} Remove method\n */\nfunction addChangeListener(options) {\n const settings = {\n target: util.elementsToArray(options.target || document.body),\n event : options.event || 'click',\n match : options.match || true,\n change: options.change || true,\n add : options.add || null,\n remove: options.remove || null,\n toggle: options.toggle || null\n };\n\n function triggerChangeEvent(evt) {\n handleChangeEvent(evt, settings);\n }\n\n settings.target.forEach(function(target) {\n target.addEventListener(settings.event, triggerChangeEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n settings.target.forEach(function(target) {\n target.removeEventListener(settings.event, triggerChangeEvent);\n });\n }\n };\n}\n\n/**\n * Detects if an event matches the one defined in settings and changes class\n * names on elements accordingly\n *\n * @param {object} evt - Event object\n * @param {object} settings - Listener settings\n */\nfunction handleChangeEvent(evt, settings) {\n let matchElms = settings.match instanceof Function ? settings.match(evt) : settings.match;\n let matchedElm;\n\n // Match: Event target\n /* istanbul ignore else */\n if (matchElms === true) {\n matchElms = [evt.target];\n matchedElm = evt.target;\n }\n // Match: CSS selector\n else if (typeof matchElms === 'string') {\n const isMatch = util.matchesSelector(evt.target, matchElms);\n\n matchedElm = isMatch ? evt.target : util.getParents(evt.target).filter(elm => util.matchesSelector(elm, matchElms))[0] || null;\n matchElms = util.elementsToArray(matchElms);\n }\n // Match: Array, Element, HTMLCollection, NodeList\n else if (typeof matchElms === 'object') {\n const isMatch = evt.target === matchElms;\n\n matchElms = util.elementsToArray(matchElms);\n matchedElm = isMatch ? evt.target : matchElms[matchElms.indexOf(evt.target)] || util.getParents(evt.target).filter(elm => matchElms.indexOf(elm) !== -1)[0] || null;\n }\n\n // Change\n if (matchedElm) {\n const matchedElmIndex = matchElms.indexOf(matchedElm);\n let changeElms = settings.change instanceof Function ? settings.change(evt, matchedElm, matchedElmIndex) : settings.change;\n\n changeElms = changeElms === true ? [evt.target] : util.elementsToArray(changeElms);\n\n ['toggle', 'remove', 'add'].forEach(changeType => {\n // If settings value is a function, call for each element with args\n if (settings[changeType] instanceof Function) {\n changeElms.forEach((changeElm, changeElmIndex) => {\n const classNames = settings[changeType](evt, matchedElm, matchedElmIndex, changeElm, changeElmIndex);\n\n classChange[changeType](changeElm, classNames);\n });\n }\n else {\n const classNames = settings[changeType];\n\n classChange[changeType](changeElms, classNames);\n }\n });\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default addChangeListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport attrs from './attrs.js';\nimport listener from './listener.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\n\n\n// Exports\n// =============================================================================\nexport default { add, attrs, listener, remove, toggle };\n"],"names":["classNamesToArray","classNames","trim","replace","split","Array","isArray","map","name","length","filter","Boolean","elementsToArray","elements","apply","document","querySelectorAll","window","HTMLCollection","NodeList","value","index","self","indexOf","getClosest","elm","matchSelector","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","matchedElm","testElm","call","parentNode","getParents","parentElms","push","selector","addClass","target","elms","forEach","i","classArray","Function","elmClassArray","className","newClassArray","finalClassArray","concat","join","removeClass","removeAttribute","classChange","add","remove","toggleClass","forceTrueFalse","keepClassArray","toggle","addRemoveAttrListener","listenerTarget","addTrueRemoveFalse","method","handleAttrEvent","removeEventListener","evt","methods","hasAttr","changeTasks","getAttribute","closestAttr","parentsAttr","siblingsAttr","targetAttr","changeElms","siblingElms","children","siblingElm","isSibling","isMatch","addChangeListener","options","settings","util","body","event","match","change","triggerChangeEvent","handleChangeEvent","addEventListener","matchElms","_typeof","matchedElmIndex","changeType","changeElm","changeElmIndex","attrs","listener"],"mappings":"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"} | ||
| {"version":3,"file":"class-change.js","sources":["../src/util.js","../src/add.js","../src/remove.js","../src/toggle.js","../src/attrs.js","../src/listener.js","../src/index.js"],"sourcesContent":["// Exports\n// =============================================================================\n/**\n * Converts space-separates list of class names to an array (if necessary) then\n * trims each array item.\n *\n * @export\n * @param {(array|string)} classNames\n * @returns {array}\n */\nexport function classNamesToArray(classNames) {\n // String - Trim and convert to Array\n if (typeof classNames === 'string') {\n classNames = classNames.trim().replace(/\\s+/g, ' ').split(' ');\n }\n\n if (Array.isArray(classNames)) {\n // Trim items\n classNames = classNames.map(name => name && name.length ? name.trim() : null);\n\n // Filter out \"falsey\" values\n classNames = classNames.filter(Boolean);\n }\n\n return classNames;\n}\n\n/**\n * Converts a CSS selector (string), Element, HTMLCollection or NodeList to an\n * array (returns array as-is).\n * - Array: [Element, Element, ...]\n * - Element: document.body\n * - HTMLCollection: document.getElementsByTagName('p')\n * - NodeList: document.querySelectorAll('p')\n * - String (CSS selector): 'p'\n *\n * @export\n * @param {(array|element|htmlcollection|nodelist|string)} elements\n * @param {boolean} [removeDuplicates=true]\n * @returns {array}\n */\nexport function elementsToArray(elements) {\n // CSS Selector\n if (typeof elements === 'string') {\n elements = Array.apply(null, document.querySelectorAll(elements));\n }\n // HTMLCollection / NodeList\n else if (elements instanceof window.HTMLCollection || elements instanceof window.NodeList) {\n elements = Array.apply(null, elements);\n }\n // Node/Element (assumed)\n else if (elements && !Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (Array.isArray(elements)) {\n // Remove duplicate\n return elements.filter((value, index, self) => self.indexOf(value) === index);\n }\n else {\n return [];\n }\n}\n\n/**\n * Matches self or finds closest ancestor (excluding document) node that match a\n * CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getClosest(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n let matchedElm = null;\n let testElm = elm;\n\n while (testElm && testElm !== document) {\n if (matches.call(testElm, matchSelector)) {\n matchedElm = testElm;\n break;\n }\n\n testElm = testElm.parentNode;\n }\n\n return matchedElm;\n}\n\n/**\n * Finds all parent nodes (excluding document), optionally limited to only those\n * that match a CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getParents(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n const parentElms = [];\n\n let testElm = elm.parentNode;\n\n while (testElm && testElm !== document) {\n if (!matchSelector || matchSelector && matches.call(testElm, matchSelector)) {\n parentElms.push(testElm);\n }\n\n testElm = testElm.parentNode;\n }\n\n return parentElms;\n}\n\n/**\n * Cross-browser wrapper for native \"matches\" method\n *\n * @export\n * @param {element} elm\n * @param {string} selector\n * @returns {boolean}\n */\nexport function matchesSelector(elm, selector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n return matches.call(elm, selector);\n}\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Add class name(s) to target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to add class name(s) to\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction addClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = elmClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default addClass;\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Remove class name(s) from target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to remove class name(s) from\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction removeClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (elm.className.trim().length && classArray && classArray.length) {\n const elmClassArray = elm.className.split(' ');\n const finalClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n\n // Standardize result of setting empty \"class\" attribute.\n // Internet Explorer and Edge automatically remove the \"class\"\n // attribute when it is set to \"\". Other browsers (Chrome, Firefox,\n // Safari) will set the attribute to \"\". The difference in these\n // behaviors throws off unit tests, so the following code emulates\n // IE/Edge behavior of removing the attribute when the value is \"\".\n if (finalClassArray.length) {\n elm.className = finalClassArray.join(' ');\n }\n else {\n elm.removeAttribute('class');\n }\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default removeClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove };\n\n\n// Functions\n// =============================================================================\n/**\n * Toggle class name(s) on target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to toggle class name(s) on\n * @param {(array|function|string)} classNames - Array, space-separated list, or\n * function that returns array/string of class name(s)\n * @param {boolean} [forceTrueFalse] - Force add when true, remove when false\n * @returns {(array|element)} - Target(s)\n */\nfunction toggleClass(target, classNames, forceTrueFalse) {\n if (forceTrueFalse === true) {\n return classChange.add(target, classNames);\n }\n else if (forceTrueFalse === false) {\n return classChange.remove(target, classNames);\n }\n else {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const keepClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = keepClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default toggleClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport { elementsToArray, matchesSelector, getClosest, getParents } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds or removes click/tap event listener(s) on elements that have\n * data-class-* attributes and trigger associated method(s).\n *\n * @param {(array|element|htmlcollection|nodelist|string)} [listenerTarget=document]\n * @param {boolean} [addTrueRemoveFalse=true]\n */\nfunction addRemoveAttrListener(listenerTarget = document, addTrueRemoveFalse = true) {\n // Allow boolean for listenerTarget\n // true = add default listener, false = remove default listener\n addTrueRemoveFalse = typeof(listenerTarget) === 'boolean' ? listenerTarget : addTrueRemoveFalse;\n listenerTarget = typeof(listenerTarget) === 'boolean' ? document : listenerTarget;\n\n const elms = elementsToArray(listenerTarget);\n const method = listenerTarget === false || addTrueRemoveFalse === false ? 'removeEventListener' : 'addEventListener';\n\n elms.forEach(function(elm) {\n elm[method]('click', handleAttrEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n elms.forEach(function(elm) {\n elm.removeEventListener('click', handleAttrEvent);\n });\n }\n };\n}\n\n/**\n * Handles click/tap events triggered via data-class-* attributes.\n *\n * @param {object} evt\n */\nfunction handleAttrEvent(evt) {\n const elms = [evt.target].concat(getParents(evt.target));\n const matchSelector = '[data-class-add],[data-class-remove],[data-class-toggle]';\n const methods = ['add', 'remove', 'toggle'];\n\n elms.forEach(function(elm) {\n const hasAttr = matchesSelector(elm, matchSelector);\n\n if (hasAttr) {\n const changeTasks = {};\n\n methods.forEach(function(method) {\n const classNames = elm.getAttribute(`data-class-${method}`);\n\n if (classNames && classNames.length) {\n const closestAttr = elm.getAttribute(`data-class-${method}-closest`) || elm.getAttribute('data-class-closest');\n const parentsAttr = elm.getAttribute(`data-class-${method}-parents`) || elm.getAttribute('data-class-parents');\n const siblingsAttr = elm.getAttribute(`data-class-${method}-siblings`) || elm.getAttribute('data-class-siblings');\n const targetAttr = elm.getAttribute(`data-class-${method}-target`) || elm.getAttribute('data-class-target');\n\n let changeElms = [];\n\n if (closestAttr) {\n const elms = getClosest(elm, closestAttr);\n changeElms = changeElms.concat(elms);\n }\n if (parentsAttr) {\n const elms = getParents(elm, parentsAttr);\n changeElms = changeElms.concat(elms);\n }\n if (siblingsAttr) {\n const siblingElms = elementsToArray(elm.parentNode.children);\n\n siblingElms.forEach(function(siblingElm) {\n const isSibling = siblingElm !== elm;\n const isMatch = matchesSelector(siblingElm, siblingsAttr);\n\n if (isSibling && isMatch) {\n changeElms.push(siblingElm);\n }\n });\n }\n if (targetAttr) {\n const elms = elementsToArray(document.querySelectorAll(targetAttr));\n changeElms = changeElms.concat(elms);\n }\n\n changeTasks[method] = {\n target: changeElms.length ? changeElms : elm,\n classNames\n };\n }\n });\n\n methods.forEach(function(method) {\n if (changeTasks[method]) {\n classChange[method](changeTasks[method].target, changeTasks[method].classNames);\n }\n });\n }\n });\n}\n\n\n// Exports\n// =============================================================================\nexport default addRemoveAttrListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport * as util from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds classChange event listener(s) and returns a remove() method\n *\n * @param {object} options\n * @param {(array|element|htmlcollection|nodelist|string)} [options.target=document]\n * @param {string} [options.event=\"click\"]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.match=true]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.change=true]\n * @param {(array|function|string)} [options.add]\n * @param {(array|function|string)} [options.remove]\n * @param {(array|function|string)} [options.toggle]\n * @returns {object} Remove method\n */\nfunction addChangeListener(options) {\n const settings = {\n target: util.elementsToArray(options.target || document.body),\n event : options.event || 'click',\n match : options.match || true,\n change: options.change || true,\n add : options.add || null,\n remove: options.remove || null,\n toggle: options.toggle || null\n };\n\n function triggerChangeEvent(evt) {\n handleChangeEvent(evt, settings);\n }\n\n settings.target.forEach(function(target) {\n target.addEventListener(settings.event, triggerChangeEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n settings.target.forEach(function(target) {\n target.removeEventListener(settings.event, triggerChangeEvent);\n });\n }\n };\n}\n\n/**\n * Detects if an event matches the one defined in settings and changes class\n * names on elements accordingly\n *\n * @param {object} evt - Event object\n * @param {object} settings - Listener settings\n */\nfunction handleChangeEvent(evt, settings) {\n let matchElms = settings.match instanceof Function ? settings.match(evt) : settings.match;\n let matchedElm;\n\n // Match: Event target\n /* istanbul ignore else */\n if (matchElms === true) {\n matchElms = [evt.target];\n matchedElm = evt.target;\n }\n // Match: CSS selector\n else if (typeof matchElms === 'string') {\n const isMatch = util.matchesSelector(evt.target, matchElms);\n\n matchedElm = isMatch ? evt.target : util.getParents(evt.target).filter(elm => util.matchesSelector(elm, matchElms))[0] || null;\n matchElms = util.elementsToArray(matchElms);\n }\n // Match: Array, Element, HTMLCollection, NodeList\n else if (typeof matchElms === 'object') {\n const isMatch = evt.target === matchElms;\n\n matchElms = util.elementsToArray(matchElms);\n matchedElm = isMatch ? evt.target : matchElms[matchElms.indexOf(evt.target)] || util.getParents(evt.target).filter(elm => matchElms.indexOf(elm) !== -1)[0] || null;\n }\n\n // Change\n if (matchedElm) {\n const matchedElmIndex = matchElms.indexOf(matchedElm);\n let changeElms = settings.change instanceof Function ? settings.change(evt, matchedElm, matchedElmIndex) : settings.change;\n\n changeElms = changeElms === true ? [evt.target] : util.elementsToArray(changeElms);\n\n ['toggle', 'remove', 'add'].forEach(changeType => {\n // If settings value is a function, call for each element with args\n if (settings[changeType] instanceof Function) {\n changeElms.forEach((changeElm, changeElmIndex) => {\n const classNames = settings[changeType](evt, matchedElm, matchedElmIndex, changeElm, changeElmIndex);\n\n classChange[changeType](changeElm, classNames);\n });\n }\n else {\n const classNames = settings[changeType];\n\n classChange[changeType](changeElms, classNames);\n }\n });\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default addChangeListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport attrs from './attrs.js';\nimport listener from './listener.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\n\n\n// Exports\n// =============================================================================\nexport default { add, attrs, listener, remove, toggle };\n"],"names":["classNamesToArray","classNames","trim","replace","split","Array","isArray","map","name","length","filter","Boolean","elementsToArray","elements","apply","document","querySelectorAll","window","HTMLCollection","NodeList","value","index","self","indexOf","getClosest","elm","matchSelector","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","matchedElm","testElm","call","parentNode","getParents","parentElms","push","selector","addClass","target","elms","forEach","i","classArray","Function","elmClassArray","className","newClassArray","finalClassArray","concat","join","removeClass","removeAttribute","classChange","add","remove","toggleClass","forceTrueFalse","keepClassArray","toggle","addRemoveAttrListener","listenerTarget","addTrueRemoveFalse","method","handleAttrEvent","removeEventListener","evt","methods","hasAttr","changeTasks","getAttribute","closestAttr","parentsAttr","siblingsAttr","targetAttr","changeElms","siblingElms","children","siblingElm","isSibling","isMatch","addChangeListener","options","settings","util","body","event","match","change","triggerChangeEvent","handleChangeEvent","addEventListener","matchElms","_typeof","matchedElmIndex","changeType","changeElm","changeElmIndex","attrs","listener"],"mappings":";;;;;;;;;;;;IAUO,SAASA,kBAAkBC;mBAEnBA,eAAe,UAAU;YAChCA,aAAaA,WAAWC,OAAOC,QAAQ,QAAQ,KAAKC,MAAM;;YAG1DC,MAAMC,QAAQL,aAAa;YAE3BA,aAAaA,WAAWM,IAAI,SAAAC;uBAAQA,QAAQA,KAAKC,SAASD,KAAKN,SAAS;;YAGxED,aAAaA,WAAWS,OAAOC;;eAG5BV;;IAiBJ,SAASW,gBAAgBC;mBAEjBA,aAAa,UAAU;YAC9BA,WAAWR,MAAMS,MAAM,MAAMC,SAASC,iBAAiBH;eAGtD,IAAIA,oBAAoBI,OAAOC,kBAAkBL,oBAAoBI,OAAOE,UAAU;YACvFN,WAAWR,MAAMS,MAAM,MAAMD;eAG5B,IAAIA,aAAaR,MAAMC,QAAQO,WAAW;YAC3CA,WAAW,EAACA;;YAGZR,MAAMC,QAAQO,WAAW;mBAElBA,SAASH,OAAO,SAACU,OAAOC,OAAOC;uBAASA,KAAKC,QAAQH,WAAWC;;eAEtE;mBACM;;;IAaR,SAASG,WAAWC,KAAKC;YAEtBC,UAAUF,IAAIE,WAAWF,IAAIG,mBAAmBH,IAAII,yBAAyBJ,IAAIK,sBAAsBL,IAAIM,qBAAqBN,IAAIO;YAEtIC,aAAa;YACbC,UAAaT;eAEVS,WAAWA,YAAYnB,UAAU;gBAChCY,QAAQQ,KAAKD,SAASR,gBAAgB;gBACtCO,aAAaC;;;YAIjBA,UAAUA,QAAQE;;eAGfH;;IAYJ,SAASI,WAAWZ,KAAKC;YAEtBC,UAAaF,IAAIE,WAAWF,IAAIG,mBAAmBH,IAAII,yBAAyBJ,IAAIK,sBAAsBL,IAAIM,qBAAqBN,IAAIO;YACvIM,aAAa;YAEfJ,UAAUT,IAAIW;eAEXF,WAAWA,YAAYnB,UAAU;iBAC/BW,iBAAiBA,iBAAiBC,QAAQQ,KAAKD,SAASR,gBAAgB;gBACzEY,WAAWC,KAAKL;;YAGpBA,UAAUA,QAAQE;;eAGfE;;IAWJ,SAASV,gBAAgBH,KAAKe;YAE3Bb,UAAUF,IAAIE,WAAWF,IAAIG,mBAAmBH,IAAII,yBAAyBJ,IAAIK,sBAAsBL,IAAIM,qBAAqBN,IAAIO;eAEnIL,QAAQQ,KAAKV,KAAKe;;ICnH7B,SAASC,SAASC,QAAQzC;YAChB0C,OAAO/B,gBAAgB8B;QAE7BC,KAAKC,QAAQ,SAASnB,KAAKoB;gBACjBC,aAAa9C,kBAAkBC,sBAAsB8C,WAAW9C,WAAWwB,KAAKoB,KAAK5C;gBAEvF6C,cAAcA,WAAWrC,QAAQ;oBAC3BuC,gBAAkBvB,IAAIwB,UAAUxC,SAASgB,IAAIwB,UAAU7C,MAAM,OAAO;oBACpE8C,gBAAkBJ,WAAWpC,OAAO,SAAAuC;2BAAaD,cAAczB,QAAQ0B,gBAAgB;;oBACvFE,kBAAkBH,cAAcI,OAAOF;gBAE7CzB,IAAIwB,YAAYE,gBAAgBE,KAAK;;;eAItCV,KAAKlC,WAAW,IAAIkC,KAAK,KAAKA;;ICfzC,SAASW,YAAYZ,QAAQzC;YACnB0C,OAAO/B,gBAAgB8B;QAE7BC,KAAKC,QAAQ,SAASnB,KAAKoB;gBACjBC,aAAa9C,kBAAkBC,sBAAsB8C,WAAW9C,WAAWwB,KAAKoB,KAAK5C;gBAEvFwB,IAAIwB,UAAU/C,OAAOO,UAAUqC,cAAcA,WAAWrC,QAAQ;oBAC1DuC,gBAAkBvB,IAAIwB,UAAU7C,MAAM;oBACtC+C,kBAAkBH,cAActC,OAAO,SAAAuC;2BAAaH,WAAWvB,QAAQ0B,gBAAgB;;oBAQzFE,gBAAgB1C,QAAQ;oBACxBgB,IAAIwB,YAAYE,gBAAgBE,KAAK;uBAEpC;oBACD5B,IAAI8B,gBAAgB;;;;eAKzBZ,KAAKlC,WAAW,IAAIkC,KAAK,KAAKA;;IChCzC,IAAMa,cAAc;QAAEC,KAAAA;QAAKC,QAAAA;;IAe3B,SAASC,YAAYjB,QAAQzC,YAAY2D;YACjCA,mBAAmB,MAAM;mBAClBJ,YAAYC,IAAIf,QAAQzC;eAE9B,IAAI2D,mBAAmB,OAAO;mBACxBJ,YAAYE,OAAOhB,QAAQzC;eAEjC;gBACK0C,OAAO/B,gBAAgB8B;YAE7BC,KAAKC,QAAQ,SAASnB,KAAKoB;oBACjBC,aAAa9C,kBAAkBC,sBAAsB8C,WAAW9C,WAAWwB,KAAKoB,KAAK5C;oBAEvF6C,cAAcA,WAAWrC,QAAQ;wBAC3BuC,gBAAkBvB,IAAIwB,UAAUxC,SAASgB,IAAIwB,UAAU7C,MAAM,OAAO;wBACpEyD,iBAAkBb,cAActC,OAAO,SAAAuC;+BAAaH,WAAWvB,QAAQ0B,gBAAgB;;wBACvFC,gBAAkBJ,WAAWpC,OAAO,SAAAuC;+BAAaD,cAAczB,QAAQ0B,gBAAgB;;wBACvFE,kBAAkBU,eAAeT,OAAOF;oBAE9CzB,IAAIwB,YAAYE,gBAAgBE,KAAK;;;mBAItCV,KAAKlC,WAAW,IAAIkC,KAAK,KAAKA;;;ICrC7C,IAAMa,gBAAc;QAAEC,KAAAA;QAAKC,QAAAA;QAAQI,QAAAA;;IAYnC,SAASC;YAAsBC,qFAAiBjD;YAAUkD,yFAAqB;QAG3EA,4BAA4BD,mBAAoB,YAAYA,iBAAiBC;QAC7ED,wBAAwBA,mBAAoB,YAAYjD,WAAWiD;YAE7DrB,OAAS/B,gBAAgBoD;YACzBE,SAASF,mBAAmB,SAASC,uBAAuB,QAAQ,wBAAwB;QAElGtB,KAAKC,QAAQ,SAASnB;YAClBA,IAAIyC,QAAQ,SAASC;;eAIlB;YACHT;gBACIf,KAAKC,QAAQ,SAASnB;oBAClBA,IAAI2C,oBAAoB,SAASD;;;;;IAWjD,SAASA,gBAAgBE;YACf1B,OAAgB,EAAC0B,IAAI3B,SAAQU,OAAOf,WAAWgC,IAAI3B;YACnDhB,gBAAgB;YAChB4C,UAAgB,EAAC,OAAO,UAAU;QAExC3B,KAAKC,QAAQ,SAASnB;gBACZ8C,UAAU3C,gBAAgBH,KAAKC;gBAEjC6C,SAAS;oBACHC,cAAc;gBAEpBF,QAAQ1B,QAAQ,SAASsB;wBACfjE,aAAawB,IAAIgD,kCAA2BP;wBAE9CjE,cAAcA,WAAWQ,QAAQ;4BAC3BiE,cAAejD,IAAIgD,kCAA2BP,wBAAqBzC,IAAIgD,aAAa;4BACpFE,cAAelD,IAAIgD,kCAA2BP,wBAAqBzC,IAAIgD,aAAa;4BACpFG,eAAenD,IAAIgD,kCAA2BP,yBAAsBzC,IAAIgD,aAAa;4BACrFI,aAAepD,IAAIgD,kCAA2BP,uBAAoBzC,IAAIgD,aAAa;4BAErFK,aAAa;4BAEbJ,aAAa;gCACP/B,QAAOnB,WAAWC,KAAKiD;4BAC7BI,aAAaA,WAAW1B,OAAOT;;4BAE/BgC,aAAa;gCACPhC,SAAON,WAAWZ,KAAKkD;4BAC7BG,aAAaA,WAAW1B,OAAOT;;4BAE/BiC,cAAc;gCACRG,cAAcnE,gBAAgBa,IAAIW,WAAW4C;4BAEnDD,YAAYnC,QAAQ,SAASqC;oCACnBC,YAAYD,eAAexD;oCAC3B0D,UAAYvD,gBAAgBqD,YAAYL;oCAE1CM,aAAaC,SAAS;oCACtBL,WAAWvC,KAAK0C;;;;4BAIxBJ,YAAY;gCACNlC,SAAO/B,gBAAgBG,SAASC,iBAAiB6D;4BACvDC,aAAaA,WAAW1B,OAAOT;;wBAGnC6B,YAAYN,UAAU;4BAClBxB,QAAQoC,WAAWrE,SAASqE,aAAarD;4BACzCxB,YAAAA;;;;gBAKZqE,QAAQ1B,QAAQ,SAASsB;wBACjBM,YAAYN,SAAS;wBACrBV,cAAYU,QAAQM,YAAYN,QAAQxB,QAAQ8B,YAAYN,QAAQjE;;;;;;;;;;;;;;;;;;IChGxF,IAAMuD,gBAAc;QAAEC,KAAAA;QAAKC,QAAAA;QAAQI,QAAAA;;IAkBnC,SAASsB,kBAAkBC;YACjBC,WAAW;YACb5C,QAAQ6C,gBAAqBF,QAAQ3C,UAAU3B,SAASyE;YACxDC,OAAQJ,QAAQI,SAAU;YAC1BC,OAAQL,QAAQK,SAAU;YAC1BC,QAAQN,QAAQM,UAAU;YAC1BlC,KAAQ4B,QAAQ5B,OAAU;YAC1BC,QAAQ2B,QAAQ3B,UAAU;YAC1BI,QAAQuB,QAAQvB,UAAU;;iBAGrB8B,mBAAmBvB;YACxBwB,kBAAkBxB,KAAKiB;;QAG3BA,SAAS5C,OAAOE,QAAQ,SAASF;YAC7BA,OAAOoD,iBAAiBR,SAASG,OAAOG;;eAIrC;YACHlC;gBACI4B,SAAS5C,OAAOE,QAAQ,SAASF;oBAC7BA,OAAO0B,oBAAoBkB,SAASG,OAAOG;;;;;IAa3D,SAASC,kBAAkBxB,KAAKiB;YACxBS,YAAYT,SAASI,iBAAiB3C,WAAWuC,SAASI,MAAMrB,OAAOiB,SAASI;YAChFzD;YAIA8D,cAAc,MAAM;YACpBA,YAAa,EAAC1B,IAAI3B;YAClBT,aAAaoC,IAAI3B;eAGhB,WAAWqD,cAAc,UAAU;gBAC9BZ,UAAUI,gBAAqBlB,IAAI3B,QAAQqD;YAEjD9D,aAAakD,UAAUd,IAAI3B,SAAS6C,WAAgBlB,IAAI3B,QAAQhC,OAAO,SAAAe;uBAAO8D,gBAAqB9D,KAAKsE;eAAY,MAAM;YAC1HA,YAAaR,gBAAqBQ;eAGjC,IAAIC,QAAOD,eAAc,UAAU;gBAC9BZ,WAAUd,IAAI3B,WAAWqD;YAE/BA,YAAaR,gBAAqBQ;YAClC9D,aAAakD,WAAUd,IAAI3B,SAASqD,UAAUA,UAAUxE,QAAQ8C,IAAI3B,YAAY6C,WAAgBlB,IAAI3B,QAAQhC,OAAO,SAAAe;uBAAOsE,UAAUxE,QAAQE,UAAU;eAAG,MAAM;;YAI/JQ,YAAY;gBACNgE,kBAAkBF,UAAUxE,QAAQU;gBACpC6C,aAAkBQ,SAASK,kBAAkB5C,WAAWuC,SAASK,OAAOtB,KAAKpC,YAAYgE,mBAAmBX,SAASK;YAE3Hb,aAAaA,eAAe,OAAO,EAACT,IAAI3B,WAAU6C,gBAAqBT;cAEtE,UAAU,UAAU,QAAOlC,QAAQ,SAAAsD;oBAE5BZ,SAASY,uBAAuBnD,UAAU;oBAC1C+B,WAAWlC,QAAQ,SAACuD,WAAWC;4BACrBnG,aAAaqF,SAASY,YAAY7B,KAAKpC,YAAYgE,iBAAiBE,WAAWC;wBAErF5C,cAAY0C,YAAYC,WAAWlG;;uBAGtC;wBACKA,aAAaqF,SAASY;oBAE5B1C,cAAY0C,YAAYpB,YAAY7E;;;;;gBCjGrC;QAAEwD,KAAAA;QAAK4C,OAAAA;QAAOC,UAAAA;QAAU5C,QAAAA;QAAQI,QAAAA;;"} |
| /*! | ||
| * class-change | ||
| * v1.1.4 | ||
| * v1.1.5 | ||
| * https://jhildenbiddle.github.io/class-change | ||
| * (c) 2018 John Hildenbiddle <http://hildenbiddle.com> | ||
| * (c) 2016-2019 John Hildenbiddle <http://hildenbiddle.com> | ||
| * MIT license | ||
| */ | ||
| !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.classChange=e()}(this,function(){"use strict";function t(t){return"string"==typeof t&&(t=t.trim().replace(/\s+/g," ").split(" ")),Array.isArray(t)&&(t=(t=t.map(function(t){return t&&t.length?t.trim():null})).filter(Boolean)),t}function e(t){return"string"==typeof t?t=Array.apply(null,document.querySelectorAll(t)):t instanceof window.HTMLCollection||t instanceof window.NodeList?t=Array.apply(null,t):t&&!Array.isArray(t)&&(t=[t]),Array.isArray(t)?t.filter(function(t,e,n){return n.indexOf(t)===e}):[]}function n(t,e){for(var n=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector,r=[],a=t.parentNode;a&&a!==document;)(!e||e&&n.call(a,e))&&r.push(a),a=a.parentNode;return r}function r(t,e){return(t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector).call(t,e)}function a(n,r){var a=e(n);return a.forEach(function(e,n){var a=t(r instanceof Function?r(e,n):r);if(a&&a.length){var o=e.className.length?e.className.split(" "):[],c=a.filter(function(t){return-1===o.indexOf(t)}),i=o.concat(c);e.className=i.join(" ")}}),1===a.length?a[0]:a}function o(n,r){var a=e(n);return a.forEach(function(e,n){var a=t(r instanceof Function?r(e,n):r);if(e.className.trim().length&&a&&a.length){var o=e.className.split(" ").filter(function(t){return-1===a.indexOf(t)});o.length?e.className=o.join(" "):e.removeAttribute("class")}}),1===a.length?a[0]:a}var c={add:a,remove:o};function i(n,r,a){if(!0===a)return c.add(n,r);if(!1===a)return c.remove(n,r);var o=e(n);return o.forEach(function(e,n){var a=t(r instanceof Function?r(e,n):r);if(a&&a.length){var o=e.className.length?e.className.split(" "):[],c=o.filter(function(t){return-1===a.indexOf(t)}),i=a.filter(function(t){return-1===o.indexOf(t)}),l=c.concat(i);e.className=l.join(" ")}}),1===o.length?o[0]:o}var l={add:a,remove:o,toggle:i};function s(t){var a=[t.target].concat(n(t.target)),o=["add","remove","toggle"];a.forEach(function(t){if(r(t,"[data-class-add],[data-class-remove],[data-class-toggle]")){var a={};o.forEach(function(o){var c=t.getAttribute("data-class-".concat(o));if(c&&c.length){var i=t.getAttribute("data-class-".concat(o,"-closest"))||t.getAttribute("data-class-closest"),l=t.getAttribute("data-class-".concat(o,"-parents"))||t.getAttribute("data-class-parents"),s=t.getAttribute("data-class-".concat(o,"-siblings"))||t.getAttribute("data-class-siblings"),f=t.getAttribute("data-class-".concat(o,"-target"))||t.getAttribute("data-class-target"),u=[];if(i){var g=function(t,e){for(var n=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector,r=null,a=t;a&&a!==document;){if(n.call(a,e)){r=a;break}a=a.parentNode}return r}(t,i);u=u.concat(g)}if(l){var d=n(t,l);u=u.concat(d)}if(s)e(t.parentNode.children).forEach(function(e){var n=e!==t,a=r(e,s);n&&a&&u.push(e)});if(f){var m=e(document.querySelectorAll(f));u=u.concat(m)}a[o]={target:u.length?u:t,classNames:c}}}),o.forEach(function(t){a[t]&&l[t](a[t].target,a[t].classNames)})}})}function f(t){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u={add:a,remove:o,toggle:i};return{add:a,attrs:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];n="boolean"==typeof t?t:n;var r=e(t="boolean"==typeof t?document:t),a=!1===t||!1===n?"removeEventListener":"addEventListener";return r.forEach(function(t){t[a]("click",s)}),{remove:function(){r.forEach(function(t){t.removeEventListener("click",s)})}}},listener:function(t){var a={target:e(t.target||document.body),event:t.event||"click",match:t.match||!0,change:t.change||!0,add:t.add||null,remove:t.remove||null,toggle:t.toggle||null};function o(t){!function(t,a){var o,c=a.match instanceof Function?a.match(t):a.match;if(!0===c)c=[t.target],o=t.target;else if("string"==typeof c){var i=r(t.target,c);o=i?t.target:n(t.target).filter(function(t){return r(t,c)})[0]||null,c=e(c)}else if("object"===f(c)){var l=t.target===c;c=e(c),o=l?t.target:c[c.indexOf(t.target)]||n(t.target).filter(function(t){return-1!==c.indexOf(t)})[0]||null}if(o){var s=c.indexOf(o),g=a.change instanceof Function?a.change(t,o,s):a.change;g=!0===g?[t.target]:e(g),["toggle","remove","add"].forEach(function(e){if(a[e]instanceof Function)g.forEach(function(n,r){var c=a[e](t,o,s,n,r);u[e](n,c)});else{var n=a[e];u[e](g,n)}})}}(t,a)}return a.target.forEach(function(t){t.addEventListener(a.event,o)}),{remove:function(){a.target.forEach(function(t){t.removeEventListener(a.event,o)})}}},remove:o,toggle:i}}); | ||
| !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).classChange=e()}(this,function(){"use strict";function t(t){return"string"==typeof t&&(t=t.trim().replace(/\s+/g," ").split(" ")),Array.isArray(t)&&(t=(t=t.map(function(t){return t&&t.length?t.trim():null})).filter(Boolean)),t}function e(t){return"string"==typeof t?t=Array.apply(null,document.querySelectorAll(t)):t instanceof window.HTMLCollection||t instanceof window.NodeList?t=Array.apply(null,t):t&&!Array.isArray(t)&&(t=[t]),Array.isArray(t)?t.filter(function(t,e,n){return n.indexOf(t)===e}):[]}function n(t,e){for(var n=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector,r=[],a=t.parentNode;a&&a!==document;)(!e||e&&n.call(a,e))&&r.push(a),a=a.parentNode;return r}function r(t,e){return(t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector).call(t,e)}function a(n,r){var a=e(n);return a.forEach(function(e,n){var a=t(r instanceof Function?r(e,n):r);if(a&&a.length){var o=e.className.length?e.className.split(" "):[],c=a.filter(function(t){return-1===o.indexOf(t)}),i=o.concat(c);e.className=i.join(" ")}}),1===a.length?a[0]:a}function o(n,r){var a=e(n);return a.forEach(function(e,n){var a=t(r instanceof Function?r(e,n):r);if(e.className.trim().length&&a&&a.length){var o=e.className.split(" ").filter(function(t){return-1===a.indexOf(t)});o.length?e.className=o.join(" "):e.removeAttribute("class")}}),1===a.length?a[0]:a}var c={add:a,remove:o};function i(n,r,a){if(!0===a)return c.add(n,r);if(!1===a)return c.remove(n,r);var o=e(n);return o.forEach(function(e,n){var a=t(r instanceof Function?r(e,n):r);if(a&&a.length){var o=e.className.length?e.className.split(" "):[],c=o.filter(function(t){return-1===a.indexOf(t)}),i=a.filter(function(t){return-1===o.indexOf(t)}),l=c.concat(i);e.className=l.join(" ")}}),1===o.length?o[0]:o}var l={add:a,remove:o,toggle:i};function s(t){var a=[t.target].concat(n(t.target)),o=["add","remove","toggle"];a.forEach(function(t){if(r(t,"[data-class-add],[data-class-remove],[data-class-toggle]")){var a={};o.forEach(function(o){var c=t.getAttribute("data-class-".concat(o));if(c&&c.length){var i=t.getAttribute("data-class-".concat(o,"-closest"))||t.getAttribute("data-class-closest"),l=t.getAttribute("data-class-".concat(o,"-parents"))||t.getAttribute("data-class-parents"),s=t.getAttribute("data-class-".concat(o,"-siblings"))||t.getAttribute("data-class-siblings"),f=t.getAttribute("data-class-".concat(o,"-target"))||t.getAttribute("data-class-target"),u=[];if(i){var g=function(t,e){for(var n=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector,r=null,a=t;a&&a!==document;){if(n.call(a,e)){r=a;break}a=a.parentNode}return r}(t,i);u=u.concat(g)}if(l){var d=n(t,l);u=u.concat(d)}if(s)e(t.parentNode.children).forEach(function(e){var n=e!==t,a=r(e,s);n&&a&&u.push(e)});if(f){var m=e(document.querySelectorAll(f));u=u.concat(m)}a[o]={target:u.length?u:t,classNames:c}}}),o.forEach(function(t){a[t]&&l[t](a[t].target,a[t].classNames)})}})}function f(t){return(f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var u={add:a,remove:o,toggle:i};return{add:a,attrs:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:document,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];n="boolean"==typeof t?t:n;var r=e(t="boolean"==typeof t?document:t),a=!1===t||!1===n?"removeEventListener":"addEventListener";return r.forEach(function(t){t[a]("click",s)}),{remove:function(){r.forEach(function(t){t.removeEventListener("click",s)})}}},listener:function(t){var a={target:e(t.target||document.body),event:t.event||"click",match:t.match||!0,change:t.change||!0,add:t.add||null,remove:t.remove||null,toggle:t.toggle||null};function o(t){!function(t,a){var o,c=a.match instanceof Function?a.match(t):a.match;if(!0===c)c=[t.target],o=t.target;else if("string"==typeof c){var i=r(t.target,c);o=i?t.target:n(t.target).filter(function(t){return r(t,c)})[0]||null,c=e(c)}else if("object"===f(c)){var l=t.target===c;c=e(c),o=l?t.target:c[c.indexOf(t.target)]||n(t.target).filter(function(t){return-1!==c.indexOf(t)})[0]||null}if(o){var s=c.indexOf(o),g=a.change instanceof Function?a.change(t,o,s):a.change;g=!0===g?[t.target]:e(g),["toggle","remove","add"].forEach(function(e){if(a[e]instanceof Function)g.forEach(function(n,r){var c=a[e](t,o,s,n,r);u[e](n,c)});else{var n=a[e];u[e](g,n)}})}}(t,a)}return a.target.forEach(function(t){t.addEventListener(a.event,o)}),{remove:function(){a.target.forEach(function(t){t.removeEventListener(a.event,o)})}}},remove:o,toggle:i}}); | ||
| //# sourceMappingURL=class-change.min.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"class-change.min.js","sources":["../src/util.js","../src/add.js","../src/remove.js","../src/toggle.js","../src/attrs.js","../src/listener.js","../src/index.js"],"sourcesContent":["// Exports\n// =============================================================================\n/**\n * Converts space-separates list of class names to an array (if necessary) then\n * trims each array item.\n *\n * @export\n * @param {(array|string)} classNames\n * @returns {array}\n */\nexport function classNamesToArray(classNames) {\n // String - Trim and convert to Array\n if (typeof classNames === 'string') {\n classNames = classNames.trim().replace(/\\s+/g, ' ').split(' ');\n }\n\n if (Array.isArray(classNames)) {\n // Trim items\n classNames = classNames.map(name => name && name.length ? name.trim() : null);\n\n // Filter out \"falsey\" values\n classNames = classNames.filter(Boolean);\n }\n\n return classNames;\n}\n\n/**\n * Converts a CSS selector (string), Element, HTMLCollection or NodeList to an\n * array (returns array as-is).\n * - Array: [Element, Element, ...]\n * - Element: document.body\n * - HTMLCollection: document.getElementsByTagName('p')\n * - NodeList: document.querySelectorAll('p')\n * - String (CSS selector): 'p'\n *\n * @export\n * @param {(array|element|htmlcollection|nodelist|string)} elements\n * @param {boolean} [removeDuplicates=true]\n * @returns {array}\n */\nexport function elementsToArray(elements) {\n // CSS Selector\n if (typeof elements === 'string') {\n elements = Array.apply(null, document.querySelectorAll(elements));\n }\n // HTMLCollection / NodeList\n else if (elements instanceof window.HTMLCollection || elements instanceof window.NodeList) {\n elements = Array.apply(null, elements);\n }\n // Node/Element (assumed)\n else if (elements && !Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (Array.isArray(elements)) {\n // Remove duplicate\n return elements.filter((value, index, self) => self.indexOf(value) === index);\n }\n else {\n return [];\n }\n}\n\n/**\n * Matches self or finds closest ancestor (excluding document) node that match a\n * CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getClosest(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n let matchedElm = null;\n let testElm = elm;\n\n while (testElm && testElm !== document) {\n if (matches.call(testElm, matchSelector)) {\n matchedElm = testElm;\n break;\n }\n\n testElm = testElm.parentNode;\n }\n\n return matchedElm;\n}\n\n/**\n * Finds all parent nodes (excluding document), optionally limited to only those\n * that match a CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getParents(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n const parentElms = [];\n\n let testElm = elm.parentNode;\n\n while (testElm && testElm !== document) {\n if (!matchSelector || matchSelector && matches.call(testElm, matchSelector)) {\n parentElms.push(testElm);\n }\n\n testElm = testElm.parentNode;\n }\n\n return parentElms;\n}\n\n/**\n * Cross-browser wrapper for native \"matches\" method\n *\n * @export\n * @param {element} elm\n * @param {string} selector\n * @returns {boolean}\n */\nexport function matchesSelector(elm, selector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n return matches.call(elm, selector);\n}\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Add class name(s) to target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to add class name(s) to\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction addClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = elmClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default addClass;\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Remove class name(s) from target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to remove class name(s) from\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction removeClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (elm.className.trim().length && classArray && classArray.length) {\n const elmClassArray = elm.className.split(' ');\n const finalClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n\n // Standardize result of setting empty \"class\" attribute.\n // Internet Explorer and Edge automatically remove the \"class\"\n // attribute when it is set to \"\". Other browsers (Chrome, Firefox,\n // Safari) will set the attribute to \"\". The difference in these\n // behaviors throws off unit tests, so the following code emulates\n // IE/Edge behavior of removing the attribute when the value is \"\".\n if (finalClassArray.length) {\n elm.className = finalClassArray.join(' ');\n }\n else {\n elm.removeAttribute('class');\n }\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default removeClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove };\n\n\n// Functions\n// =============================================================================\n/**\n * Toggle class name(s) on target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to toggle class name(s) on\n * @param {(array|function|string)} classNames - Array, space-separated list, or\n * function that returns array/string of class name(s)\n * @param {boolean} [forceTrueFalse] - Force add when true, remove when false\n * @returns {(array|element)} - Target(s)\n */\nfunction toggleClass(target, classNames, forceTrueFalse) {\n if (forceTrueFalse === true) {\n return classChange.add(target, classNames);\n }\n else if (forceTrueFalse === false) {\n return classChange.remove(target, classNames);\n }\n else {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const keepClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = keepClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default toggleClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport { elementsToArray, matchesSelector, getClosest, getParents } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds or removes click/tap event listener(s) on elements that have\n * data-class-* attributes and trigger associated method(s).\n *\n * @param {(array|element|htmlcollection|nodelist|string)} [listenerTarget=document]\n * @param {boolean} [addTrueRemoveFalse=true]\n */\nfunction addRemoveAttrListener(listenerTarget = document, addTrueRemoveFalse = true) {\n // Allow boolean for listenerTarget\n // true = add default listener, false = remove default listener\n addTrueRemoveFalse = typeof(listenerTarget) === 'boolean' ? listenerTarget : addTrueRemoveFalse;\n listenerTarget = typeof(listenerTarget) === 'boolean' ? document : listenerTarget;\n\n const elms = elementsToArray(listenerTarget);\n const method = listenerTarget === false || addTrueRemoveFalse === false ? 'removeEventListener' : 'addEventListener';\n\n elms.forEach(function(elm) {\n elm[method]('click', handleAttrEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n elms.forEach(function(elm) {\n elm.removeEventListener('click', handleAttrEvent);\n });\n }\n };\n}\n\n/**\n * Handles click/tap events triggered via data-class-* attributes.\n *\n * @param {object} evt\n */\nfunction handleAttrEvent(evt) {\n const elms = [evt.target].concat(getParents(evt.target));\n const matchSelector = '[data-class-add],[data-class-remove],[data-class-toggle]';\n const methods = ['add', 'remove', 'toggle'];\n\n elms.forEach(function(elm) {\n const hasAttr = matchesSelector(elm, matchSelector);\n\n if (hasAttr) {\n const changeTasks = {};\n\n methods.forEach(function(method) {\n const classNames = elm.getAttribute(`data-class-${method}`);\n\n if (classNames && classNames.length) {\n const closestAttr = elm.getAttribute(`data-class-${method}-closest`) || elm.getAttribute('data-class-closest');\n const parentsAttr = elm.getAttribute(`data-class-${method}-parents`) || elm.getAttribute('data-class-parents');\n const siblingsAttr = elm.getAttribute(`data-class-${method}-siblings`) || elm.getAttribute('data-class-siblings');\n const targetAttr = elm.getAttribute(`data-class-${method}-target`) || elm.getAttribute('data-class-target');\n\n let changeElms = [];\n\n if (closestAttr) {\n const elms = getClosest(elm, closestAttr);\n changeElms = changeElms.concat(elms);\n }\n if (parentsAttr) {\n const elms = getParents(elm, parentsAttr);\n changeElms = changeElms.concat(elms);\n }\n if (siblingsAttr) {\n const siblingElms = elementsToArray(elm.parentNode.children);\n\n siblingElms.forEach(function(siblingElm) {\n const isSibling = siblingElm !== elm;\n const isMatch = matchesSelector(siblingElm, siblingsAttr);\n\n if (isSibling && isMatch) {\n changeElms.push(siblingElm);\n }\n });\n }\n if (targetAttr) {\n const elms = elementsToArray(document.querySelectorAll(targetAttr));\n changeElms = changeElms.concat(elms);\n }\n\n changeTasks[method] = {\n target: changeElms.length ? changeElms : elm,\n classNames\n };\n }\n });\n\n methods.forEach(function(method) {\n if (changeTasks[method]) {\n classChange[method](changeTasks[method].target, changeTasks[method].classNames);\n }\n });\n }\n });\n}\n\n\n// Exports\n// =============================================================================\nexport default addRemoveAttrListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport * as util from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds classChange event listener(s) and returns a remove() method\n *\n * @param {object} options\n * @param {(array|element|htmlcollection|nodelist|string)} [options.target=document]\n * @param {string} [options.event=\"click\"]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.match=true]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.change=true]\n * @param {(array|function|string)} [options.add]\n * @param {(array|function|string)} [options.remove]\n * @param {(array|function|string)} [options.toggle]\n * @returns {object} Remove method\n */\nfunction addChangeListener(options) {\n const settings = {\n target: util.elementsToArray(options.target || document.body),\n event : options.event || 'click',\n match : options.match || true,\n change: options.change || true,\n add : options.add || null,\n remove: options.remove || null,\n toggle: options.toggle || null\n };\n\n function triggerChangeEvent(evt) {\n handleChangeEvent(evt, settings);\n }\n\n settings.target.forEach(function(target) {\n target.addEventListener(settings.event, triggerChangeEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n settings.target.forEach(function(target) {\n target.removeEventListener(settings.event, triggerChangeEvent);\n });\n }\n };\n}\n\n/**\n * Detects if an event matches the one defined in settings and changes class\n * names on elements accordingly\n *\n * @param {object} evt - Event object\n * @param {object} settings - Listener settings\n */\nfunction handleChangeEvent(evt, settings) {\n let matchElms = settings.match instanceof Function ? settings.match(evt) : settings.match;\n let matchedElm;\n\n // Match: Event target\n /* istanbul ignore else */\n if (matchElms === true) {\n matchElms = [evt.target];\n matchedElm = evt.target;\n }\n // Match: CSS selector\n else if (typeof matchElms === 'string') {\n const isMatch = util.matchesSelector(evt.target, matchElms);\n\n matchedElm = isMatch ? evt.target : util.getParents(evt.target).filter(elm => util.matchesSelector(elm, matchElms))[0] || null;\n matchElms = util.elementsToArray(matchElms);\n }\n // Match: Array, Element, HTMLCollection, NodeList\n else if (typeof matchElms === 'object') {\n const isMatch = evt.target === matchElms;\n\n matchElms = util.elementsToArray(matchElms);\n matchedElm = isMatch ? evt.target : matchElms[matchElms.indexOf(evt.target)] || util.getParents(evt.target).filter(elm => matchElms.indexOf(elm) !== -1)[0] || null;\n }\n\n // Change\n if (matchedElm) {\n const matchedElmIndex = matchElms.indexOf(matchedElm);\n let changeElms = settings.change instanceof Function ? settings.change(evt, matchedElm, matchedElmIndex) : settings.change;\n\n changeElms = changeElms === true ? [evt.target] : util.elementsToArray(changeElms);\n\n ['toggle', 'remove', 'add'].forEach(changeType => {\n // If settings value is a function, call for each element with args\n if (settings[changeType] instanceof Function) {\n changeElms.forEach((changeElm, changeElmIndex) => {\n const classNames = settings[changeType](evt, matchedElm, matchedElmIndex, changeElm, changeElmIndex);\n\n classChange[changeType](changeElm, classNames);\n });\n }\n else {\n const classNames = settings[changeType];\n\n classChange[changeType](changeElms, classNames);\n }\n });\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default addChangeListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport attrs from './attrs.js';\nimport listener from './listener.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\n\n\n// Exports\n// =============================================================================\nexport default { add, attrs, listener, remove, toggle };\n"],"names":["classNamesToArray","classNames","trim","replace","split","Array","isArray","map","name","length","filter","Boolean","elementsToArray","elements","apply","document","querySelectorAll","window","HTMLCollection","NodeList","value","index","self","indexOf","getParents","elm","matchSelector","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","parentElms","testElm","parentNode","call","push","selector","addClass","target","elms","forEach","i","classArray","Function","elmClassArray","className","newClassArray","finalClassArray","concat","join","removeClass","removeAttribute","classChange","add","remove","toggleClass","forceTrueFalse","keepClassArray","toggle","handleAttrEvent","evt","methods","changeTasks","method","getAttribute","closestAttr","parentsAttr","siblingsAttr","targetAttr","changeElms","matchedElm","getClosest","children","siblingElm","isSibling","isMatch","attrs","listenerTarget","addTrueRemoveFalse","removeEventListener","listener","options","settings","util","body","event","match","change","triggerChangeEvent","matchElms","_typeof","matchedElmIndex","changeType","changeElm","changeElmIndex","handleChangeEvent","addEventListener"],"mappings":"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"} | ||
| {"version":3,"file":"class-change.min.js","sources":["../src/util.js","../src/add.js","../src/remove.js","../src/toggle.js","../src/attrs.js","../src/listener.js","../src/index.js"],"sourcesContent":["// Exports\n// =============================================================================\n/**\n * Converts space-separates list of class names to an array (if necessary) then\n * trims each array item.\n *\n * @export\n * @param {(array|string)} classNames\n * @returns {array}\n */\nexport function classNamesToArray(classNames) {\n // String - Trim and convert to Array\n if (typeof classNames === 'string') {\n classNames = classNames.trim().replace(/\\s+/g, ' ').split(' ');\n }\n\n if (Array.isArray(classNames)) {\n // Trim items\n classNames = classNames.map(name => name && name.length ? name.trim() : null);\n\n // Filter out \"falsey\" values\n classNames = classNames.filter(Boolean);\n }\n\n return classNames;\n}\n\n/**\n * Converts a CSS selector (string), Element, HTMLCollection or NodeList to an\n * array (returns array as-is).\n * - Array: [Element, Element, ...]\n * - Element: document.body\n * - HTMLCollection: document.getElementsByTagName('p')\n * - NodeList: document.querySelectorAll('p')\n * - String (CSS selector): 'p'\n *\n * @export\n * @param {(array|element|htmlcollection|nodelist|string)} elements\n * @param {boolean} [removeDuplicates=true]\n * @returns {array}\n */\nexport function elementsToArray(elements) {\n // CSS Selector\n if (typeof elements === 'string') {\n elements = Array.apply(null, document.querySelectorAll(elements));\n }\n // HTMLCollection / NodeList\n else if (elements instanceof window.HTMLCollection || elements instanceof window.NodeList) {\n elements = Array.apply(null, elements);\n }\n // Node/Element (assumed)\n else if (elements && !Array.isArray(elements)) {\n elements = [elements];\n }\n\n if (Array.isArray(elements)) {\n // Remove duplicate\n return elements.filter((value, index, self) => self.indexOf(value) === index);\n }\n else {\n return [];\n }\n}\n\n/**\n * Matches self or finds closest ancestor (excluding document) node that match a\n * CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getClosest(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n let matchedElm = null;\n let testElm = elm;\n\n while (testElm && testElm !== document) {\n if (matches.call(testElm, matchSelector)) {\n matchedElm = testElm;\n break;\n }\n\n testElm = testElm.parentNode;\n }\n\n return matchedElm;\n}\n\n/**\n * Finds all parent nodes (excluding document), optionally limited to only those\n * that match a CSS selector\n *\n * @export\n * @param {element} elm\n * @param {sting} matchSelector\n * @returns {array}\n */\nexport function getParents(elm, matchSelector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n const parentElms = [];\n\n let testElm = elm.parentNode;\n\n while (testElm && testElm !== document) {\n if (!matchSelector || matchSelector && matches.call(testElm, matchSelector)) {\n parentElms.push(testElm);\n }\n\n testElm = testElm.parentNode;\n }\n\n return parentElms;\n}\n\n/**\n * Cross-browser wrapper for native \"matches\" method\n *\n * @export\n * @param {element} elm\n * @param {string} selector\n * @returns {boolean}\n */\nexport function matchesSelector(elm, selector) {\n /* istanbul ignore next */\n const matches = elm.matches || elm.matchesSelector || elm.webkitMatchesSelector || elm.mozMatchesSelector || elm.msMatchesSelector || elm.oMatchesSelector;\n\n return matches.call(elm, selector);\n}\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Add class name(s) to target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to add class name(s) to\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction addClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = elmClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default addClass;\n","// Modules\n// =============================================================================\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Functions\n// =============================================================================\n/**\n * Remove class name(s) from target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to remove class name(s) from\n * @param {(array|function|string)} classNames - Array, space-separated list,\n * or function that returns array/string of class name(s)\n * @returns {(array|element)} - Target(s)\n */\nfunction removeClass(target, classNames) {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (elm.className.trim().length && classArray && classArray.length) {\n const elmClassArray = elm.className.split(' ');\n const finalClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n\n // Standardize result of setting empty \"class\" attribute.\n // Internet Explorer and Edge automatically remove the \"class\"\n // attribute when it is set to \"\". Other browsers (Chrome, Firefox,\n // Safari) will set the attribute to \"\". The difference in these\n // behaviors throws off unit tests, so the following code emulates\n // IE/Edge behavior of removing the attribute when the value is \"\".\n if (finalClassArray.length) {\n elm.className = finalClassArray.join(' ');\n }\n else {\n elm.removeAttribute('class');\n }\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n}\n\n\n// Exports\n// =============================================================================\nexport default removeClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport { elementsToArray, classNamesToArray } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove };\n\n\n// Functions\n// =============================================================================\n/**\n * Toggle class name(s) on target element(s)\n *\n * @param {(array|element|htmlcollection|nodelist|string)} target -\n * Element(s) to toggle class name(s) on\n * @param {(array|function|string)} classNames - Array, space-separated list, or\n * function that returns array/string of class name(s)\n * @param {boolean} [forceTrueFalse] - Force add when true, remove when false\n * @returns {(array|element)} - Target(s)\n */\nfunction toggleClass(target, classNames, forceTrueFalse) {\n if (forceTrueFalse === true) {\n return classChange.add(target, classNames);\n }\n else if (forceTrueFalse === false) {\n return classChange.remove(target, classNames);\n }\n else {\n const elms = elementsToArray(target);\n\n elms.forEach(function(elm, i) {\n const classArray = classNamesToArray(classNames instanceof Function ? classNames(elm, i) : classNames);\n\n if (classArray && classArray.length) {\n const elmClassArray = elm.className.length ? elm.className.split(' ') : [];\n const keepClassArray = elmClassArray.filter(className => classArray.indexOf(className) === -1);\n const newClassArray = classArray.filter(className => elmClassArray.indexOf(className) === -1);\n const finalClassArray = keepClassArray.concat(newClassArray);\n\n elm.className = finalClassArray.join(' ');\n }\n });\n\n return elms.length === 1 ? elms[0] : elms;\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default toggleClass;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport { elementsToArray, matchesSelector, getClosest, getParents } from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds or removes click/tap event listener(s) on elements that have\n * data-class-* attributes and trigger associated method(s).\n *\n * @param {(array|element|htmlcollection|nodelist|string)} [listenerTarget=document]\n * @param {boolean} [addTrueRemoveFalse=true]\n */\nfunction addRemoveAttrListener(listenerTarget = document, addTrueRemoveFalse = true) {\n // Allow boolean for listenerTarget\n // true = add default listener, false = remove default listener\n addTrueRemoveFalse = typeof(listenerTarget) === 'boolean' ? listenerTarget : addTrueRemoveFalse;\n listenerTarget = typeof(listenerTarget) === 'boolean' ? document : listenerTarget;\n\n const elms = elementsToArray(listenerTarget);\n const method = listenerTarget === false || addTrueRemoveFalse === false ? 'removeEventListener' : 'addEventListener';\n\n elms.forEach(function(elm) {\n elm[method]('click', handleAttrEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n elms.forEach(function(elm) {\n elm.removeEventListener('click', handleAttrEvent);\n });\n }\n };\n}\n\n/**\n * Handles click/tap events triggered via data-class-* attributes.\n *\n * @param {object} evt\n */\nfunction handleAttrEvent(evt) {\n const elms = [evt.target].concat(getParents(evt.target));\n const matchSelector = '[data-class-add],[data-class-remove],[data-class-toggle]';\n const methods = ['add', 'remove', 'toggle'];\n\n elms.forEach(function(elm) {\n const hasAttr = matchesSelector(elm, matchSelector);\n\n if (hasAttr) {\n const changeTasks = {};\n\n methods.forEach(function(method) {\n const classNames = elm.getAttribute(`data-class-${method}`);\n\n if (classNames && classNames.length) {\n const closestAttr = elm.getAttribute(`data-class-${method}-closest`) || elm.getAttribute('data-class-closest');\n const parentsAttr = elm.getAttribute(`data-class-${method}-parents`) || elm.getAttribute('data-class-parents');\n const siblingsAttr = elm.getAttribute(`data-class-${method}-siblings`) || elm.getAttribute('data-class-siblings');\n const targetAttr = elm.getAttribute(`data-class-${method}-target`) || elm.getAttribute('data-class-target');\n\n let changeElms = [];\n\n if (closestAttr) {\n const elms = getClosest(elm, closestAttr);\n changeElms = changeElms.concat(elms);\n }\n if (parentsAttr) {\n const elms = getParents(elm, parentsAttr);\n changeElms = changeElms.concat(elms);\n }\n if (siblingsAttr) {\n const siblingElms = elementsToArray(elm.parentNode.children);\n\n siblingElms.forEach(function(siblingElm) {\n const isSibling = siblingElm !== elm;\n const isMatch = matchesSelector(siblingElm, siblingsAttr);\n\n if (isSibling && isMatch) {\n changeElms.push(siblingElm);\n }\n });\n }\n if (targetAttr) {\n const elms = elementsToArray(document.querySelectorAll(targetAttr));\n changeElms = changeElms.concat(elms);\n }\n\n changeTasks[method] = {\n target: changeElms.length ? changeElms : elm,\n classNames\n };\n }\n });\n\n methods.forEach(function(method) {\n if (changeTasks[method]) {\n classChange[method](changeTasks[method].target, changeTasks[method].classNames);\n }\n });\n }\n });\n}\n\n\n// Exports\n// =============================================================================\nexport default addRemoveAttrListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\nimport * as util from './util.js';\n\n\n// Variables\n// =============================================================================\nconst classChange = { add, remove, toggle };\n\n\n// Functions\n// =============================================================================\n/**\n * Adds classChange event listener(s) and returns a remove() method\n *\n * @param {object} options\n * @param {(array|element|htmlcollection|nodelist|string)} [options.target=document]\n * @param {string} [options.event=\"click\"]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.match=true]\n * @param {(array|boolean|element|function|htmlcollection|nodelist|string)} [options.change=true]\n * @param {(array|function|string)} [options.add]\n * @param {(array|function|string)} [options.remove]\n * @param {(array|function|string)} [options.toggle]\n * @returns {object} Remove method\n */\nfunction addChangeListener(options) {\n const settings = {\n target: util.elementsToArray(options.target || document.body),\n event : options.event || 'click',\n match : options.match || true,\n change: options.change || true,\n add : options.add || null,\n remove: options.remove || null,\n toggle: options.toggle || null\n };\n\n function triggerChangeEvent(evt) {\n handleChangeEvent(evt, settings);\n }\n\n settings.target.forEach(function(target) {\n target.addEventListener(settings.event, triggerChangeEvent);\n });\n\n // Return object containing remove method\n return {\n remove() {\n settings.target.forEach(function(target) {\n target.removeEventListener(settings.event, triggerChangeEvent);\n });\n }\n };\n}\n\n/**\n * Detects if an event matches the one defined in settings and changes class\n * names on elements accordingly\n *\n * @param {object} evt - Event object\n * @param {object} settings - Listener settings\n */\nfunction handleChangeEvent(evt, settings) {\n let matchElms = settings.match instanceof Function ? settings.match(evt) : settings.match;\n let matchedElm;\n\n // Match: Event target\n /* istanbul ignore else */\n if (matchElms === true) {\n matchElms = [evt.target];\n matchedElm = evt.target;\n }\n // Match: CSS selector\n else if (typeof matchElms === 'string') {\n const isMatch = util.matchesSelector(evt.target, matchElms);\n\n matchedElm = isMatch ? evt.target : util.getParents(evt.target).filter(elm => util.matchesSelector(elm, matchElms))[0] || null;\n matchElms = util.elementsToArray(matchElms);\n }\n // Match: Array, Element, HTMLCollection, NodeList\n else if (typeof matchElms === 'object') {\n const isMatch = evt.target === matchElms;\n\n matchElms = util.elementsToArray(matchElms);\n matchedElm = isMatch ? evt.target : matchElms[matchElms.indexOf(evt.target)] || util.getParents(evt.target).filter(elm => matchElms.indexOf(elm) !== -1)[0] || null;\n }\n\n // Change\n if (matchedElm) {\n const matchedElmIndex = matchElms.indexOf(matchedElm);\n let changeElms = settings.change instanceof Function ? settings.change(evt, matchedElm, matchedElmIndex) : settings.change;\n\n changeElms = changeElms === true ? [evt.target] : util.elementsToArray(changeElms);\n\n ['toggle', 'remove', 'add'].forEach(changeType => {\n // If settings value is a function, call for each element with args\n if (settings[changeType] instanceof Function) {\n changeElms.forEach((changeElm, changeElmIndex) => {\n const classNames = settings[changeType](evt, matchedElm, matchedElmIndex, changeElm, changeElmIndex);\n\n classChange[changeType](changeElm, classNames);\n });\n }\n else {\n const classNames = settings[changeType];\n\n classChange[changeType](changeElms, classNames);\n }\n });\n }\n}\n\n\n// Exports\n// =============================================================================\nexport default addChangeListener;\n","// Modules\n// =============================================================================\nimport add from './add.js';\nimport attrs from './attrs.js';\nimport listener from './listener.js';\nimport remove from './remove.js';\nimport toggle from './toggle.js';\n\n\n// Exports\n// =============================================================================\nexport default { add, attrs, listener, remove, toggle };\n"],"names":["classNamesToArray","classNames","trim","replace","split","Array","isArray","map","name","length","filter","Boolean","elementsToArray","elements","apply","document","querySelectorAll","window","HTMLCollection","NodeList","value","index","self","indexOf","getParents","elm","matchSelector","matches","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","parentElms","testElm","parentNode","call","push","selector","addClass","target","elms","forEach","i","classArray","Function","elmClassArray","className","newClassArray","finalClassArray","concat","join","removeClass","removeAttribute","classChange","add","remove","toggleClass","forceTrueFalse","keepClassArray","toggle","handleAttrEvent","evt","methods","changeTasks","method","getAttribute","closestAttr","parentsAttr","siblingsAttr","targetAttr","changeElms","matchedElm","getClosest","children","siblingElm","isSibling","isMatch","attrs","listenerTarget","addTrueRemoveFalse","removeEventListener","listener","options","settings","util","body","event","match","change","triggerChangeEvent","matchElms","_typeof","matchedElmIndex","changeType","changeElm","changeElmIndex","handleChangeEvent","addEventListener"],"mappings":";;;;;;;iMAUO,SAASA,EAAkBC,SAEJ,iBAAfA,IACPA,EAAaA,EAAWC,OAAOC,QAAQ,OAAQ,KAAKC,MAAM,MAG1DC,MAAMC,QAAQL,KAKdA,GAHAA,EAAaA,EAAWM,IAAI,SAAAC,UAAQA,GAAQA,EAAKC,OAASD,EAAKN,OAAS,QAGhDQ,OAAOC,UAG5BV,EAiBJ,SAASW,EAAgBC,SAEJ,iBAAbA,EACPA,EAAWR,MAAMS,MAAM,KAAMC,SAASC,iBAAiBH,IAGlDA,aAAoBI,OAAOC,gBAAkBL,aAAoBI,OAAOE,SAC7EN,EAAWR,MAAMS,MAAM,KAAMD,GAGxBA,IAAaR,MAAMC,QAAQO,KAChCA,EAAW,CAACA,IAGZR,MAAMC,QAAQO,GAEPA,EAASH,OAAO,SAACU,EAAOC,EAAOC,UAASA,EAAKC,QAAQH,KAAWC,IAGhE,GAyCR,SAASG,EAAWC,EAAKC,WAEtBC,EAAaF,EAAIE,SAAWF,EAAIG,iBAAmBH,EAAII,uBAAyBJ,EAAIK,oBAAsBL,EAAIM,mBAAqBN,EAAIO,iBACvIC,EAAa,GAEfC,EAAUT,EAAIU,WAEXD,GAAWA,IAAYnB,YACrBW,GAAiBA,GAAiBC,EAAQS,KAAKF,EAASR,KACzDO,EAAWI,KAAKH,GAGpBA,EAAUA,EAAQC,kBAGfF,EAWJ,SAASL,EAAgBH,EAAKa,UAEjBb,EAAIE,SAAWF,EAAIG,iBAAmBH,EAAII,uBAAyBJ,EAAIK,oBAAsBL,EAAIM,mBAAqBN,EAAIO,kBAE3HI,KAAKX,EAAKa,GCnH7B,SAASC,EAASC,EAAQvC,OAChBwC,EAAO7B,EAAgB4B,UAE7BC,EAAKC,QAAQ,SAASjB,EAAKkB,OACjBC,EAAa5C,EAAkBC,aAAsB4C,SAAW5C,EAAWwB,EAAKkB,GAAK1C,MAEvF2C,GAAcA,EAAWnC,OAAQ,KAC3BqC,EAAkBrB,EAAIsB,UAAUtC,OAASgB,EAAIsB,UAAU3C,MAAM,KAAO,GACpE4C,EAAkBJ,EAAWlC,OAAO,SAAAqC,UAAmD,IAAtCD,EAAcvB,QAAQwB,KACvEE,EAAkBH,EAAcI,OAAOF,GAE7CvB,EAAIsB,UAAYE,EAAgBE,KAAK,QAItB,IAAhBV,EAAKhC,OAAegC,EAAK,GAAKA,ECfzC,SAASW,EAAYZ,EAAQvC,OACnBwC,EAAO7B,EAAgB4B,UAE7BC,EAAKC,QAAQ,SAASjB,EAAKkB,OACjBC,EAAa5C,EAAkBC,aAAsB4C,SAAW5C,EAAWwB,EAAKkB,GAAK1C,MAEvFwB,EAAIsB,UAAU7C,OAAOO,QAAUmC,GAAcA,EAAWnC,OAAQ,KAE1DwC,EADkBxB,EAAIsB,UAAU3C,MAAM,KACNM,OAAO,SAAAqC,UAAgD,IAAnCH,EAAWrB,QAAQwB,KAQzEE,EAAgBxC,OAChBgB,EAAIsB,UAAYE,EAAgBE,KAAK,KAGrC1B,EAAI4B,gBAAgB,YAKT,IAAhBZ,EAAKhC,OAAegC,EAAK,GAAKA,EChCzC,IAAMa,EAAc,CAAEC,IAAAA,EAAKC,OAAAA,GAe3B,SAASC,EAAYjB,EAAQvC,EAAYyD,OACd,IAAnBA,SACOJ,EAAYC,IAAIf,EAAQvC,GAE9B,IAAuB,IAAnByD,SACEJ,EAAYE,OAAOhB,EAAQvC,OAG5BwC,EAAO7B,EAAgB4B,UAE7BC,EAAKC,QAAQ,SAASjB,EAAKkB,OACjBC,EAAa5C,EAAkBC,aAAsB4C,SAAW5C,EAAWwB,EAAKkB,GAAK1C,MAEvF2C,GAAcA,EAAWnC,OAAQ,KAC3BqC,EAAkBrB,EAAIsB,UAAUtC,OAASgB,EAAIsB,UAAU3C,MAAM,KAAO,GACpEuD,EAAkBb,EAAcpC,OAAO,SAAAqC,UAAgD,IAAnCH,EAAWrB,QAAQwB,KACvEC,EAAkBJ,EAAWlC,OAAO,SAAAqC,UAAmD,IAAtCD,EAAcvB,QAAQwB,KACvEE,EAAkBU,EAAeT,OAAOF,GAE9CvB,EAAIsB,UAAYE,EAAgBE,KAAK,QAItB,IAAhBV,EAAKhC,OAAegC,EAAK,GAAKA,ECrC7C,IAAMa,EAAc,CAAEC,IAAAA,EAAKC,OAAAA,EAAQI,OAAAA,GAwCnC,SAASC,EAAgBC,OACfrB,EAAgB,CAACqB,EAAItB,QAAQU,OAAO1B,EAAWsC,EAAItB,SAEnDuB,EAAgB,CAAC,MAAO,SAAU,UAExCtB,EAAKC,QAAQ,SAASjB,MACFG,EAAgBH,EAJd,4DAML,KACHuC,EAAc,GAEpBD,EAAQrB,QAAQ,SAASuB,OACfhE,EAAawB,EAAIyC,kCAA2BD,OAE9ChE,GAAcA,EAAWQ,OAAQ,KAC3B0D,EAAe1C,EAAIyC,kCAA2BD,gBAAqBxC,EAAIyC,aAAa,sBACpFE,EAAe3C,EAAIyC,kCAA2BD,gBAAqBxC,EAAIyC,aAAa,sBACpFG,EAAe5C,EAAIyC,kCAA2BD,iBAAsBxC,EAAIyC,aAAa,uBACrFI,EAAe7C,EAAIyC,kCAA2BD,eAAoBxC,EAAIyC,aAAa,qBAErFK,EAAa,MAEbJ,EAAa,KACP1B,EJAvB,SAAoBhB,EAAKC,WAEtBC,EAAUF,EAAIE,SAAWF,EAAIG,iBAAmBH,EAAII,uBAAyBJ,EAAIK,oBAAsBL,EAAIM,mBAAqBN,EAAIO,iBAEtIwC,EAAa,KACbtC,EAAaT,EAEVS,GAAWA,IAAYnB,UAAU,IAChCY,EAAQS,KAAKF,EAASR,GAAgB,CACtC8C,EAAatC,QAIjBA,EAAUA,EAAQC,kBAGfqC,EIhB0BC,CAAWhD,EAAK0C,GAC7BI,EAAaA,EAAWrB,OAAOT,MAE/B2B,EAAa,KACP3B,EAAOjB,EAAWC,EAAK2C,GAC7BG,EAAaA,EAAWrB,OAAOT,MAE/B4B,EACoBzD,EAAgBa,EAAIU,WAAWuC,UAEvChC,QAAQ,SAASiC,OACnBC,EAAYD,IAAelD,EAC3BoD,EAAYjD,EAAgB+C,EAAYN,GAE1CO,GAAaC,GACbN,EAAWlC,KAAKsC,QAIxBL,EAAY,KACN7B,EAAO7B,EAAgBG,SAASC,iBAAiBsD,IACvDC,EAAaA,EAAWrB,OAAOT,GAGnCuB,EAAYC,GAAU,CAClBzB,OAAQ+B,EAAW9D,OAAS8D,EAAa9C,EACzCxB,WAAAA,MAKZ8D,EAAQrB,QAAQ,SAASuB,GACjBD,EAAYC,IACZX,EAAYW,GAAQD,EAAYC,GAAQzB,OAAQwB,EAAYC,GAAQhE,sPChGxF,IAAMqD,EAAc,CAAEC,IAAAA,EAAKC,OAAAA,EAAQI,OAAAA,SCCpB,CAAEL,IAAAA,EAAKuB,MFWtB,eAA+BC,yDAAiBhE,SAAUiE,6DAGtDA,EAAgD,kBAApBD,EAAgCA,EAAiBC,MAGvEvC,EAAS7B,EAFfmE,EAA4C,kBAApBA,EAAgChE,SAAWgE,GAG7Dd,GAA4B,IAAnBc,IAAmD,IAAvBC,EAA+B,sBAAwB,0BAElGvC,EAAKC,QAAQ,SAASjB,GAClBA,EAAIwC,GAAQ,QAASJ,KAIlB,CACHL,kBACIf,EAAKC,QAAQ,SAASjB,GAClBA,EAAIwD,oBAAoB,QAASpB,QE5BpBqB,SDiB7B,SAA2BC,OACjBC,EAAW,CACb5C,OAAQ6C,EAAqBF,EAAQ3C,QAAUzB,SAASuE,MACxDC,MAAQJ,EAAQI,OAAU,QAC1BC,MAAQL,EAAQK,QAAU,EAC1BC,OAAQN,EAAQM,SAAU,EAC1BlC,IAAQ4B,EAAQ5B,KAAU,KAC1BC,OAAQ2B,EAAQ3B,QAAU,KAC1BI,OAAQuB,EAAQvB,QAAU,eAGrB8B,EAAmB5B,IAyBhC,SAA2BA,EAAKsB,OAExBZ,EADAmB,EAAYP,EAASI,iBAAiB3C,SAAWuC,EAASI,MAAM1B,GAAOsB,EAASI,UAKlE,IAAdG,EACAA,EAAa,CAAC7B,EAAItB,QAClBgC,EAAaV,EAAItB,YAGhB,GAAyB,iBAAdmD,EAAwB,KAC9Bd,EAAUQ,EAAqBvB,EAAItB,OAAQmD,GAEjDnB,EAAaK,EAAUf,EAAItB,OAAS6C,EAAgBvB,EAAItB,QAAQ9B,OAAO,SAAAe,UAAO4D,EAAqB5D,EAAKkE,KAAY,IAAM,KAC1HA,EAAaN,EAAqBM,QAGjC,GAAyB,WAArBC,EAAOD,GAAwB,KAC9Bd,EAAUf,EAAItB,SAAWmD,EAE/BA,EAAaN,EAAqBM,GAClCnB,EAAaK,EAAUf,EAAItB,OAASmD,EAAUA,EAAUpE,QAAQuC,EAAItB,UAAY6C,EAAgBvB,EAAItB,QAAQ9B,OAAO,SAAAe,UAAmC,IAA5BkE,EAAUpE,QAAQE,KAAa,IAAM,QAI/J+C,EAAY,KACNqB,EAAkBF,EAAUpE,QAAQiD,GACpCD,EAAkBa,EAASK,kBAAkB5C,SAAWuC,EAASK,OAAO3B,EAAKU,EAAYqB,GAAmBT,EAASK,OAE3HlB,GAA4B,IAAfA,EAAsB,CAACT,EAAItB,QAAU6C,EAAqBd,IAEtE,SAAU,SAAU,OAAO7B,QAAQ,SAAAoD,MAE5BV,EAASU,aAAuBjD,SAChC0B,EAAW7B,QAAQ,SAACqD,EAAWC,OACrB/F,EAAamF,EAASU,GAAYhC,EAAKU,EAAYqB,EAAiBE,EAAWC,GAErF1C,EAAYwC,GAAYC,EAAW9F,SAGtC,KACKA,EAAamF,EAASU,GAE5BxC,EAAYwC,GAAYvB,EAAYtE,OApE5CgG,CAAkBnC,EAAKsB,UAG3BA,EAAS5C,OAAOE,QAAQ,SAASF,GAC7BA,EAAO0D,iBAAiBd,EAASG,MAAOG,KAIrC,CACHlC,kBACI4B,EAAS5C,OAAOE,QAAQ,SAASF,GAC7BA,EAAOyC,oBAAoBG,EAASG,MAAOG,QCxCpBlC,OAAAA,EAAQI,OAAAA"} |
+15
-10
@@ -11,3 +11,3 @@ <!DOCTYPE html> | ||
| <link rel="stylesheet" href="https://unpkg.com/docsify-themeable/dist/css/theme-simple.css"> | ||
| <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsify-themeable/dist/css/theme-simple.css"> | ||
| <style> | ||
@@ -23,3 +23,8 @@ iframe[src*="buttons.github.io"] { | ||
| <script src="https://browser.sentry-cdn.com/4.4.2/bundle.min.js" crossorigin="anonymous"></script> | ||
| <script> | ||
| // Sentry.io | ||
| Sentry.init({ dsn: 'https://b783a168ac7049c4925ee9ff1aad4e87@sentry.io/1367215' }); | ||
| // Docsify | ||
| window.$docsify = { | ||
@@ -36,3 +41,3 @@ // GENERAL | ||
| alias: { | ||
| '.*?/changelog': 'https://unpkg.com/class-change/CHANGELOG.md', | ||
| '.*?/changelog': 'https://cdn.jsdelivr.net/npm/class-change/CHANGELOG.md', | ||
| }, | ||
@@ -54,11 +59,11 @@ auto2top : true, | ||
| </script> | ||
| <script src="https://unpkg.com/docsify"></script> | ||
| <script src="https://unpkg.com/docsify-themeable"></script> | ||
| <script src="https://unpkg.com/docsify-copy-code"></script> | ||
| <script src="https://unpkg.com/docsify-pagination/dist/docsify-pagination.min.js"></script> | ||
| <script src="https://unpkg.com/docsify/lib/plugins/external-script.min.js"></script> | ||
| <script src="https://unpkg.com/docsify/lib/plugins/ga.min.js"></script> | ||
| <script src="https://unpkg.com/docsify/lib/plugins/search.js"></script> | ||
| <script src="https://unpkg.com/prismjs/components/prism-bash.min.js"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify@4"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify-themeable@0"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify-copy-code@2"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify-pagination@2/dist/docsify-pagination.min.js"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify@4/lib/plugins/external-script.min.js"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify@4/lib/plugins/ga.min.js"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/docsify@4/lib/plugins/search.js"></script> | ||
| <script src="https://cdn.jsdelivr.net/npm/prismjs@1/components/prism-bash.min.js"></script> | ||
| </body> | ||
| </html> |
+8
-14
@@ -17,3 +17,3 @@ # class-change.js | ||
| Yet the native methods for manipulating CSS class names remain rudimentary. [Element.classList](https://developer.mozilla.org/en/DOM/element.classList) provides a basic API for working with classes, but [some browsers](http://caniuse.com/#feat=classlist) suffer from an incomplete implementation (or lack support entirely), changes can only be applied to a single element, and separate event listeners must be created for each change event. The result is often polyfills or patches for legacy browsers, manual loops for applying changes to multiple elements, repeated boilerplate code for handling delegated events, and performance issues caused by a high volume of event listeners. | ||
| Yet the native methods for manipulating CSS class names remain rudimentary given how often we need them. [Element.classList](https://developer.mozilla.org/en/DOM/element.classList) provides a basic API for working with classes, but [some browsers](http://caniuse.com/#feat=classlist) suffer from an incomplete implementation (or lack support entirely), changes can only be applied to a single element, and separate event listeners must be created for each change event. The result is often polyfills or patches for legacy browsers, manual loops for applying changes to multiple elements, repeated boilerplate code for handling delegated events, and performance issues caused by a high volume of event listeners. | ||
@@ -47,19 +47,13 @@ This micro-library aims to address these issues by reducing and simplifying the code required for CSS class changes and events. | ||
| Bower: | ||
| CDN ([jsdelivr.com](https://www.jsdelivr.com/) shown, also on [unpkg.com](https://unpkg.com/)): | ||
| ```bash | ||
| bower install class-change | ||
| ``` | ||
| CDN ([unpkg.com](https://unpkg.com/) shown, also on [jsdelivr.com](https://www.jsdelivr.com/package/npm/class-change)): | ||
| ```html | ||
| <!-- ES5 in file.html (latest v1.x.x) --> | ||
| <script src="https://unpkg.com/class-change@1"></script> | ||
| <!-- ES5 (latest v1.x.x) --> | ||
| <script src="https://cdn.jsdelivr.net/npm/class-change@1"></script> | ||
| ``` | ||
| ```html | ||
| <!-- ES6 module in file.html (latest v1.x.x) --> | ||
| <!-- ES6 module (latest v1.x.x) --> | ||
| <script type="module"> | ||
| import classChange from 'https://unpkg.com/class-change@1/dist/class-change.esm.min.js'; | ||
| import classChange from 'https://cdn.jsdelivr.net/npm/class-change@1/dist/class-change.esm.min.js'; | ||
| // ... | ||
@@ -598,3 +592,3 @@ </script> | ||
| - Follow [@jhildenbiddle](https://twitter.com/jhildenbiddle) for announcements | ||
| - Add a [star on GitHub](https://github.com/jhildenbiddle/class-change) or [tweet](https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fjhildenbiddle%2Fclass-change&via=jhildenbiddle&hashtags=css,developers,frontend,javascript) to support the project! | ||
| - Add a ⭐️ [star on GitHub](https://github.com/jhildenbiddle/class-change) or ❤️ [tweet](https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fjhildenbiddle%2Fclass-change&via=jhildenbiddle&hashtags=css,developers,frontend,javascript) to support the project! | ||
@@ -605,3 +599,3 @@ ## License | ||
| Copyright (c) 2016 John Hildenbiddle ([@jhildenbiddle](https://twitter.com/jhildenbiddle)) | ||
| Copyright (c) John Hildenbiddle ([@jhildenbiddle](https://twitter.com/jhildenbiddle)) | ||
@@ -608,0 +602,0 @@ <!-- GitHub Buttons --> |
+113
-110
@@ -10,47 +10,43 @@ // Dependencies | ||
| const files = { | ||
| serve: './tests/fixtures/**/*.*', | ||
| test : './tests/*.test.js' | ||
| test: './tests/**/*.test.js' | ||
| }; | ||
| // Local config | ||
| // Settings | ||
| // ============================================================================= | ||
| const localConfig = { | ||
| // Add browsers via Karma launchers | ||
| // https://www.npmjs.com/search?q=karma+launcher | ||
| browsers: ['ChromeHeadless'], | ||
| const settings = { | ||
| files: [ | ||
| 'node_modules/babel-polyfill/dist/polyfill.js', | ||
| 'node_modules/@babel/polyfill/dist/polyfill.js', | ||
| files.test | ||
| ], | ||
| preprocessors: { | ||
| [files.test]: ['eslint', 'webpack', 'sourcemap'], | ||
| [files.test]: ['eslint', 'webpack', 'sourcemap'] | ||
| }, | ||
| frameworks: ['mocha', 'chai'], | ||
| reporters : ['mocha', 'coverage'], | ||
| webpack : { | ||
| mode : 'development', | ||
| devtool: 'inline-source-map', | ||
| module : { | ||
| reporters : ['mocha', 'coverage-istanbul'], | ||
| webpack: { | ||
| mode : 'development', | ||
| module: { | ||
| rules: [ | ||
| { | ||
| test: /\.js$/, | ||
| test : /\.js$/, | ||
| exclude: [/node_modules/], | ||
| use: [ | ||
| use : [ | ||
| { | ||
| loader: 'babel-loader', | ||
| loader : 'babel-loader', | ||
| options: { | ||
| presets: [ | ||
| ['@babel/env', { | ||
| targets: { | ||
| browsers: ['ie >= 9'] | ||
| [ | ||
| '@babel/env', | ||
| { | ||
| targets: { | ||
| browsers: ['ie >= 9'] | ||
| } | ||
| } | ||
| }] | ||
| ] | ||
| ], | ||
| plugins: [ | ||
| ['istanbul', { | ||
| exclude: ['**/*.test.js'] | ||
| }] | ||
| ['istanbul', { exclude: 'tests/*' }] | ||
| ] | ||
| } | ||
| }, | ||
| } | ||
@@ -67,83 +63,31 @@ ] | ||
| // Code coverage | ||
| // https://www.npmjs.com/package/karma-coverage | ||
| coverageReporter: { | ||
| reporters: [ | ||
| { type: 'html' }, | ||
| { type: 'lcovonly' }, | ||
| { type: 'text-summary' } | ||
| ] | ||
| // https://github.com/mattlewis92/karma-coverage-istanbul-reporter | ||
| coverageIstanbulReporter: { | ||
| reports : ['lcovonly', 'text-summary'], | ||
| combineBrowserReports : true, | ||
| fixWebpackSourcePaths : true, | ||
| skipFilesWithNoCoverage: true | ||
| }, | ||
| // Mocha reporter | ||
| // https://www.npmjs.com/package/karma-mocha-reporter | ||
| mochaReporter: { | ||
| // https://www.npmjs.com/package/karma-mocha-reporter | ||
| output: 'autowatch' | ||
| }, | ||
| autoWatch : false, | ||
| colors : true, | ||
| concurrency: Infinity, | ||
| port : 9876, | ||
| colors : true, | ||
| autoWatch : false, | ||
| singleRun : true, | ||
| concurrency: Infinity | ||
| }; | ||
| // Remote config | ||
| // ============================================================================= | ||
| const remoteConfig = Object.assign({}, localConfig, { | ||
| // SauceLabs browers (see platform configurator below) | ||
| // https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/ | ||
| customLaunchers: { | ||
| sl_chrome: { | ||
| base : 'SauceLabs', | ||
| browserName: 'chrome', | ||
| platform : 'Windows 7', | ||
| version : '26' | ||
| }, | ||
| sl_edge: { | ||
| base : 'SauceLabs', | ||
| browserName: 'MicrosoftEdge', | ||
| platform : 'Windows 10', | ||
| version : '13.10586' | ||
| }, | ||
| sl_firefox: { | ||
| base : 'SauceLabs', | ||
| browserName: 'firefox', | ||
| platform : 'Windows 7', | ||
| version : '30' | ||
| }, | ||
| sl_ie_11: { | ||
| base : 'SauceLabs', | ||
| browserName: 'internet explorer', | ||
| platform : 'Windows 7', | ||
| version : '11.0' | ||
| }, | ||
| sl_ie_10: { | ||
| base : 'SauceLabs', | ||
| browserName: 'internet explorer', | ||
| platform : 'Windows 7', | ||
| version : '10.0' | ||
| }, | ||
| sl_ie_9: { | ||
| base : 'SauceLabs', | ||
| browserName: 'internet explorer', | ||
| platform : 'Windows 7', | ||
| version : '9.0' | ||
| }, | ||
| sl_safari: { | ||
| base : 'SauceLabs', | ||
| browserName: 'Safari', | ||
| platform : 'OS X 10.10', | ||
| version : '8.0' | ||
| // Prevent disconnect in Firefox/Safari | ||
| // https://support.saucelabs.com/hc/en-us/articles/225104707-Karma-Tests-Disconnect-Particularly-When-Running-Tests-on-Safari | ||
| browserDisconnectTimeout : 1000*10, // default 2000 | ||
| browserDisconnectTolerance: 1, // default 0 | ||
| browserNoActivityTimeout : 1000*30, // default 10000 | ||
| captureTimeout : 1000*60, // default 60000 | ||
| client: { | ||
| mocha: { | ||
| timeout: 1000*20 // default 2000 | ||
| } | ||
| }, | ||
| // Set browsers to all customLaunchers | ||
| get browsers() { | ||
| return Object.keys(this.customLaunchers); | ||
| }, | ||
| // SauceLab settings | ||
| sauceLabs: { | ||
| username : saucelabs.username || process.env.SAUCE_USERNAME, | ||
| accessKey: saucelabs.accessKey || process.env.SAUCE_ACCESS_KEY, | ||
| testName : `${pkg.name} (karma)` | ||
| } | ||
| }); | ||
| }; | ||
@@ -154,22 +98,81 @@ | ||
| module.exports = function(config) { | ||
| const isRemote = Boolean(process.argv.indexOf('--remote') > -1); | ||
| const testConfig = isRemote ? remoteConfig : localConfig; | ||
| const isRemote = Boolean(process.argv.indexOf('--remote') > -1); | ||
| // Remote test | ||
| if (isRemote) { | ||
| // Disabled source maps to prevent SauceLabs timeouts | ||
| // https://github.com/karma-runner/karma-sauce-launcher/issues/95 | ||
| testConfig.webpack.devtool = ''; | ||
| testConfig.webpack.module.rules[0].use[0].options.sourceMap = false; | ||
| // Browsers | ||
| // https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/ | ||
| settings.customLaunchers = { | ||
| sl_chrome: { | ||
| base : 'SauceLabs', | ||
| browserName: 'Chrome', | ||
| platform : 'Windows 10', | ||
| version : '26.0' | ||
| }, | ||
| sl_edge: { | ||
| base : 'SauceLabs', | ||
| browserName: 'MicrosoftEdge', | ||
| platform : 'Windows 10', | ||
| version : '13.10586' | ||
| }, | ||
| sl_firefox: { | ||
| base : 'SauceLabs', | ||
| browserName: 'Firefox', | ||
| platform : 'Windows 10', | ||
| version : '30' | ||
| }, | ||
| sl_ie_11: { | ||
| base : 'SauceLabs', | ||
| browserName: 'internet explorer', | ||
| platform : 'Windows 7', | ||
| version : '11.0' | ||
| }, | ||
| sl_ie_10: { | ||
| base : 'SauceLabs', | ||
| browserName: 'internet explorer', | ||
| platform : 'Windows 7', | ||
| version : '10.0' | ||
| }, | ||
| sl_ie_9: { | ||
| base : 'SauceLabs', | ||
| browserName: 'Internet Explorer', | ||
| platform : 'Windows 7', | ||
| version : '9.0' | ||
| }, | ||
| sl_safari: { | ||
| base : 'SauceLabs', | ||
| browserName: 'Safari', | ||
| platform : 'OS X 10.10', | ||
| version : '8.0' | ||
| } | ||
| }; | ||
| settings.browsers = Object.keys(settings.customLaunchers); | ||
| // Add SauceLabs reporter | ||
| testConfig.reporters.push('saucelabs'); | ||
| // SauceLabs | ||
| settings.reporters.push('saucelabs'); | ||
| settings.sauceLabs = { | ||
| username : saucelabs.username || process.env.SAUCE_USERNAME, | ||
| accessKey : saucelabs.accessKey || process.env.SAUCE_ACCESS_KEY, | ||
| testName : `${pkg.name} (karma)`, | ||
| recordScreenshots: false, | ||
| recordVideo : false | ||
| }; | ||
| // Remove text-summary reporter | ||
| testConfig.coverageReporter.reporters = testConfig.coverageReporter.reporters.filter(obj => obj.type !== 'text-summary'); | ||
| // Travis CI | ||
| if ('TRAVIS' in process.env) { | ||
| // Use custom hostname to prevent Safari disconnects | ||
| // https://support.saucelabs.com/hc/en-us/articles/115010079868-Issues-with-Safari-and-Karma-Test-Runner | ||
| settings.hostname = 'travis.dev'; | ||
| } | ||
| } | ||
| // Local | ||
| else { | ||
| settings.browsers = ['ChromeHeadless']; | ||
| settings.webpack.devtool = 'inline-source-map'; | ||
| settings.coverageIstanbulReporter.reports.push('html'); | ||
| // eslint-disable-next-line | ||
| console.log([ | ||
| '============================================================\n', | ||
| `KARMA: localhost:${testConfig.port}/debug.html\n`, | ||
| `KARMA: localhost:${settings.port}/debug.html\n`, | ||
| '============================================================\n' | ||
@@ -180,4 +183,4 @@ ].join('')); | ||
| // Logging: LOG_DISABLE, LOG_ERROR, LOG_WARN, LOG_INFO, LOG_DEBUG | ||
| testConfig.logLevel = config.LOG_WARN; | ||
| config.set(testConfig); | ||
| settings.logLevel = config.LOG_INFO; | ||
| config.set(settings); | ||
| }; |
+20
-20
| { | ||
| "name": "class-change", | ||
| "version": "1.1.4", | ||
| "version": "1.1.5", | ||
| "description": "A versatile Element.classList alternative for manipulating CSS class names, triggering change events using HTML data attributes, and creating class-related event listeners using a simple, declarative API.", | ||
@@ -42,4 +42,4 @@ "author": "John Hildenbiddle <http://hildenbiddle.com>", | ||
| "test": "karma start", | ||
| "test-watch": "npm test -- --auto-watch --no-single-run", | ||
| "test-remote": "npm test -- --remote", | ||
| "test-watch": "karma start --auto-watch --no-single-run", | ||
| "test-remote": "karma start --remote", | ||
| "version": "npm run prepare && npm test && git add -A dist", | ||
@@ -49,6 +49,6 @@ "watch": "run-p 'build -- -w'" | ||
| "devDependencies": { | ||
| "@babel/core": "^7.2.0", | ||
| "@babel/polyfill": "^7.0.0", | ||
| "@babel/preset-env": "^7.2.0", | ||
| "babel-loader": "^8.0.4", | ||
| "@babel/core": "^7.2.2", | ||
| "@babel/polyfill": "^7.2.5", | ||
| "@babel/preset-env": "^7.2.3", | ||
| "babel-loader": "^8.0.5", | ||
| "babel-plugin-external-helpers": "^6.22.0", | ||
@@ -59,29 +59,29 @@ "babel-plugin-istanbul": "^5.1.0", | ||
| "compression": "^1.7.3", | ||
| "eslint": "^5.9.0", | ||
| "eslint": "^5.12.0", | ||
| "eslint-plugin-chai-expect": "^2.0.1", | ||
| "eslint-plugin-html": "^4.0.6", | ||
| "eslint-plugin-mocha": "^5.2.0", | ||
| "karma": "^3.1.3", | ||
| "eslint-plugin-html": "^5.0.0", | ||
| "eslint-plugin-mocha": "^5.2.1", | ||
| "karma": "^3.1.4", | ||
| "karma-chai": "^0.1.0", | ||
| "karma-chrome-launcher": "^2.1.1", | ||
| "karma-coverage": "^1.1.2", | ||
| "karma-coverage-istanbul-reporter": "^2.0.4", | ||
| "karma-eslint": "^2.2.0", | ||
| "karma-mocha": "^1.3.0", | ||
| "karma-mocha-reporter": "^2.2.5", | ||
| "karma-sauce-launcher": "^1.2.0", | ||
| "karma-sauce-launcher": "^2.0.2", | ||
| "karma-sourcemap-loader": "^0.3.7", | ||
| "karma-webpack": "^3.0.5", | ||
| "karma-webpack": "^4.0.0-rc.5", | ||
| "lodash.merge": "^4.6.1", | ||
| "mocha": "^4.1.0", | ||
| "npm-run-all": "^4.1.5", | ||
| "rimraf": "^2.6.2", | ||
| "rollup": "^0.66.6", | ||
| "rollup-plugin-babel": "^4.0.3", | ||
| "rimraf": "^2.6.3", | ||
| "rollup": "^1.0.2", | ||
| "rollup-plugin-babel": "^4.2.0", | ||
| "rollup-plugin-commonjs": "^9.2.0", | ||
| "rollup-plugin-eslint": "^5.0.0", | ||
| "rollup-plugin-json": "^3.1.0", | ||
| "rollup-plugin-node-resolve": "^3.4.0", | ||
| "rollup-plugin-terser": "^3.0.0", | ||
| "webpack": "^4.27.1" | ||
| "rollup-plugin-node-resolve": "^4.0.0", | ||
| "rollup-plugin-terser": "^4.0.2", | ||
| "webpack": "^4.28.1" | ||
| } | ||
| } |
+2
-10
@@ -14,10 +14,2 @@ # class-change.js | ||
| ## Description | ||
| CSS class names change. A lot. | ||
| Yet the native methods for manipulating CSS class names remain rudimentary. [Element.classList](https://developer.mozilla.org/en/DOM/element.classList) provides a basic API for working with classes, but [some browsers](http://caniuse.com/#feat=classlist) suffer from an incomplete implementation (or lack support entirely), changes can only be applied to a single element, and separate event listeners must be created for each change event. The result is often polyfills or patches for legacy browsers, manual loops for applying changes to multiple elements, repeated boilerplate code for handling delegated events, and performance issues caused by a high volume of event listeners. | ||
| This micro-library aims to address these issues by reducing and simplifying the code required for CSS class changes and events. | ||
| ## Contact & Support | ||
@@ -27,3 +19,3 @@ | ||
| - Follow [@jhildenbiddle](https://twitter.com/jhildenbiddle) for announcements | ||
| - Add a [star on GitHub](https://github.com/jhildenbiddle/class-change) or [tweet](https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fjhildenbiddle%2Fclass-change&via=jhildenbiddle&hashtags=css,developers,frontend,javascript) to support the project! | ||
| - Add a ⭐️ [star on GitHub](https://github.com/jhildenbiddle/class-change) or ❤️ [tweet](https://twitter.com/intent/tweet?url=https%3A%2F%2Fgithub.com%2Fjhildenbiddle%2Fclass-change&via=jhildenbiddle&hashtags=css,developers,frontend,javascript) to support the project! | ||
@@ -34,2 +26,2 @@ ## License | ||
| Copyright (c) 2016 John Hildenbiddle ([@jhildenbiddle](https://twitter.com/jhildenbiddle)) | ||
| Copyright (c) John Hildenbiddle ([@jhildenbiddle](https://twitter.com/jhildenbiddle)) |
+5
-1
@@ -17,2 +17,6 @@ // Dependencies | ||
| // ============================================================================= | ||
| // Copyright | ||
| const currentYear = (new Date()).getFullYear(); | ||
| const releaseYear = 2016; | ||
| // Output | ||
@@ -28,3 +32,3 @@ const entryFile = path.resolve(__dirname, 'src', 'index.js'); | ||
| `${pkg.homepage}`, | ||
| `(c) ${(new Date()).getFullYear()} ${pkg.author}`, | ||
| `(c) ${releaseYear}${currentYear === releaseYear ? '' : '-' + currentYear} ${pkg.author}`, | ||
| `${pkg.license} license` | ||
@@ -31,0 +35,0 @@ ]; |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Obfuscated code
Supply chain riskObfuscated files are intentionally packed to hide their behavior. This could be a sign of malware.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 2 instances in 1 package
2256
0.18%0
-100%241720
-0.23%24
-25%4
100%