{"version":3,"file":"StickyElement.js","names":["defaultConfig","topOffset","bottomOffset","parentWidthFix","mobileBreakpoint","bottomMax","navBottomFix","StickyElement","element","boundaryElement","config","_","defaults","$element","$","$parent","parent","$boundary","elementBoundingRect","undefined","boundaryElementRect","position","disabled","init","updateMeasurements","attachEvents","onResize","getBoundingClientRect","parentElementRect","applyScrollTransforms","window","innerWidth","disable","enable","css","left","width","makeElementStatic","top","bottom","makeElementFixed","height","on","onScroll","bind","throttle","start"],"sources":["components/StickyElement.js"],"sourcesContent":["import _ from 'lodash';\r\nimport $ from 'jquery';\r\n\r\n/**\r\n * Default plugin configuration\r\n * @type {{buffer: number, stickyStateClass: string}}\r\n */\r\nvar defaultConfig = {\r\n topOffset: 70,\r\n bottomOffset: 20,\r\n parentWidthFix: 30,\r\n mobileBreakpoint: 768,\r\n bottomMax: 850,\r\n navBottomFix: 200\r\n \r\n};\r\n\r\n/**\r\n * Plugin to fix elements to scroll position\r\n */\r\nexport class StickyElement {\r\n\r\n constructor(element, boundaryElement, config) {\r\n this.config = _.defaults(config || {}, defaultConfig);\r\n\r\n /**\r\n *\r\n * @type {jQuery}\r\n */\r\n this.$element = $(element);\r\n\r\n /**\r\n *\r\n * @type {jQuery}\r\n */\r\n this.$parent = this.$element.parent();\r\n\r\n /**\r\n *\r\n * @type {jQuery}\r\n */\r\n this.$boundary = $(boundaryElement);\r\n\r\n /**\r\n *\r\n * @type {ClientRect}\r\n */\r\n this.elementBoundingRect = undefined;\r\n\r\n /**\r\n *\r\n * @type {ClientRect}\r\n */\r\n this.boundaryElementRect = undefined;\r\n\r\n /**\r\n *\r\n * @type {string}\r\n */\r\n this.position = 'static';\r\n\r\n /**\r\n *\r\n * @type {boolean}\r\n */\r\n this.disabled = false;\r\n\r\n this.init();\r\n }\r\n\r\n /**\r\n * Initialises dom elements for manipulation\r\n */\r\n init() {\r\n this.updateMeasurements();\r\n this.attachEvents();\r\n this.onResize();\r\n }\r\n\r\n /**\r\n *\r\n */\r\n updateMeasurements(){\r\n this.elementBoundingRect = this.$element[0].getBoundingClientRect();\r\n this.boundaryElementRect = this.$boundary[0].getBoundingClientRect();\r\n this.parentElementRect = this.$parent[0].getBoundingClientRect();\r\n }\r\n\r\n /**\r\n * Sets the 'sticky' state of the element depending on scroll position\r\n */\r\n setStickyState() {\r\n\r\n }\r\n\r\n /**\r\n * Removes 'sticky' states and styles returning the element to its original state\r\n */\r\n onScroll() {\r\n this.updateMeasurements();\r\n this.applyScrollTransforms();\r\n }\r\n\r\n onResize(){\r\n if(!this.disabled && window.innerWidth < this.config.mobileBreakpoint){\r\n this.disable();\r\n }\r\n if(this.disabled && window.innerWidth >= this.config.mobileBreakpoint){\r\n this.enable();\r\n }\r\n\r\n\r\n if(this.position ==='fixed'){\r\n this.updateMeasurements();\r\n\r\n this.$element.css({\r\n left: this.parentElementRect.left,\r\n width: this.parentElementRect.width - this.config.parentWidthFix\r\n })\r\n } else {\r\n this.applyScrollTransforms();\r\n }\r\n }\r\n\r\n disable(){\r\n this.disabled = true;\r\n this.makeElementStatic();\r\n }\r\n enable(){\r\n this.disabled = false;\r\n this.applyScrollTransforms();\r\n }\r\n\r\n applyScrollTransforms(){\r\n \r\n if (this.boundaryElementRect.top <= this.config.topOffset && this.boundaryElementRect.bottom > this.config.bottomMax){\r\n this.makeElementFixed();\r\n } else {\r\n this.makeElementStatic();\r\n }\r\n }\r\n\r\n makeElementFixed(){\r\n if(this.disabled){\r\n return;\r\n }\r\n\r\n this.$element.css({\r\n 'position': 'fixed',\r\n 'left' : this.elementBoundingRect.left,\r\n 'top' : this.config.topOffset\r\n })\r\n }\r\n\r\n makeElementStatic(){\r\n var top;\r\n var top = 0;\r\n if (this.boundaryElementRect.bottom < this.config.bottomMax) {\r\n top = this.boundaryElementRect.height - this.elementBoundingRect.height - this.config.navBottomFix;\r\n }\r\n this.$element.css({\r\n 'position': 'relative',\r\n 'left' : '',\r\n 'top' : `${top}px`\r\n });\r\n }\r\n\r\n /**\r\n * Attaches events handlers\r\n */\r\n attachEvents(){\r\n $(window).on('scroll', this.onScroll.bind(this));\r\n $(window).on('resize', _.throttle(this.onResize.bind(this), 60));\r\n }\r\n}\r\n\r\nStickyElement.start = function (element, boundaryElement, config) {\r\n return new StickyElement(element, boundaryElement, config);\r\n};"],"mappings":";;;;;;AAAA;AACA;AAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEvB;AACA;AACA;AACA;AACA,IAAIA,aAAa,GAAG;EAChBC,SAAS,EAAE,EAAE;EACbC,YAAY,EAAE,EAAE;EAChBC,cAAc,EAAE,EAAE;EAClBC,gBAAgB,EAAE,GAAG;EACrBC,SAAS,EAAE,GAAG;EACdC,YAAY,EAAE;AAElB,CAAC;;AAED;AACA;AACA;AAFA,IAGaC,aAAa;EAEtB,uBAAYC,OAAO,EAAEC,eAAe,EAAEC,MAAM,EAAE;IAAA;IAC1C,IAAI,CAACA,MAAM,GAAGC,kBAAC,CAACC,QAAQ,CAACF,MAAM,IAAI,CAAC,CAAC,EAAEV,aAAa,CAAC;;IAErD;AACR;AACA;AACA;IACQ,IAAI,CAACa,QAAQ,GAAG,IAAAC,kBAAC,EAACN,OAAO,CAAC;;IAE1B;AACR;AACA;AACA;IACQ,IAAI,CAACO,OAAO,GAAG,IAAI,CAACF,QAAQ,CAACG,MAAM,EAAE;;IAErC;AACR;AACA;AACA;IACQ,IAAI,CAACC,SAAS,GAAG,IAAAH,kBAAC,EAACL,eAAe,CAAC;;IAEnC;AACR;AACA;AACA;IACQ,IAAI,CAACS,mBAAmB,GAAGC,SAAS;;IAEpC;AACR;AACA;AACA;IACQ,IAAI,CAACC,mBAAmB,GAAGD,SAAS;;IAEpC;AACR;AACA;AACA;IACQ,IAAI,CAACE,QAAQ,GAAG,QAAQ;;IAExB;AACR;AACA;AACA;IACQ,IAAI,CAACC,QAAQ,GAAG,KAAK;IAErB,IAAI,CAACC,IAAI,EAAE;EACf;;EAEA;AACJ;AACA;EAFI;IAAA;IAAA,OAGA,gBAAO;MACH,IAAI,CAACC,kBAAkB,EAAE;MACzB,IAAI,CAACC,YAAY,EAAE;MACnB,IAAI,CAACC,QAAQ,EAAE;IACnB;;IAEA;AACJ;AACA;EAFI;IAAA;IAAA,OAGA,8BAAoB;MAChB,IAAI,CAACR,mBAAmB,GAAG,IAAI,CAACL,QAAQ,CAAC,CAAC,CAAC,CAACc,qBAAqB,EAAE;MACnE,IAAI,CAACP,mBAAmB,GAAG,IAAI,CAACH,SAAS,CAAC,CAAC,CAAC,CAACU,qBAAqB,EAAE;MACpE,IAAI,CAACC,iBAAiB,GAAG,IAAI,CAACb,OAAO,CAAC,CAAC,CAAC,CAACY,qBAAqB,EAAE;IACpE;;IAEA;AACJ;AACA;EAFI;IAAA;IAAA,OAGA,0BAAiB,CAEjB;;IAEA;AACJ;AACA;EAFI;IAAA;IAAA,OAGA,oBAAW;MACP,IAAI,CAACH,kBAAkB,EAAE;MACzB,IAAI,CAACK,qBAAqB,EAAE;IAChC;EAAC;IAAA;IAAA,OAED,oBAAU;MACN,IAAG,CAAC,IAAI,CAACP,QAAQ,IAAIQ,MAAM,CAACC,UAAU,GAAG,IAAI,CAACrB,MAAM,CAACN,gBAAgB,EAAC;QAClE,IAAI,CAAC4B,OAAO,EAAE;MAClB;MACA,IAAG,IAAI,CAACV,QAAQ,IAAIQ,MAAM,CAACC,UAAU,IAAI,IAAI,CAACrB,MAAM,CAACN,gBAAgB,EAAC;QAClE,IAAI,CAAC6B,MAAM,EAAE;MACjB;MAGA,IAAG,IAAI,CAACZ,QAAQ,KAAI,OAAO,EAAC;QACxB,IAAI,CAACG,kBAAkB,EAAE;QAEzB,IAAI,CAACX,QAAQ,CAACqB,GAAG,CAAC;UACdC,IAAI,EAAE,IAAI,CAACP,iBAAiB,CAACO,IAAI;UACjCC,KAAK,EAAE,IAAI,CAACR,iBAAiB,CAACQ,KAAK,GAAG,IAAI,CAAC1B,MAAM,CAACP;QACtD,CAAC,CAAC;MACN,CAAC,MAAM;QACH,IAAI,CAAC0B,qBAAqB,EAAE;MAChC;IACJ;EAAC;IAAA;IAAA,OAED,mBAAS;MACL,IAAI,CAACP,QAAQ,GAAG,IAAI;MACpB,IAAI,CAACe,iBAAiB,EAAE;IAC5B;EAAC;IAAA;IAAA,OACD,kBAAQ;MACJ,IAAI,CAACf,QAAQ,GAAG,KAAK;MACrB,IAAI,CAACO,qBAAqB,EAAE;IAChC;EAAC;IAAA;IAAA,OAED,iCAAuB;MAEnB,IAAI,IAAI,CAACT,mBAAmB,CAACkB,GAAG,IAAI,IAAI,CAAC5B,MAAM,CAACT,SAAS,IAAI,IAAI,CAACmB,mBAAmB,CAACmB,MAAM,GAAG,IAAI,CAAC7B,MAAM,CAACL,SAAS,EAAC;QACjH,IAAI,CAACmC,gBAAgB,EAAE;MAC3B,CAAC,MAAM;QACH,IAAI,CAACH,iBAAiB,EAAE;MAC5B;IACJ;EAAC;IAAA;IAAA,OAED,4BAAkB;MACd,IAAG,IAAI,CAACf,QAAQ,EAAC;QACb;MACJ;MAEA,IAAI,CAACT,QAAQ,CAACqB,GAAG,CAAC;QACd,UAAU,EAAE,OAAO;QACnB,MAAM,EAAG,IAAI,CAAChB,mBAAmB,CAACiB,IAAI;QACtC,KAAK,EAAG,IAAI,CAACzB,MAAM,CAACT;MACxB,CAAC,CAAC;IACN;EAAC;IAAA;IAAA,OAED,6BAAmB;MACf,IAAIqC,GAAG;MACP,IAAIA,GAAG,GAAG,CAAC;MACX,IAAI,IAAI,CAAClB,mBAAmB,CAACmB,MAAM,GAAG,IAAI,CAAC7B,MAAM,CAACL,SAAS,EAAE;QACzDiC,GAAG,GAAG,IAAI,CAAClB,mBAAmB,CAACqB,MAAM,GAAG,IAAI,CAACvB,mBAAmB,CAACuB,MAAM,GAAG,IAAI,CAAC/B,MAAM,CAACJ,YAAY;MACtG;MACA,IAAI,CAACO,QAAQ,CAACqB,GAAG,CAAC;QACd,UAAU,EAAE,UAAU;QACtB,MAAM,EAAG,EAAE;QACX,KAAK,YAAMI,GAAG;MAClB,CAAC,CAAC;IACN;;IAEA;AACJ;AACA;EAFI;IAAA;IAAA,OAGA,wBAAc;MACV,IAAAxB,kBAAC,EAACgB,MAAM,CAAC,CAACY,EAAE,CAAC,QAAQ,EAAE,IAAI,CAACC,QAAQ,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;MAChD,IAAA9B,kBAAC,EAACgB,MAAM,CAAC,CAACY,EAAE,CAAC,QAAQ,EAAE/B,kBAAC,CAACkC,QAAQ,CAAC,IAAI,CAACnB,QAAQ,CAACkB,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACpE;EAAC;EAAA;AAAA;AAAA;AAGLrC,aAAa,CAACuC,KAAK,GAAG,UAAUtC,OAAO,EAAEC,eAAe,EAAEC,MAAM,EAAE;EAC9D,OAAO,IAAIH,aAAa,CAACC,OAAO,EAAEC,eAAe,EAAEC,MAAM,CAAC;AAC9D,CAAC"}