{"version":3,"file":"js/application-f6573c02da2e59902592.js","mappings":"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","sources":["webpack://ios-interview-guide-app/./node_modules/sticky-sidebar/src/sticky-sidebar.js","webpack://ios-interview-guide-app/./app/javascript/src/main.ts","webpack://ios-interview-guide-app/./app/javascript/src/button_scrolling.js","webpack://ios-interview-guide-app/./app/javascript/src/click_handlers.js","webpack://ios-interview-guide-app/./app/javascript/src/mixpanel_setup.ts"],"sourcesContent":["/**\r\n * Sticky Sidebar JavaScript Plugin.\r\n * @version 3.3.1\r\n * @author Ahmed Bouhuolia \r\n * @license The MIT License (MIT)\r\n */\r\nconst StickySidebar = (() => {\r\n \r\n // ---------------------------------\r\n // # Define Constants\r\n // ---------------------------------\r\n //\r\n const EVENT_KEY = '.stickySidebar';\r\n const VERSION = '3.3.1';\r\n \r\n const DEFAULTS = {\r\n \r\n /**\r\n * Additional top spacing of the element when it becomes sticky.\r\n * @type {Numeric|Function}\r\n */\r\n topSpacing: 0,\r\n \r\n /**\r\n * Additional bottom spacing of the element when it becomes sticky.\r\n * @type {Numeric|Function}\r\n */\r\n bottomSpacing: 0,\r\n \r\n /**\r\n * Container sidebar selector to know what the beginning and end of sticky element.\r\n * @type {String|False}\r\n */\r\n containerSelector: false,\r\n \r\n /**\r\n * Inner wrapper selector.\r\n * @type {String}\r\n */\r\n innerWrapperSelector: '.inner-wrapper-sticky',\r\n \r\n /**\r\n * The name of CSS class to apply to elements when they have become stuck.\r\n * @type {String|False}\r\n */\r\n stickyClass: 'is-affixed',\r\n \r\n /**\r\n * Detect when sidebar and its container change height so re-calculate their dimensions.\r\n * @type {Boolean}\r\n */\r\n resizeSensor: true,\r\n \r\n /**\r\n * The sidebar returns to its normal position if its width below this value.\r\n * @type {Numeric}\r\n */\r\n minWidth: false\r\n };\r\n \r\n // ---------------------------------\r\n // # Class Definition\r\n // ---------------------------------\r\n //\r\n /**\r\n * Sticky Sidebar Class.\r\n * @public\r\n */\r\n class StickySidebar{\r\n \r\n /**\r\n * Sticky Sidebar Constructor.\r\n * @constructor\r\n * @param {HTMLElement|String} sidebar - The sidebar element or sidebar selector.\r\n * @param {Object} options - The options of sticky sidebar.\r\n */\r\n constructor(sidebar, options = {}){\r\n this.options = StickySidebar.extend(DEFAULTS, options);\r\n \r\n // Sidebar element query if there's no one, throw error.\r\n this.sidebar = ('string' === typeof sidebar ) ? document.querySelector(sidebar) : sidebar;\r\n if( 'undefined' === typeof this.sidebar )\r\n throw new Error(\"There is no specific sidebar element.\");\r\n \r\n this.sidebarInner = false;\r\n this.container = this.sidebar.parentElement;\r\n \r\n // Current Affix Type of sidebar element.\r\n this.affixedType = 'STATIC';\r\n this.direction = 'down';\r\n this.support = {\r\n transform: false,\r\n transform3d: false\r\n };\r\n \r\n this._initialized = false;\r\n this._reStyle = false;\r\n this._breakpoint = false;\r\n this._resizeListeners = [];\r\n \r\n // Dimensions of sidebar, container and screen viewport.\r\n this.dimensions = {\r\n translateY: 0,\r\n topSpacing: 0,\r\n lastTopSpacing: 0,\r\n bottomSpacing: 0,\r\n lastBottomSpacing: 0,\r\n sidebarHeight: 0,\r\n sidebarWidth: 0,\r\n containerTop: 0,\r\n containerHeight: 0,\r\n viewportHeight: 0,\r\n viewportTop: 0, \r\n lastViewportTop: 0,\r\n };\r\n \r\n // Bind event handlers for referencability.\r\n ['handleEvent'].forEach( (method) => {\r\n this[method] = this[method].bind(this);\r\n });\r\n \r\n // Initialize sticky sidebar for first time.\r\n this.initialize();\r\n }\r\n \r\n /**\r\n * Initializes the sticky sidebar by adding inner wrapper, define its container, \r\n * min-width breakpoint, calculating dimensions, adding helper classes and inline style.\r\n * @private\r\n */\r\n initialize(){\r\n this._setSupportFeatures();\r\n \r\n // Get sticky sidebar inner wrapper, if not found, will create one.\r\n if( this.options.innerWrapperSelector ){\r\n this.sidebarInner = this.sidebar.querySelector(this.options.innerWrapperSelector);\r\n \r\n if( null === this.sidebarInner )\r\n this.sidebarInner = false;\r\n }\r\n \r\n if( ! this.sidebarInner ){\r\n let wrapper = document.createElement('div');\r\n wrapper.setAttribute('class', 'inner-wrapper-sticky');\r\n this.sidebar.appendChild(wrapper);\r\n \r\n while( this.sidebar.firstChild != wrapper )\r\n wrapper.appendChild(this.sidebar.firstChild);\r\n \r\n this.sidebarInner = this.sidebar.querySelector('.inner-wrapper-sticky');\r\n }\r\n \r\n // Container wrapper of the sidebar.\r\n if( this.options.containerSelector ){\r\n let containers = document.querySelectorAll(this.options.containerSelector);\r\n containers = Array.prototype.slice.call(containers);\r\n \r\n containers.forEach((container, item) => {\r\n if( ! container.contains(this.sidebar) ) return;\r\n this.container = container;\r\n });\r\n \r\n if( ! containers.length )\r\n throw new Error(\"The container does not contains on the sidebar.\");\r\n }\r\n \r\n // If top/bottom spacing is not function parse value to integer.\r\n if( 'function' !== typeof this.options.topSpacing )\r\n this.options.topSpacing = parseInt(this.options.topSpacing) || 0;\r\n \r\n if( 'function' !== typeof this.options.bottomSpacing )\r\n this.options.bottomSpacing = parseInt(this.options.bottomSpacing) || 0;\r\n \r\n // Breakdown sticky sidebar if screen width below `options.minWidth`.\r\n this._widthBreakpoint();\r\n \r\n // Calculate dimensions of sidebar, container and viewport.\r\n this.calcDimensions();\r\n \r\n // Affix sidebar in proper position.\r\n this.stickyPosition();\r\n \r\n // Bind all events.\r\n this.bindEvents();\r\n \r\n // Inform other properties the sticky sidebar is initialized.\r\n this._initialized = true;\r\n }\r\n \r\n /**\r\n * Bind all events of sticky sidebar plugin.\r\n * @protected\r\n */\r\n bindEvents(){\r\n window.addEventListener('resize', this, {passive: true, capture: false});\r\n window.addEventListener('scroll', this, {passive: true, capture: false});\r\n \r\n this.sidebar.addEventListener('update' + EVENT_KEY, this);\r\n \r\n if( this.options.resizeSensor && 'undefined' !== typeof ResizeSensor ){\r\n new ResizeSensor(this.sidebarInner, this.handleEvent);\r\n new ResizeSensor(this.container, this.handleEvent);\r\n }\r\n }\r\n \r\n /**\r\n * Handles all events of the plugin.\r\n * @param {Object} event - Event object passed from listener.\r\n */\r\n handleEvent(event){\r\n this.updateSticky(event);\r\n }\r\n \r\n /**\r\n * Calculates dimensions of sidebar, container and screen viewpoint\r\n * @public\r\n */\r\n calcDimensions(){\r\n if( this._breakpoint ) return;\r\n var dims = this.dimensions;\r\n \r\n // Container of sticky sidebar dimensions.\r\n dims.containerTop = StickySidebar.offsetRelative(this.container).top;\r\n dims.containerHeight = this.container.clientHeight;\r\n dims.containerBottom = dims.containerTop + dims.containerHeight;\r\n \r\n // Sidebar dimensions.\r\n dims.sidebarHeight = this.sidebarInner.offsetHeight;\r\n dims.sidebarWidth = this.sidebar.offsetWidth;\r\n \r\n // Screen viewport dimensions.\r\n dims.viewportHeight = window.innerHeight;\r\n \r\n this._calcDimensionsWithScroll();\r\n }\r\n \r\n /**\r\n * Some dimensions values need to be up-to-date when scrolling the page.\r\n * @private\r\n */\r\n _calcDimensionsWithScroll(){\r\n var dims = this.dimensions;\r\n \r\n dims.sidebarLeft = StickySidebar.offsetRelative(this.sidebar).left;\r\n \r\n dims.viewportTop = document.documentElement.scrollTop || document.body.scrollTop;\r\n dims.viewportBottom = dims.viewportTop + dims.viewportHeight;\r\n dims.viewportLeft = document.documentElement.scrollLeft || document.body.scrollLeft;\r\n \r\n dims.topSpacing = this.options.topSpacing;\r\n dims.bottomSpacing = this.options.bottomSpacing;\r\n \r\n if( 'function' === typeof dims.topSpacing )\r\n dims.topSpacing = parseInt(dims.topSpacing(this.sidebar)) || 0;\r\n \r\n if( 'function' === typeof dims.bottomSpacing )\r\n dims.bottomSpacing = parseInt(dims.bottomSpacing(this.sidebar)) || 0;\r\n \r\n if( 'VIEWPORT-TOP' === this.affixedType ){\r\n // Adjust translate Y in the case decrease top spacing value.\r\n if( dims.topSpacing < dims.lastTopSpacing ){\r\n dims.translateY += dims.lastTopSpacing - dims.topSpacing;\r\n this._reStyle = true; \r\n }\r\n \r\n } else if( 'VIEWPORT-BOTTOM' === this.affixedType ){\r\n // Adjust translate Y in the case decrease bottom spacing value.\r\n if( dims.bottomSpacing < dims.lastBottomSpacing ){\r\n dims.translateY += dims.lastBottomSpacing - dims.bottomSpacing;\r\n this._reStyle = true;\r\n }\r\n }\r\n \r\n dims.lastTopSpacing = dims.topSpacing;\r\n dims.lastBottomSpacing = dims.bottomSpacing;\r\n }\r\n \r\n /**\r\n * Determine whether the sidebar is bigger than viewport.\r\n * @public\r\n * @return {Boolean}\r\n */\r\n isSidebarFitsViewport(){\r\n return this.dimensions.sidebarHeight < this.dimensions.viewportHeight;\r\n }\r\n \r\n /**\r\n * Observe browser scrolling direction top and down.\r\n */\r\n observeScrollDir(){\r\n var dims = this.dimensions;\r\n if( dims.lastViewportTop === dims.viewportTop ) return;\r\n \r\n var furthest = 'down' === this.direction ? Math.min : Math.max;\r\n \r\n // If the browser is scrolling not in the same direction.\r\n if( dims.viewportTop === furthest(dims.viewportTop, dims.lastViewportTop) )\r\n this.direction = 'down' === this.direction ? 'up' : 'down';\r\n }\r\n \r\n /**\r\n * Gets affix type of sidebar according to current scrollTop and scrollLeft.\r\n * Holds all logical affix of the sidebar when scrolling up and down and when sidebar \r\n * is bigger than viewport and vice versa.\r\n * @public\r\n * @return {String|False} - Proper affix type.\r\n */\r\n getAffixType(){\r\n var dims = this.dimensions, affixType = false;\r\n \r\n this._calcDimensionsWithScroll();\r\n \r\n var sidebarBottom = dims.sidebarHeight + dims.containerTop;\r\n var colliderTop = dims.viewportTop + dims.topSpacing;\r\n var colliderBottom = dims.viewportBottom - dims.bottomSpacing;\r\n \r\n // When browser is scrolling top.\r\n if( 'up' === this.direction ){\r\n if( colliderTop <= dims.containerTop ){\r\n dims.translateY = 0;\r\n affixType = 'STATIC';\r\n \r\n } else if( colliderTop <= dims.translateY + dims.containerTop ){\r\n dims.translateY = colliderTop - dims.containerTop;\r\n affixType = 'VIEWPORT-TOP';\r\n \r\n } else if( ! this.isSidebarFitsViewport() && dims.containerTop <= colliderTop ){\r\n affixType = 'VIEWPORT-UNBOTTOM';\r\n }\r\n // When browser is scrolling up.\r\n } else {\r\n // When sidebar element is not bigger than screen viewport.\r\n if( this.isSidebarFitsViewport() ){\r\n \r\n if( dims.sidebarHeight + colliderTop >= dims.containerBottom ){\r\n dims.translateY = dims.containerBottom - sidebarBottom;\r\n affixType = 'CONTAINER-BOTTOM'; \r\n \r\n } else if( colliderTop >= dims.containerTop ){\r\n dims.translateY = colliderTop - dims.containerTop;\r\n affixType = 'VIEWPORT-TOP';\r\n }\r\n // When sidebar element is bigger than screen viewport.\r\n } else {\r\n \r\n if( dims.containerBottom <= colliderBottom ){\r\n dims.translateY = dims.containerBottom - sidebarBottom; \r\n affixType = 'CONTAINER-BOTTOM'; \r\n \r\n } else if( sidebarBottom + dims.translateY <= colliderBottom ){\r\n dims.translateY = colliderBottom - sidebarBottom;\r\n affixType = 'VIEWPORT-BOTTOM';\r\n \r\n } else if( dims.containerTop + dims.translateY <= colliderTop ){\r\n affixType = 'VIEWPORT-UNBOTTOM';\r\n }\r\n }\r\n }\r\n \r\n // Make sure the translate Y is not bigger than container height.\r\n dims.translateY = Math.max(0, dims.translateY);\r\n dims.translateY = Math.min(dims.containerHeight, dims.translateY);\r\n \r\n dims.lastViewportTop = dims.viewportTop;\r\n return affixType;\r\n }\r\n \r\n /**\r\n * Gets inline style of sticky sidebar wrapper and inner wrapper according \r\n * to its affix type.\r\n * @private\r\n * @param {String} affixType - Affix type of sticky sidebar.\r\n * @return {Object}\r\n */\r\n _getStyle(affixType){\r\n if( 'undefined' === typeof affixType ) return;\r\n \r\n var style = {inner: {}, outer: {}};\r\n var dims = this.dimensions;\r\n \r\n switch( affixType ){\r\n case 'VIEWPORT-TOP':\r\n style.inner = {position: 'fixed', top: dims.topSpacing,\r\n left: dims.sidebarLeft - dims.viewportLeft, width: dims.sidebarWidth};\r\n break;\r\n case 'VIEWPORT-BOTTOM':\r\n style.inner = {position: 'fixed', top: 'auto', left: dims.sidebarLeft,\r\n bottom: dims.bottomSpacing, width: dims.sidebarWidth};\r\n break;\r\n case 'CONTAINER-BOTTOM':\r\n case 'VIEWPORT-UNBOTTOM':\r\n let translate = this._getTranslate(0, dims.translateY + 'px');\r\n \r\n if( translate )\r\n style.inner = {transform: translate};\r\n else \r\n style.inner = {position: 'absolute', top: dims.translateY, width: dims.sidebarWidth};\r\n break;\r\n }\r\n \r\n switch( affixType ){\r\n case 'VIEWPORT-TOP':\r\n case 'VIEWPORT-BOTTOM':\r\n case 'VIEWPORT-UNBOTTOM':\r\n case 'CONTAINER-BOTTOM':\r\n style.outer = {height: dims.sidebarHeight, position: 'relative'};\r\n break;\r\n }\r\n \r\n style.outer = StickySidebar.extend({height: '', position: ''}, style.outer);\r\n style.inner = StickySidebar.extend({position: 'relative', top: '', left: '',\r\n bottom: '', width: '', transform: this._getTranslate()}, style.inner);\r\n \r\n return style;\r\n }\r\n \r\n /**\r\n * Cause the sidebar to be sticky according to affix type by adding inline\r\n * style, adding helper class and trigger events.\r\n * @function\r\n * @protected\r\n * @param {string} force - Update sticky sidebar position by force.\r\n */\r\n stickyPosition(force){\r\n if( this._breakpoint ) return;\r\n \r\n force = this._reStyle || force || false;\r\n \r\n var offsetTop = this.options.topSpacing;\r\n var offsetBottom = this.options.bottomSpacing;\r\n \r\n var affixType = this.getAffixType();\r\n var style = this._getStyle(affixType);\r\n \r\n if( (this.affixedType != affixType || force) && affixType ){\r\n let affixEvent = 'affix.' + affixType.toLowerCase().replace('viewport-', '') + EVENT_KEY;\r\n StickySidebar.eventTrigger(this.sidebar, affixEvent);\r\n \r\n if( 'STATIC' === affixType )\r\n StickySidebar.removeClass(this.sidebar, this.options.stickyClass);\r\n else\r\n StickySidebar.addClass(this.sidebar, this.options.stickyClass);\r\n \r\n for( let key in style.outer ){\r\n let _unit = ('number' === typeof style.outer[key]) ? 'px' : '';\r\n this.sidebar.style[key] = style.outer[key];\r\n }\r\n \r\n for( let key in style.inner ){\r\n let _unit = ('number' === typeof style.inner[key]) ? 'px' : '';\r\n this.sidebarInner.style[key] = style.inner[key] + _unit;\r\n }\r\n \r\n let affixedEvent = 'affixed.'+ affixType.toLowerCase().replace('viewport-', '') + EVENT_KEY;\r\n StickySidebar.eventTrigger(this.sidebar, affixedEvent);\r\n } else {\r\n if( this._initialized ) this.sidebarInner.style.left = style.inner.left;\r\n }\r\n \r\n this.affixedType = affixType;\r\n }\r\n \r\n /**\r\n * Breakdown sticky sidebar when window width is below `options.minWidth` value.\r\n * @protected\r\n */\r\n _widthBreakpoint(){\r\n \r\n if( window.innerWidth <= this.options.minWidth ){\r\n this._breakpoint = true;\r\n this.affixedType = 'STATIC';\r\n \r\n this.sidebar.removeAttribute('style');\r\n StickySidebar.removeClass(this.sidebar, this.options.stickyClass);\r\n this.sidebarInner.removeAttribute('style');\r\n } else {\r\n this._breakpoint = false;\r\n }\r\n }\r\n \r\n /**\r\n * Switches between functions stack for each event type, if there's no \r\n * event, it will re-initialize sticky sidebar.\r\n * @public\r\n */\r\n updateSticky(event = {}){\r\n if( this._running ) return;\r\n this._running = true;\r\n \r\n ((eventType) => {\r\n\r\n requestAnimationFrame(() => {\r\n switch( eventType ){\r\n // When browser is scrolling and re-calculate just dimensions\r\n // within scroll. \r\n case 'scroll':\r\n this._calcDimensionsWithScroll();\r\n this.observeScrollDir();\r\n this.stickyPosition();\r\n break;\r\n \r\n // When browser is resizing or there's no event, observe width\r\n // breakpoint and re-calculate dimensions.\r\n case 'resize':\r\n default: \r\n this._widthBreakpoint();\r\n this.calcDimensions();\r\n this.stickyPosition(true);\r\n break;\r\n }\r\n this._running = false;\r\n });\r\n })(event.type);\r\n }\r\n \r\n /**\r\n * Set browser support features to the public property.\r\n * @private\r\n */\r\n _setSupportFeatures(){\r\n var support = this.support;\r\n \r\n support.transform = StickySidebar.supportTransform();\r\n support.transform3d = StickySidebar.supportTransform(true);\r\n }\r\n \r\n /**\r\n * Get translate value, if the browser supports transfrom3d, it will adopt it.\r\n * and the same with translate. if browser doesn't support both return false.\r\n * @param {Number} y - Value of Y-axis.\r\n * @param {Number} x - Value of X-axis.\r\n * @param {Number} z - Value of Z-axis.\r\n * @return {String|False}\r\n */\r\n _getTranslate(y = 0, x = 0, z = 0){\r\n if( this.support.transform3d ) return 'translate3d(' + y +', '+ x +', '+ z +')';\r\n else if( this.support.translate ) return 'translate('+ y +', '+ x +')';\r\n else return false;\r\n }\r\n \r\n /**\r\n * Destroy sticky sidebar plugin.\r\n * @public\r\n */\r\n destroy(){\r\n window.removeEventListener('resize', this, {caption: false});\r\n window.removeEventListener('scroll', this, {caption: false});\r\n \r\n this.sidebar.classList.remove(this.options.stickyClass);\r\n this.sidebar.style.minHeight = '';\r\n \r\n this.sidebar.removeEventListener('update' + EVENT_KEY, this);\r\n \r\n var styleReset = {inner: {}, outer: {}};\r\n \r\n styleReset.inner = {position: '', top: '', left: '', bottom: '', width: '', transform: ''};\r\n styleReset.outer = {height: '', position: ''};\r\n \r\n for( let key in styleReset.outer )\r\n this.sidebar.style[key] = styleReset.outer[key];\r\n \r\n for( let key in styleReset.inner )\r\n this.sidebarInner.style[key] = styleReset.inner[key];\r\n \r\n if( this.options.resizeSensor && 'undefined' !== typeof ResizeSensor ){\r\n ResizeSensor.detach(this.sidebarInner, this.handleEvent);\r\n ResizeSensor.detach(this.container, this.handleEvent);\r\n }\r\n }\r\n \r\n /**\r\n * Determine if the browser supports CSS transform feature.\r\n * @function\r\n * @static\r\n * @param {Boolean} transform3d - Detect transform with translate3d.\r\n * @return {String}\r\n */\r\n static supportTransform(transform3d){\r\n var result = false,\r\n property = (transform3d) ? 'perspective' : 'transform',\r\n upper = property.charAt(0).toUpperCase() + property.slice(1),\r\n prefixes = ['Webkit', 'Moz', 'O', 'ms'],\r\n support = document.createElement('support'),\r\n style = support.style;\r\n \r\n (property + ' ' + prefixes.join(upper + ' ') + upper).split(' ').forEach(function(property, i) {\r\n if (style[property] !== undefined) {\r\n result = property;\r\n return false;\r\n }\r\n });\r\n return result;\r\n }\r\n \r\n /**\r\n * Trigger custom event.\r\n * @static\r\n * @param {DOMObject} element - Target element on the DOM.\r\n * @param {String} eventName - Event name.\r\n * @param {Object} data - \r\n */\r\n static eventTrigger(element, eventName, data){\r\n try{\r\n var event = new CustomEvent(eventName, {detail: data});\r\n } catch(e){\r\n var event = document.createEvent('CustomEvent');\r\n event.initCustomEvent(eventName, true, true, data);\r\n }\r\n element.dispatchEvent(event);\r\n }\r\n \r\n /**\r\n * Extend options object with defaults.\r\n * @function\r\n * @static\r\n */\r\n static extend(defaults, options){\r\n var results = {};\r\n for( let key in defaults ){\r\n if( 'undefined' !== typeof options[key] ) results[key] = options[key];\r\n else results[key] = defaults[key];\r\n }\r\n return results;\r\n }\r\n \r\n /**\r\n * Get current coordinates left and top of specific element.\r\n * @static\r\n */\r\n static offsetRelative(element){\r\n var result = {left: 0, top: 0};\r\n\r\n do{\r\n let offsetTop = element.offsetTop;\r\n let offsetLeft = element.offsetLeft;\r\n \r\n if( ! isNaN(offsetTop) )\r\n result.top += offsetTop;\r\n \r\n if( ! isNaN(offsetLeft) )\r\n result.left += offsetLeft;\r\n\r\n element = ( 'BODY' === element.tagName ) ?\r\n element.parentElement : element.offsetParent;\r\n } while(element)\r\n return result;\r\n }\r\n \r\n /**\r\n * Add specific class name to specific element.\r\n * @static \r\n * @param {ObjectDOM} element \r\n * @param {String} className \r\n */\r\n static addClass(element, className){\r\n if( ! StickySidebar.hasClass(element, className) ){\r\n if (element.classList)\r\n element.classList.add(className);\r\n else\r\n element.className += ' ' + className;\r\n }\r\n }\r\n \r\n /**\r\n * Remove specific class name to specific element\r\n * @static\r\n * @param {ObjectDOM} element \r\n * @param {String} className \r\n */\r\n static removeClass(element, className){\r\n if( StickySidebar.hasClass(element, className) ){\r\n if (element.classList)\r\n element.classList.remove(className);\r\n else\r\n element.className = element.className.replace(new RegExp('(^|\\\\b)' + className.split(' ').join('|') + '(\\\\b|$)', 'gi'), ' ');\r\n }\r\n }\r\n\r\n /**\r\n * Determine weather the element has specific class name.\r\n * @static\r\n * @param {ObjectDOM} element \r\n * @param {String} className \r\n */\r\n static hasClass(element, className){\r\n if (element.classList)\r\n return element.classList.contains(className);\r\n else\r\n return new RegExp('(^| )' + className + '( |$)', 'gi').test(element.className);\r\n }\r\n }\r\n \r\n return StickySidebar;\r\n })();\r\n \r\n export default StickySidebar;\r\n \r\n // Global\r\n // -------------------------\r\n window.StickySidebar = StickySidebar;","import StickySidebar from \"sticky-sidebar\"\nimport * as jQuery from 'jquery'\nimport './click_handlers'\nimport './button_scrolling'\nimport mixpanel from 'mixpanel-browser';\nimport \"../src/mixpanel_setup\"\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n var sidebar = new StickySidebar('#sidebar', {\n containerSelector: '#wrapper',\n innerWrapperSelector: '.sidebar__inner',\n topSpacing: 130,\n bottomSpacing: 50\n })\n\n const myButton = document.getElementById(\"topButton\")\n if (myButton) {\n myButton.onclick = function() {\n goToTopOfTableOfContents()\n }\n \n // When the user scrolls down below Menu, show the button\n window.onscroll = function () { \n scrollFunction(myButton) \n }\n }\n\n mixpanel.track('Page View')\n\n setupClicks()\n});\n\n\nfunction scrollFunction(topButton: HTMLElement) {\n const menu = document.getElementById(\"menu-list\");\n if (menu) {\n var menuY = menu.offsetTop;\n if (document.body.scrollTop > menuY || document.documentElement.scrollTop > menuY) {\n topButton.style.display = \"flex\";\n } else {\n topButton.style.display = \"none\";\n }\n }\n}\n\n// When the user clicks on the button, scroll to the top of the document\nfunction goToTopOfTableOfContents() {\n const menu = document.getElementById(\"menu-list\");\n if (!menu) { return }\n var menuY = menu.offsetTop;\n jQuery('html, body').animate({ scrollTop: menuY }, 'fast');\n}\n\nfunction setupClicks() {\n mixpanel.track_links(\"a\", \"Click Link\")\n}","// NOTE: this is a duplicate of what is Asset Pipeline JS folder\nimport * as $ from 'jquery'\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n // Select all links with hashes\n $('a[href*=\"#\"]')\n // Remove links that don't actually link to anything\n .not('[href=\"#\"]')\n .not('[href=\"#0\"]')\n .on('click', function(event) {\n event.preventDefault();\n // On-page links\n if (\n location.pathname.replace(/^\\//, '') == this.pathname.replace(/^\\//, '') \n && \n location.hostname == this.hostname\n ) {\n // Figure out element to scroll to\n var target = $(this.hash);\n target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');\n // Does a scroll target exist?\n if (target.length) {\n // Only prevent default if animation is actually gonna happen\n event.preventDefault();\n $('html, body').animate({\n scrollTop: target.offset().top\n }, 1000, function() {\n // Callback after animation\n });\n }\n }\n });\n})\n\n","// NOTE: this is a duplicate of what is Asset Pipeline JS folder\nimport * as $ from 'jquery'\n\ndocument.addEventListener(\"DOMContentLoaded\", function() {\n // execute this after google analytics tracker has loaded\n // ga(function(tracker) {\n // $('.gumroad-button').click(function(event) {\n // tracker.send({\n // hitType: 'event',\n // eventCategory: 'Buy Button',\n // eventAction: 'Click',\n // eventLabel: 'Gumroad Button'\n // });\n // });\n // });\n\n\n // google ads signup tracking upon convertkit sign up button click\n $('#ck_subscribe_button').click(function(event) {\n gtag_report_signup_conversion();\n });\n\n})","import mixpanel from 'mixpanel-browser';\n\nconst shouldDebug = process.env.NODE_ENV === \"development\"\n\n// TODO: move this key to an ENV variable\nvar mixpanelToken = 'development'\nif (process.env.NODE_ENV === \"production\") {\n mixpanelToken = 'd7e440af2190abfd91a52de5b55ea110'\n}\n\nmixpanel.init(mixpanelToken, { debug: shouldDebug }); "],"names":["StickySidebar","EVENT_KEY","DEFAULTS","topSpacing","bottomSpacing","containerSelector","innerWrapperSelector","stickyClass","resizeSensor","minWidth","constructor","sidebar","options","this","extend","document","querySelector","Error","sidebarInner","container","parentElement","affixedType","direction","support","transform","transform3d","_initialized","_reStyle","_breakpoint","_resizeListeners","dimensions","translateY","lastTopSpacing","lastBottomSpacing","sidebarHeight","sidebarWidth","containerTop","containerHeight","viewportHeight","viewportTop","lastViewportTop","forEach","method","bind","initialize","_setSupportFeatures","wrapper","createElement","setAttribute","appendChild","firstChild","containers","querySelectorAll","Array","prototype","slice","call","item","contains","length","parseInt","_widthBreakpoint","calcDimensions","stickyPosition","bindEvents","window","addEventListener","passive","capture","ResizeSensor","handleEvent","event","updateSticky","dims","offsetRelative","top","clientHeight","containerBottom","offsetHeight","offsetWidth","innerHeight","_calcDimensionsWithScroll","sidebarLeft","left","documentElement","scrollTop","body","viewportBottom","viewportLeft","scrollLeft","isSidebarFitsViewport","observeScrollDir","furthest","Math","min","max","getAffixType","affixType","sidebarBottom","colliderTop","colliderBottom","_getStyle","style","inner","outer","position","width","bottom","translate","_getTranslate","height","force","affixEvent","toLowerCase","replace","eventTrigger","removeClass","addClass","key","_unit","affixedEvent","innerWidth","removeAttribute","_running","eventType","requestAnimationFrame","type","supportTransform","y","x","z","destroy","removeEventListener","caption","classList","remove","minHeight","styleReset","detach","static","result","property","upper","charAt","toUpperCase","join","split","i","undefined","element","eventName","data","CustomEvent","detail","e","createEvent","initCustomEvent","dispatchEvent","defaults","results","offsetTop","offsetLeft","isNaN","tagName","offsetParent","className","hasClass","add","RegExp","test","myButton","getElementById","onclick","menu","menuY","jQuery","animate","goToTopOfTableOfContents","onscroll","topButton","display","scrollFunction","mixpanel","$","not","on","preventDefault","location","pathname","hostname","target","hash","offset","click","gtag_report_signup_conversion","mixpanelToken","debug","process"],"sourceRoot":""}