UNPKG

24 kBSource Map (JSON)View Raw
1{"version":3,"file":"scrollnav.min.js","sources":["../src/util/extend.js","../src/util/getYPosition.js","../src/util/populateSectionData.js","../src/util/getOrSetID.js","../src/util/nextUntil.js","../src/util/createNav.js","../src/util/createList.js","../src/util/updatePositionData.js","../src/util/getTargetYPosition.js","../src/util/easing.js","../src/scrollnav.js","../src/scrollTo.js","../src/util/calculateScrollDuration.js","../src/setupScrollHandler.js","../src/util/getActiveSection.js","../src/util/updateActiveNavItem.js","../src/util/insertNav.js","../src/util/insertVisualDebugger.js","../src/setupClickHandlers.js","../src/setupResizeHandler.js","../src/teardownClickHandlers.js","../src/teardownScrollHandler.js","../src/teardownResizeHandler.js"],"sourcesContent":["/* Borrowed from https://gist.github.com/cferdinandi/4f8a0e17921c5b46e6c4 */\n\nexport default function extend(defaults, options) {\n const extended = {};\n let prop;\n\n for (prop in defaults) {\n if (Object.prototype.hasOwnProperty.call(defaults, prop)) {\n extended[prop] = defaults[prop];\n }\n }\n\n for (prop in options) {\n if (Object.prototype.hasOwnProperty.call(options, prop)) {\n extended[prop] = options[prop];\n }\n }\n\n return extended;\n}\n","export default function getYPosition(elem, parent) {\n if (typeof elem !== 'object') {\n return Promise.reject(new Error('First argument must be an object'));\n }\n\n parent = parent || document.body;\n if (typeof parent !== 'object') {\n return Promise.reject(new Error('Second argument must be an object'));\n }\n\n const bodyRect = parent.getBoundingClientRect();\n const elemRect = elem.getBoundingClientRect();\n\n return elemRect.top - bodyRect.top;\n}\n","import getOrSetID from './getOrSetID';\nimport getYPosition from './getYPosition';\nimport nextUntil from './nextUntil';\n\nexport default function populateSectionData(\n sections,\n settings,\n prefix = 'scroll-nav'\n) {\n const sectionData = [];\n prefix = prefix + '__';\n\n sections.forEach((elem, i) => {\n let subSectionData = [];\n const id = getOrSetID(elem, prefix + (i + 1));\n\n if (settings.subSections && elem.matches(settings.sections)) {\n const subSectionDom = nextUntil(\n elem,\n settings.sections,\n settings.subSections\n );\n subSectionData = populateSectionData(subSectionDom, settings, id);\n }\n\n sectionData.push({\n id: id,\n text: elem.innerText || elem.textContent,\n offsetTop: getYPosition(elem),\n subSections: subSectionData\n });\n });\n\n return sectionData;\n}\n","export default function getOrSetID(elem, setID) {\n if (typeof elem !== 'object') {\n return Promise.reject(new Error('First argument must be an object'));\n }\n\n let id = elem.id;\n\n if (!id) {\n if (typeof setID !== 'string') {\n return Promise.reject(new Error('Second argument must be a string'));\n }\n\n id = setID;\n elem.id = id;\n }\n return id;\n}\n","/* Borrowed from https://github.com/cferdinandi/nextUntil */\n\nexport default function nextUntil(elem, selector, filter) {\n var siblings = [];\n\n elem = elem.nextElementSibling;\n\n while (elem) {\n if (elem.matches(selector)) break;\n\n if (filter && !elem.matches(filter)) {\n elem = elem.nextElementSibling;\n continue;\n }\n\n siblings.push(elem);\n\n elem = elem.nextElementSibling;\n }\n\n return siblings;\n}\n","import createList from './createList';\n\nexport default function createNav(data) {\n const nav = document.createElement('nav');\n nav.className = 'scroll-nav';\n nav.innerHTML = createList(data);\n\n return nav;\n}\n","export default function createList(data, isSubList = false) {\n const suffix = isSubList ? '__sub-' : '__';\n const baseClass = 'scroll-nav' + suffix;\n\n const itemsMarkup = `\n ${data\n .map(\n item =>\n `<li class=\"${baseClass}item\" data-sn-section=\"${item.id}\">\n <a class=\"${baseClass}link\" href=\"#${item.id}\">${item.text}</a>\n ${\n item.subSections && item.subSections.length\n ? `${createList(item.subSections, true)}`\n : ''\n }\n </li>`\n )\n .join('')}\n `;\n\n const list = `\n <ol class=\"${baseClass}list\">\n ${itemsMarkup}\n </ol>\n `;\n\n return list;\n}\n","import getYPosition from './getYPosition';\n\nexport default function updatePositionData(data) {\n data.forEach(section => {\n const sectionDom = document.querySelector(`#${section.id}`);\n section.offsetTop = getYPosition(sectionDom);\n\n if (section.subSections.length) {\n section.subSections = updatePositionData(section.subSections);\n }\n });\n\n return data;\n}\n","export default function getTargetYPosition(target, data) {\n let id = target.getAttribute('href');\n if (id.charAt(0) === '#') {\n id = id.substr(1);\n }\n\n const targetSection = filterData(data, id);\n\n return targetSection.offsetTop;\n}\n\nfunction filterData(data, id) {\n let targetSection;\n\n data.forEach(section => {\n if (section.id === id) {\n targetSection = section;\n }\n\n if (section.subSections && targetSection === undefined) {\n targetSection = filterData(section.subSections, id);\n }\n });\n\n return targetSection;\n}\n","/* Borrowed from https://gist.github.com/gre/1650294#gistcomment-1806616 */\n\nconst easeIn = p => t => Math.pow(t, p);\nconst easeOut = p => t => 1 - Math.abs(Math.pow(t - 1, p));\nconst easeInOut = p => t =>\n t < 0.5 ? easeIn(p)(t * 2) / 2 : easeOut(p)(t * 2 - 1) / 2 + 0.5;\n\nconst easing = {\n linear: easeInOut(1),\n easeInQuad: easeIn(2),\n easeOutQuad: easeOut(2),\n easeInOutQuad: easeInOut(2),\n easeInCubic: easeIn(3),\n easeOutCubic: easeOut(3),\n easeInOutCubic: easeInOut(3),\n easeInQuart: easeIn(4),\n easeOutQuart: easeOut(4),\n easeInOutQuart: easeInOut(4),\n easeInQuint: easeIn(5),\n easeOutQuint: easeOut(5),\n easeInOutQuint: easeInOut(5)\n};\n\nexport { easing };\n","/*\n * scrollnav\n * http://scrollnav.com\n *\n * Copyright (c) 2013-2018 James Wilson\n * Licensed under the MIT license.\n */\n\nimport extend from './util/extend';\nimport populateSectionData from './util/populateSectionData';\nimport createNav from './util/createNav';\nimport insertNav from './util/insertNav';\nimport updatePositionData from './util/updatePositionData';\nimport insertVisualDebugger from './util/insertVisualDebugger';\nimport setupClickHandlers from './setupClickHandlers';\nimport setupScrollHandler from './setupScrollHandler';\nimport setupResizeHandler from './setupResizeHandler';\nimport teardownClickHandlers from './teardownClickHandlers';\nimport teardownScrollHandler from './teardownScrollHandler';\nimport teardownResizeHandler from './teardownResizeHandler';\n\nlet clickHandler;\nlet scrollHandler;\nlet resizeHandler;\n\n// matches() polyfill\n/* istanbul ignore next */\nif (!Element.prototype.matches) {\n Element.prototype.matches =\n Element.prototype.msMatchesSelector ||\n Element.prototype.webkitMatchesSelector;\n}\n\nfunction isElement(element) {\n return element instanceof Element;\n}\n\nfunction init(elem, options) {\n const defaults = {\n sections: 'h2',\n insertTarget: elem,\n insertLocation: 'before',\n easingStyle: 'easeOutQuad',\n updateHistory: true\n };\n this.settings = extend(defaults, options);\n const locationOptions = ['append', 'prepend', 'after', 'before'];\n\n if (!isElement(elem)) {\n if (this.settings.debug) {\n // eslint-disable-next-line no-console\n console.error(`\n scrollnav build failed, content argument \"${elem}\" is not an HTML Element\n `);\n }\n return;\n }\n\n if (this.settings.insertTarget && !isElement(this.settings.insertTarget)) {\n if (this.settings.debug) {\n // eslint-disable-next-line no-console\n console.error(`\n scrollnav build failed, options.insertTarget \"${elem}\" is not an HTML Element\n `);\n }\n return;\n }\n\n if (!locationOptions.includes(this.settings.insertLocation)) {\n if (this.settings.debug) {\n // eslint-disable-next-line no-console\n console.error(`\n scrollnav build failed, options.insertLocation \"${\n this.settings.insertLocation\n }\" is not a valid option\n `);\n }\n return;\n }\n\n const sectionsDom = elem.querySelectorAll(this.settings.sections);\n\n if (!sectionsDom.length) {\n if (this.settings.debug) {\n // eslint-disable-next-line no-console\n console.error(`\n scrollnav build failed, could not find any \"${this.settings.sections}\"\n elements inside of \"${elem}\"\n `);\n }\n return;\n }\n\n this.data = populateSectionData(sectionsDom, this.settings);\n this.nav = createNav(this.data);\n\n insertNav(this);\n clickHandler = setupClickHandlers(this);\n scrollHandler = setupScrollHandler(this);\n resizeHandler = setupResizeHandler(this);\n\n if (this.settings.debug) insertVisualDebugger();\n if (this.settings.onInit) return this.settings.onInit();\n}\n\nfunction destroy(options) {\n this.settings = extend(this.settings, options);\n\n teardownClickHandlers(this.nav, clickHandler);\n teardownScrollHandler(scrollHandler);\n teardownResizeHandler(resizeHandler);\n this.nav.remove();\n\n if (this.settings.onDestroy) return this.settings.onDestroy();\n}\n\nfunction updatePositions(options) {\n this.settings = extend(this.settings, options);\n this.data = updatePositionData(this.data);\n\n if (this.settings.onUpdatePositions) return this.settings.onUpdatePositions();\n}\n\nconst scrollnav = {\n init: init,\n destroy: destroy,\n updatePositions: updatePositions\n};\n\nexport default scrollnav;\n","import calculateScrollDuration from './util/calculateScrollDuration';\nimport { easing } from './util/easing';\n\n/* istanbul ignore next */\nexport default function scrollTo(targetPosition, easingStyle) {\n return new Promise((resolve, reject) => {\n if (typeof targetPosition !== 'number') {\n return reject(new Error('First argument must be a number'));\n }\n\n easingStyle = easingStyle || 'linear';\n if (typeof easingStyle !== 'string') {\n return reject(new Error('Second argument must be a string'));\n }\n\n const startingPosition = window.pageYOffset;\n const distance = targetPosition - startingPosition;\n const duration = calculateScrollDuration(distance);\n const framerate = 50;\n const increment = 1000 / framerate;\n let ellapsedTime = 0;\n let easedTime;\n let next;\n\n function animateScroll() {\n ellapsedTime += increment;\n easedTime = easing[easingStyle](ellapsedTime / duration);\n next = easedTime * distance + startingPosition;\n window.scroll(0, next);\n\n if (ellapsedTime < duration) {\n setTimeout(animateScroll, increment);\n } else {\n resolve(window.pageYOffset);\n }\n }\n\n animateScroll();\n });\n}\n","export default function calculateScrollDuration(distance) {\n const halfDistance = Math.abs(distance / 2);\n\n return Math.min(Math.max(halfDistance, 250), 1200);\n}\n","import getActiveSection from './util/getActiveSection';\nimport updateActiveNavItem from './util/updateActiveNavItem';\n\nexport default function setupScrollHandler(scrollnav) {\n function scrollHandler() {\n const top = window.scrollY || window.pageYOffset || document.body.scrollTop;\n const boundryTop = top;\n const boundryBottom = top + window.innerHeight * 0.4;\n const activeSection = getActiveSection(\n scrollnav.data,\n boundryTop,\n boundryBottom\n );\n\n updateActiveNavItem(activeSection, scrollnav.nav);\n\n return activeSection;\n }\n\n window.addEventListener('scroll', scrollHandler);\n\n return scrollHandler;\n}\n","export default function getActiveSection(data, boundryTop, boundryBottom) {\n let activeSection;\n\n data.forEach(section => {\n if (section.offsetTop > boundryBottom) {\n if (!activeSection && section.offsetTop < boundryTop) {\n activeSection = section;\n }\n } else {\n activeSection = section;\n }\n });\n\n if (activeSection && activeSection.subSections.length) {\n let activeSubSection;\n\n activeSubSection = getActiveSection(\n activeSection.subSections,\n boundryTop,\n boundryBottom\n );\n\n if (activeSubSection) {\n activeSection = activeSubSection;\n }\n }\n\n return activeSection;\n}\n","export default function updateActiveNavItem(activeSection, nav) {\n const previousActive = nav.querySelector('[data-sn-active]');\n\n if (!activeSection) {\n if (previousActive) {\n previousActive.classList.remove('scroll-nav__item--active');\n previousActive.removeAttribute('data-sn-active');\n }\n\n return;\n }\n\n const newActive = nav.querySelector(\n '[data-sn-section=' + activeSection.id + ']'\n );\n\n if (newActive && newActive !== previousActive) {\n if (previousActive) {\n previousActive.classList.remove('scroll-nav__item--active');\n previousActive.removeAttribute('data-sn-active');\n }\n newActive.classList.add('scroll-nav__item--active');\n newActive.setAttribute('data-sn-active', true);\n }\n}\n","export default function insertNav(scrollnav) {\n const target = scrollnav.settings.insertTarget;\n const location = scrollnav.settings.insertLocation;\n\n if (location === 'append') {\n target.appendChild(scrollnav.nav);\n } else if (location === 'prepend') {\n target.insertBefore(scrollnav.nav, target.firstChild);\n } else if (location === 'before') {\n target.parentNode.insertBefore(scrollnav.nav, target);\n } else if (location === 'after') {\n target.parentNode.insertBefore(scrollnav.nav, target.nextSibling);\n }\n}\n","export default function insertVisualDebugger() {\n const snDebugger = document.createElement('div');\n snDebugger.className = 'snDebugger';\n\n snDebugger.setAttribute(\n 'style',\n `\n position: fixed;\n top: 40%;\n height: 0px;\n border-bottom:5px solid red;\n border-top: 5px solid blue;\n width: 100%;\n opacity: .5;\n pointer-events: none;\n `\n );\n\n document.body.appendChild(snDebugger);\n}\n","import getTargetYPosition from './util/getTargetYPosition';\nimport scrollTo from './scrollTo';\n\nexport default function setupClickHandlers(scrollnav) {\n const settings = scrollnav.settings;\n function clickHandler(event) {\n event.preventDefault();\n\n const activeArea = window.innerHeight * 0.39;\n const targetYPosition = getTargetYPosition(event.target, scrollnav.data);\n const scrollYTarget = targetYPosition - activeArea;\n\n /* istanbul ignore next */\n return scrollTo(scrollYTarget, settings.easingStyle).then(() => {\n if (settings.updateHistory) {\n history.replaceState({}, '', event.target.getAttribute('href'));\n }\n\n if (settings.onScroll) {\n settings.onScroll();\n }\n });\n }\n\n const links = scrollnav.nav.querySelectorAll('a');\n links.forEach(link => {\n link.addEventListener('click', clickHandler);\n });\n\n return clickHandler;\n}\n","import updatePositionData from './util/updatePositionData';\n\nexport default function setupResizeHandler(scrollnav) {\n function resizeHandler() {\n scrollnav.data = updatePositionData(scrollnav.data);\n }\n\n window.addEventListener('resize', resizeHandler);\n\n return resizeHandler;\n}\n","export default function teardownClickHandlers(nav, clickHandler) {\n const links = nav.querySelectorAll('a');\n links.forEach(link => {\n link.removeEventListener('click', clickHandler);\n });\n}\n","export default function teardownScrollHandler(scrollHandler) {\n window.removeEventListener('scroll', scrollHandler);\n}\n","export default function teardownResizelHandler(resizeHandler) {\n window.removeEventListener('resize', resizeHandler);\n}\n"],"names":["extend","defaults","options","prop","extended","Object","prototype","hasOwnProperty","call","getYPosition","elem","parent","Promise","reject","Error","document","body","bodyRect","getBoundingClientRect","top","populateSectionData","sections","settings","prefix","sectionData","forEach","i","subSectionData","id","setID","getOrSetID","subSections","matches","selector","filter","siblings","nextElementSibling","push","nextUntil","text","innerText","textContent","offsetTop","createNav","data","nav","createElement","className","innerHTML","createList","isSubList","baseClass","itemsMarkup","map","item","length","join","updatePositionData","section","sectionDom","querySelector","getTargetYPosition","target","getAttribute","charAt","substr","filterData","targetSection","undefined","const","clickHandler","scrollHandler","resizeHandler","easeIn","p","t","Math","pow","easeOut","abs","easeInOut","easing","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","scrollTo","targetPosition","easingStyle","resolve","easedTime","startingPosition","window","pageYOffset","distance","duration","halfDistance","min","max","calculateScrollDuration","increment","ellapsedTime","animateScroll","scroll","setTimeout","setupScrollHandler","scrollnav","scrollY","scrollTop","boundryBottom","innerHeight","activeSection","getActiveSection","boundryTop","activeSubSection","previousActive","newActive","classList","remove","removeAttribute","add","setAttribute","updateActiveNavItem","addEventListener","isElement","element","Element","msMatchesSelector","webkitMatchesSelector","init","insertTarget","insertLocation","updateHistory","this","includes","location","snDebugger","sectionsDom","querySelectorAll","appendChild","insertBefore","firstChild","parentNode","nextSibling","event","preventDefault","activeArea","then","history","replaceState","onScroll","link","setupClickHandlers","setupResizeHandler","debug","onInit","console","error","destroy","removeEventListener","teardownClickHandlers","teardownScrollHandler","teardownResizeHandler","onDestroy","updatePositions","onUpdatePositions"],"mappings":"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"}
\No newline at end of file