{"version":3,"sources":["webpack:///./LeLab.MaVue.Web/src/common/com-event-css-modifier/event-css-modifier.js"],"names":["evtCssMod","emptySelectorText","uidPrefix","uidCount","eventState","eventInitiate","stylesheet","error","msg","info","console","uid","CSSStyleSheet","ownerNode","id","touchCssText","cssText","selectorText","arr","split","newSelectorText","i","length","selector","trim","match","replace","parseRuleList","CSSRuleList","rulelist","rule","tmp","index","cssRules","type","push","css","base","touch","parseStyleSheet","document","styleSheets","err","href","reference","replaceStyleRule","CSSGroupingRule","deleteRule","insertRule","updateRuleList","update","updateEvent","onTouchStart","evt","onMouseMove","init","window","addEventListener","module","exports"],"mappings":";;;;;;;;AAAA;;;;;;;;;;;;;;AAcA;AACA,IAAIA,YAAY;;AAEZ;AACA;AACA;;AAEA;AACA;AACAC,uBAAmB,iBARP;;AAUZ;AACAC,eAAW,WAXC;;AAaZ;AACAC,cAAU,CAdE;;AAgBZ;AACAC,gBAAY,MAjBA;;AAmBZ;AACAC,mBAAe,KApBH;;AAsBZ;AACAC,gBAAY,EAvBA;;AA2BZ;AACA;AACA;;;AAGA;AACA;AACAC,WAAO,eAAUC,GAAV,EAAe;AAClB,cAAM,0BAA0BA,GAAhC;AACH,KApCW;;AAuCZ;AACA;AACAC,UAAM,cAAUD,GAAV,EAAe;AACjBE,gBAAQD,IAAR,CAAa,0BAA0BD,GAAvC;AACH,KA3CW;;AA8CZ;AACA;AACAG,SAAK,aAAUC,aAAV,EAAyB;AAC1B,YAAIA,iBAAiBA,cAAcC,SAAnC,EAA8C;AAC1C,gBAAID,cAAcC,SAAd,CAAwBC,EAAxB,IAA8B,EAAlC,EAAsC;AAClC,uBAAOF,cAAcC,SAAd,CAAwBC,EAA/B;AACH,aAFD,MAGK;AACDd,0BAAUG,QAAV,GAAqBH,UAAUG,QAAV,GAAqB,CAA1C;AACA,uBAAOH,UAAUE,SAAV,GAAsBF,UAAUG,QAAvC;AACH;AACJ;AACD,eAAO,KAAP;AACH,KA3DW;;AA8DZ;AACA;AACAY,kBAAc,sBAAUC,OAAV,EAAmBC,YAAnB,EAAiC;;AAE3C;AACA;AACA,YAAIC,MAAMD,aAAaE,KAAb,CAAmB,GAAnB,CAAV;AACA,YAAIC,kBAAkB,EAAtB;;AAEA,aAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIH,IAAII,MAAxB,EAAgCD,GAAhC,EAAqC;AACjC,gBAAIE,WAAWL,IAAIG,CAAJ,EAAOG,IAAP,EAAf;AACA,gBAAID,SAASE,KAAT,CAAe,QAAf,CAAJ,EAA8B;AAC1B;AACH,aAFD,MAEO;AACH,oBAAIL,mBAAmB,EAAvB,EAA2B;AACvBA,sCAAkBA,kBAAkB,IAApC;AACH;AACDA,kCAAkBA,kBAAkBG,QAApC;AACH;AACJ;;AAED;AACA;AACA,YAAIH,mBAAmB,EAAvB,EAA2B;AACvBA,8BAAkBpB,UAAUC,iBAA5B;AACH;;AAED;AACAe,kBAAUA,QAAQU,OAAR,CAAgBT,YAAhB,EAA8BG,eAA9B,CAAV;;AAEA,eAAOJ,OAAP;AACH,KA7FW;;AAgGZ;AACA;AACAW,mBAAe,uBAAUC,WAAV,EAAuB;AAClC,YAAIC,WAAW,EAAf;;AAEA,YAAID,WAAJ,EAAiB;AACb;AACA,iBAAK,IAAIP,IAAI,CAAb,EAAgBA,IAAIO,YAAYN,MAAhC,EAAwCD,GAAxC,EAA6C;;AAEzC;AACA,oBAAIS,OAAOF,YAAYP,CAAZ,CAAX;AACA;AACA,oBAAIU,MAAM;AACNC,2BAAOX;AADD,iBAAV;;AAIA;AACA,oBAAIS,KAAKG,QAAT,EAAmB;AACf;AACAF,wBAAIG,IAAJ,GAAW,cAAX;AACA;AACAH,wBAAIF,QAAJ,GAAe7B,UAAU2B,aAAV,CAAwBG,KAAKG,QAA7B,CAAf;AACA;AACA,wBAAIF,IAAIF,QAAJ,CAAaP,MAAb,GAAsB,CAA1B,EAA6B;AACzBO,iCAASM,IAAT,CAAcJ,GAAd;AACH;AACJ;AACD;AAVA,qBAWK;AACD;AACAA,4BAAIG,IAAJ,GAAW,cAAX;AACA;AACA,4BAAIJ,KAAKb,YAAL,IAAqBa,KAAKb,YAAL,CAAkBQ,KAAlB,CAAwB,QAAxB,CAAzB,EAA4D;AACxD;AACA;AACA;AACAM,gCAAIK,GAAJ,GAAU,EAAV;AACAL,gCAAIK,GAAJ,CAAQC,IAAR,GAAeP,KAAKd,OAApB;AACAe,gCAAIK,GAAJ,CAAQE,KAAR,GAAgBtC,UAAUe,YAAV,CAAuBe,KAAKd,OAA5B,EAAqCc,KAAKb,YAA1C,CAAhB;AACA;AACAY,qCAASM,IAAT,CAAcJ,GAAd;AACH;AACJ;AAEJ;AACJ;;AAED,eAAOF,QAAP;AACH,KAhJW;;AAmJZ;AACA;AACAU,qBAAiB,2BAAY;AACzB;AACA,aAAK,IAAIlB,IAAI,CAAb,EAAgBA,IAAImB,SAASC,WAAT,CAAqBnB,MAAzC,EAAiDD,GAAjD,EAAsD;AAClD,gBAAIT,gBAAgB4B,SAASC,WAAT,CAAqBpB,CAArB,CAApB;AACA;AACA,gBAAIT,cAAcC,SAAd,CAAwBC,EAAxB,IAA8B,EAAlC,EAAsC;AAClC,oBAAIH,MAAMC,cAAcC,SAAd,CAAwBC,EAAxB,GAA6Bd,UAAUW,GAAV,CAAcC,aAAd,CAAvC;AACH;AACD;AAHA,iBAIK,IAAIA,cAAcC,SAAd,CAAwBC,EAA5B,EAAgC;AACjC,wBAAIH,MAAMC,cAAcC,SAAd,CAAwBC,EAAlC;AACH;AACD;AAHK,qBAIA;AACDd,kCAAUO,KAAV,CAAgB,+CAAhB;AACA;AACH;AACD;AACA,gBAAI;AACA,oBAAI0B,WAAWrB,cAAcqB,QAA7B;AACH,aAFD,CAGA,OAAOS,GAAP,EAAY;AACR1C,0BAAUS,IAAV,CAAe,yCAAyCG,cAAc+B,IAAvD,GAA8D,IAA7E;AACA;AACH;AACD;AACA,gBAAI,CAAC3C,UAAUM,UAAV,CAAqBK,GAArB,CAAL,EAAgC;AAC5BX,0BAAUM,UAAV,CAAqB6B,IAArB,CAA0B;AACtBrB,wBAAIH,GADkB;AAEtBiC,+BAAWhC,aAFW;AAGtBiB,8BAAU7B,UAAU2B,aAAV,CAAwBM,QAAxB;AAHY,iBAA1B;AAKH;AACJ;AACJ,KAvLW;;AA0LZ;AACA;AACAY,sBAAkB,0BAAUC,eAAV,EAA2B9B,OAA3B,EAAoCgB,KAApC,EAA2C;AACzDc,wBAAgBC,UAAhB,CAA2Bf,KAA3B;AACAc,wBAAgBE,UAAhB,CAA2BhC,OAA3B,EAAoCgB,KAApC;AACH,KA/LW;;AAkMZ;AACA;AACAiB,oBAAgB,wBAAUH,eAAV,EAA2BjB,QAA3B,EAAqC;AACjD,aAAK,IAAIR,IAAI,CAAb,EAAgBA,IAAIQ,SAASP,MAA7B,EAAqCD,GAArC,EAA0C;AACtC,gBAAIS,OAAOD,SAASR,CAAT,CAAX;;AAEA;AACA,gBAAIS,KAAKI,IAAL,IAAa,cAAjB,EAAiC;AAC7BlC,0BAAUiD,cAAV,CAAyBH,gBAAgBb,QAAhB,CAAyBH,KAAKE,KAA9B,CAAzB,EAA+DF,KAAKD,QAApE;AACH;;AAED;AAJA,iBAKK,IAAIC,KAAKI,IAAL,IAAa,cAAjB,EAAiC;AAClC;AACA,wBAAIlC,UAAUI,UAAV,IAAwB,OAA5B,EAAqC;AACjCJ,kCAAU6C,gBAAV,CAA2BC,eAA3B,EAA4ChB,KAAKM,GAAL,CAASE,KAArD,EAA4DR,KAAKE,KAAjE;AACH;AACD;AAHA,yBAIK;AACDhC,sCAAU6C,gBAAV,CAA2BC,eAA3B,EAA4ChB,KAAKM,GAAL,CAASC,IAArD,EAA2DP,KAAKE,KAAhE;AACH;AACJ;AACJ;AACJ,KAzNW;;AA4NZ;AACA;AACAkB,YAAQ,kBAAY;AAChB,aAAK,IAAI7B,IAAI,CAAb,EAAgBA,IAAIrB,UAAUM,UAAV,CAAqBgB,MAAzC,EAAiDD,GAAjD,EAAsD;AAClD,gBAAIf,aAAaN,UAAUM,UAAV,CAAqBe,CAArB,CAAjB;AACA,gBAAIf,WAAWuB,QAAX,CAAoBP,MAApB,GAA6B,CAAjC,EAAoC;AAChCtB,0BAAUiD,cAAV,CAAyB3C,WAAWsC,SAApC,EAA+CtC,WAAWuB,QAA1D;AACH;AACJ;AACJ,KArOW;;AAwOZ;AACA;AACAsB,iBAAa,qBAAU/C,UAAV,EAAsB;AAC/B;AACAJ,kBAAUI,UAAV,GAAuBA,UAAvB;AACA;AACAJ,kBAAUkD,MAAV;AACH,KA/OW;;AAkPZ;AACA;AACAE,kBAAc,sBAAUC,GAAV,EAAe;AACzB;AACA,YAAIrD,UAAUI,UAAV,IAAwB,OAAxB,IAAmCJ,UAAUK,aAAV,IAA2B,KAAlE,EAAyE;AACrEL,sBAAUmD,WAAV,CAAsB,OAAtB;AACH;AACD;AACAnD,kBAAUK,aAAV,GAA0B,IAA1B;AACH,KA3PW;;AA6PZiD,iBAAa,qBAAUD,GAAV,EAAe;AACxB;AACA,YAAIrD,UAAUI,UAAV,IAAwB,MAAxB,IAAkCJ,UAAUK,aAAV,IAA2B,KAAjE,EAAwE;AACpEL,sBAAUmD,WAAV,CAAsB,MAAtB;AACH;AACD;AACA,YAAInD,UAAUK,aAAd,EAA6B;AACzBL,sBAAUK,aAAV,GAA0B,KAA1B;AACH;AACJ,KAtQW;;AAyQZ;AACA;AACAkD,UAAM,gBAAY;AACd;AACAvD,kBAAUuC,eAAV;AACA;AACA;AACA;AACA,YAAI,kBAAkBiB,MAAtB,EAA8B;AAC1BxD,sBAAUmD,WAAV,CAAsB,OAAtB;AACH;AACD;AACAX,iBAASiB,gBAAT,CAA0B,YAA1B,EAAwCzD,UAAUoD,YAAlD,EAAgE,KAAhE;AACAZ,iBAASiB,gBAAT,CAA0B,WAA1B,EAAuCzD,UAAUsD,WAAjD,EAA8D,KAA9D;AACH;AAvRW,CAAhB;;AA0RA;AACA;AACAI,OAAOC,OAAP,GAAiB;AACbJ,UAAMvD,UAAUuD,IADH;AAEbL,YAAQlD,UAAUkD;AAFL,CAAjB,C","file":"1.js","sourcesContent":["/**\r\n * Event CSS Modifier\r\n * \r\n * Remove / Add :hover pseudo-class from selector text\r\n * base on event use for interaction.\r\n * \r\n * On mobile, we don't want :hover state because they always\r\n * show up, but we need them on desktop. There is also a need\r\n * for computer having both touch and mouse event.\r\n * \r\n * This JS remove :hover selector when using touch event.\r\n * If a mouse event is use, the default selector is restored.\r\n */\r\n\r\n// This object is \"private\" and should not be expose\r\nvar evtCssMod = {\r\n\r\n //\r\n // Variables\r\n //\r\n\r\n // Default selector, matching nothing, if a selectorText\r\n // is empty after modification.\r\n emptySelectorText: \"#evtCssModEmpty\",\r\n\r\n // Unique ID prefix\r\n uidPrefix: \"evtCssMod\",\r\n\r\n // Unique ID counter\r\n uidCount: 0,\r\n\r\n // Current event state applied to CSS modification\r\n eventState: \"base\",\r\n\r\n // Boolean mentionning if an event is currently initiated\r\n eventInitiate: false,\r\n\r\n // StyleSheet\r\n stylesheet: [],\r\n\r\n\r\n\r\n //\r\n // Functions\r\n //\r\n\r\n\r\n // Throw error\r\n //\r\n error: function (msg) {\r\n throw \"Event CSS Modifier : \" + msg;\r\n },\r\n\r\n\r\n // Console log information\r\n //\r\n info: function (msg) {\r\n console.info(\"Event CSS Modifier : \" + msg);\r\n },\r\n\r\n\r\n // Apply and return a unique ID for the CSSStyleSheet\r\n //\r\n uid: function (CSSStyleSheet) {\r\n if (CSSStyleSheet && CSSStyleSheet.ownerNode) {\r\n if (CSSStyleSheet.ownerNode.id != \"\") {\r\n return CSSStyleSheet.ownerNode.id;\r\n }\r\n else {\r\n evtCssMod.uidCount = evtCssMod.uidCount + 1;\r\n return evtCssMod.uidPrefix + evtCssMod.uidCount;\r\n }\r\n }\r\n return false;\r\n },\r\n\r\n\r\n // Return a \"cssText\" without :hover pseudo-class\r\n //\r\n touchCssText: function (cssText, selectorText) {\r\n\r\n // Build the new selector text without :hover\r\n //\r\n var arr = selectorText.split(\",\");\r\n var newSelectorText = \"\";\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n var selector = arr[i].trim();\r\n if (selector.match(\":hover\")) {\r\n continue;\r\n } else {\r\n if (newSelectorText != \"\") {\r\n newSelectorText = newSelectorText + \", \";\r\n }\r\n newSelectorText = newSelectorText + selector;\r\n }\r\n }\r\n\r\n // If new selector text is empty, \r\n // assign a selector matching nothing\r\n if (newSelectorText == \"\") {\r\n newSelectorText = evtCssMod.emptySelectorText;\r\n }\r\n\r\n // Replace selector of cssTest\r\n cssText = cssText.replace(selectorText, newSelectorText);\r\n\r\n return cssText;\r\n },\r\n\r\n\r\n // Parse rule list (recursive)\r\n //\r\n parseRuleList: function (CSSRuleList) {\r\n var rulelist = [];\r\n\r\n if (CSSRuleList) {\r\n // Loop through each rule in sheet\r\n for (var i = 0; i < CSSRuleList.length; i++) {\r\n\r\n // CSSStyleRule or CSSMediaRule\r\n var rule = CSSRuleList[i];\r\n // Temporary object with rulelist info\r\n var tmp = {\r\n index: i\r\n };\r\n\r\n // CSSMediaRule\r\n if (rule.cssRules) {\r\n // Store object name\r\n tmp.type = 'CSSMediaRule';\r\n // Recursion\r\n tmp.rulelist = evtCssMod.parseRuleList(rule.cssRules);\r\n // Push to array (if not empty)\r\n if (tmp.rulelist.length > 0) {\r\n rulelist.push(tmp);\r\n }\r\n }\r\n // CSSStyleRule\r\n else {\r\n // Store object name\r\n tmp.type = 'CSSStyleRule';\r\n // If selector text contain :hover pseudo-class\r\n if (rule.selectorText && rule.selectorText.match(\":hover\")) {\r\n // Store information about the selector\r\n // Base : It's the original\r\n // Touch : Modified for touch event\r\n tmp.css = {};\r\n tmp.css.base = rule.cssText;\r\n tmp.css.touch = evtCssMod.touchCssText(rule.cssText, rule.selectorText);\r\n // Push to array\r\n rulelist.push(tmp);\r\n }\r\n }\r\n\r\n }\r\n }\r\n\r\n return rulelist;\r\n },\r\n\r\n\r\n // Parse all stylesheet\r\n //\r\n parseStyleSheet: function () {\r\n // Loop through each stylesheet\r\n for (var i = 0; i < document.styleSheets.length; i++) {\r\n var CSSStyleSheet = document.styleSheets[i];\r\n // Apply a unique ID to the stylesheet (if none)\r\n if (CSSStyleSheet.ownerNode.id == \"\") {\r\n var uid = CSSStyleSheet.ownerNode.id = evtCssMod.uid(CSSStyleSheet);\r\n }\r\n // Retreive the ID (if exist)\r\n else if (CSSStyleSheet.ownerNode.id) {\r\n var uid = CSSStyleSheet.ownerNode.id;\r\n }\r\n // Can't assign or retreive ID\r\n else {\r\n evtCssMod.error(\"Impossible to assing unique ID to stylesheet.\");\r\n continue;\r\n }\r\n // Try to retreive the cssRules\r\n try {\r\n var cssRules = CSSStyleSheet.cssRules;\r\n }\r\n catch (err) {\r\n evtCssMod.info(\"Failed to read the 'cssRules' from '\" + CSSStyleSheet.href + \"'.\");\r\n continue;\r\n }\r\n // Add to the stylesheed\r\n if (!evtCssMod.stylesheet[uid]) {\r\n evtCssMod.stylesheet.push({\r\n id: uid,\r\n reference: CSSStyleSheet,\r\n rulelist: evtCssMod.parseRuleList(cssRules)\r\n });\r\n }\r\n }\r\n },\r\n\r\n\r\n // Replace a CSSStyleRule\r\n //\r\n replaceStyleRule: function (CSSGroupingRule, cssText, index) {\r\n CSSGroupingRule.deleteRule(index);\r\n CSSGroupingRule.insertRule(cssText, index);\r\n },\r\n\r\n\r\n // Update RuleList base on event\r\n //\r\n updateRuleList: function (CSSGroupingRule, rulelist) {\r\n for (var i = 0; i < rulelist.length; i++) {\r\n var rule = rulelist[i];\r\n\r\n // CSSMediaRule\r\n if (rule.type == 'CSSMediaRule') {\r\n evtCssMod.updateRuleList(CSSGroupingRule.cssRules[rule.index], rule.rulelist);\r\n }\r\n\r\n // CSSStyleRule\r\n else if (rule.type == 'CSSStyleRule') {\r\n // Apply touch modified selector\r\n if (evtCssMod.eventState == \"touch\") {\r\n evtCssMod.replaceStyleRule(CSSGroupingRule, rule.css.touch, rule.index);\r\n }\r\n // Restore original (base) selector\r\n else {\r\n evtCssMod.replaceStyleRule(CSSGroupingRule, rule.css.base, rule.index);\r\n }\r\n }\r\n }\r\n },\r\n\r\n\r\n // Update CSS Rules base on event for each stylesheet\r\n //\r\n update: function () {\r\n for (var i = 0; i < evtCssMod.stylesheet.length; i++) {\r\n var stylesheet = evtCssMod.stylesheet[i];\r\n if (stylesheet.rulelist.length > 0) {\r\n evtCssMod.updateRuleList(stylesheet.reference, stylesheet.rulelist);\r\n }\r\n }\r\n },\r\n\r\n\r\n // Update CSS Rules base on event\r\n //\r\n updateEvent: function (eventState) {\r\n // Save the event state\r\n evtCssMod.eventState = eventState;\r\n // Update\r\n evtCssMod.update();\r\n },\r\n\r\n\r\n // Touch Start\r\n //\r\n onTouchStart: function (evt) {\r\n // Update if not the \"touch\" state\r\n if (evtCssMod.eventState != \"touch\" && evtCssMod.eventInitiate == false) {\r\n evtCssMod.updateEvent(\"touch\");\r\n }\r\n // Flag to prevent event execution in \"mouse move\"\r\n evtCssMod.eventInitiate = true;\r\n },\r\n\r\n onMouseMove: function (evt) {\r\n // Update if not the \"base\" state\r\n if (evtCssMod.eventState != \"base\" && evtCssMod.eventInitiate == false) {\r\n evtCssMod.updateEvent(\"base\");\r\n }\r\n // Flag to restore event execution in \"mouse move\"\r\n if (evtCssMod.eventInitiate) {\r\n evtCssMod.eventInitiate = false;\r\n }\r\n },\r\n\r\n\r\n // Init\r\n //\r\n init: function () {\r\n // Parse stylesheet to build new rule\r\n evtCssMod.parseStyleSheet();\r\n // If device support touch, \r\n // there's a high chance it's a mobile (touch).\r\n // Transform the CSS by anticipation.\r\n if ('ontouchstart' in window) {\r\n evtCssMod.updateEvent(\"touch\");\r\n };\r\n // Listen for event\r\n document.addEventListener(\"touchstart\", evtCssMod.onTouchStart, false);\r\n document.addEventListener(\"mousemove\", evtCssMod.onMouseMove, false);\r\n }\r\n};\r\n\r\n// Expose the \"eventCssModifier\" to be used\r\n// has an API\r\nmodule.exports = {\r\n init: evtCssMod.init,\r\n update: evtCssMod.update\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./LeLab.MaVue.Web/src/common/com-event-css-modifier/event-css-modifier.js"],"sourceRoot":""}