diff --git a/dist/index.esm.js b/dist/index.esm.js
index 4d1299e369efedb73b09775ea74006ea384d86e1..cb5748963a27688ea14386199ecafc023c75bec7 100644
--- a/dist/index.esm.js
+++ b/dist/index.esm.js
@@ -181,15 +181,20 @@ function initializeOnLoadScroll() {
     var hashTarget = null;
     var start = performance.now();
     document.addEventListener('DOMContentLoaded', function () {
-        hashTarget = HashTarget.fromString(hash, document);
+        try {
+            hashTarget = HashTarget.fromString(hash, document);
+        }
+        catch (e) { }
     });
     window.addEventListener('load', function () {
+        if (hashTarget === null) {
+            return;
+        }
         var end = performance.now();
         if (end - start > 500) {
             return;
         }
         window.scroll({ top: 0, left: 0 });
-        assert(hashTarget !== null, 'Hash target should be set on DOM loaded.');
         scrollToTarget(hashTarget);
     });
 }
diff --git a/dist/index.esm.js.map b/dist/index.esm.js.map
index 051c7abc6925c73e77fb94b8159356040dfef925..adf4987b1d5b5b53d1904fbb3ab016d80c02cb72 100644
--- a/dist/index.esm.js.map
+++ b/dist/index.esm.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.esm.js","sources":["../src/easing/bindEasingToVelocity.js","../src/HashTarget.ts","../src/scrollers/scrollToElement.ts","../node_modules/tslib/tslib.es6.js","../src/assert.ts","../src/scrollers/scrollToTarget.ts","../src/handlers/loadScroll/initializeOnLoadScroll.ts","../src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts","../src/scrollers/scrollToOffset.ts","../src/index.ts"],"sourcesContent":["export const EASE_IN_SKIP_OUT_EASING = 'ease-in-skip-out';\r\n\r\n// e.g. (5, 5, 10, 500, 1000) => 500\r\n// e.g. (5, 0, 10, 500, 1000) => 750\r\nconst mapIntervalLinear = (number, originalFrom, originalTo, newFrom, newTo) => {\r\n\tconst oldDistance = originalTo - originalFrom;\r\n\tconst newDistance = newTo - newFrom;\r\n\r\n\t// normalize value into interval 0 .. 1\r\n\tconst normalized = (number - originalFrom) / oldDistance;\r\n\t// extend and move normalized value into new interval\r\n\treturn (normalized * newDistance) + newFrom;\r\n};\r\n\r\n/**\r\n * Composes easings together, splits time into half.\r\n *\r\n * @param firstHalfEasingFn first half of easing\r\n * @param secondHalfEasingFn second half of easing\r\n * @return {function(*=, *=, *=)} the composed easing\r\n */\r\nconst composeEasing = (firstHalfEasingFn, secondHalfEasingFn) => {\r\n\r\n\t// time: The call's completion percentage (decimal value).\r\n\t// opts (optional): The options object passed into the triggering Velocity call.\r\n\t// tweenDelta (optional): The difference between the animating property's ending value and its starting value.\r\n\treturn (time, opts, tweenDelta) => {\r\n\t\tif (time < 0.5) {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0, 0.5, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(firstHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0, 0.5); // map  1 - 0   =>   0 - 0.5\r\n\r\n\t\t} else {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0.5, 1, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(secondHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0.5, 1); // map  1 - 0   =>   0 - 0.5\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst computeHowMuchToSkip = (tweenDelta) => {\r\n\tconst howManyScreens = Math.abs(tweenDelta) / window.innerHeight;\r\n\r\n\t// 0 .. 1 (percents)\r\n\tlet howMuchToSkip = 0;\r\n\r\n\t// by testing in browser we have found following values as smooth:\r\n\t// howManyScreens .. howMuchToSkip\r\n\t// 1 .. 0%\r\n\t// 2 .. 0%\r\n\t// 3 .. 30%\r\n\t// 8 .. 60%\r\n\t// 30 .. 85%\r\n\t// 60 .. 90%\r\n\t// 100 .. 90%\r\n\tif (howManyScreens <= 2) {\r\n\t\thowMuchToSkip = 0;\r\n\t} else if (howManyScreens <= 4) { // 2 - 4 screens; skip 0% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 2, 4, 0, 0.3);\r\n\t} else if (howManyScreens <= 8) { // 4 - 8 screens; skip 30% - 60% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 4, 8, 0.3, 0.6);\r\n\t} else if (howManyScreens <= 30) { // 8 - 30 screens; skip 60% - 85% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 8, 30, 0.6, 0.85);\r\n\t} else if (howManyScreens <= 60) { // 30 - 60 screens; skip 85% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 30, 60, 0.85, 0.9);\r\n\t} else { // > 60 screens; skip 90% of content\r\n\t\thowMuchToSkip = 0.9;\r\n\t}\r\n\r\n\treturn howMuchToSkip;\r\n};\r\n\r\nconst bindEasingToVelocity = (velocity) => {\r\n\tvelocity.Easings[EASE_IN_SKIP_OUT_EASING] = composeEasing(\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-in'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\t0, 1 - computeHowMuchToSkip(tweenDelta), // to interval\r\n\t\t),\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-out'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\tcomputeHowMuchToSkip(tweenDelta), 1, // to interval\r\n\t\t),\r\n\t);\r\n};\r\n\r\nexport default bindEasingToVelocity;\r\n","/**\r\n * Represents valid hash as per https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash\r\n */\r\nexport class HashTarget\r\n{\r\n\tprivate constructor(\r\n\t\tprivate readonly value: string,\r\n\t\tprivate readonly targetElement: HTMLElement,\r\n\t) {}\r\n\r\n\tpublic static fromString(value: string, document: HTMLDocument): HashTarget\r\n\t{\r\n\t\tif (value === '' || value === '#') {\r\n\t\t\tthrow new Error('Hash does not contain any fragment.');\r\n\t\t}\r\n\r\n\t\tconst targetElementId = value.substring(1);\r\n\t\tconst targetElement = document.getElementById(targetElementId);\r\n\t\tif (targetElement === null) {\r\n\t\t\tthrow new Error(`No referenced element with ID ${targetElementId} exists.`);\r\n\t\t}\r\n\r\n\t\treturn new this(value, targetElement);\r\n\t}\r\n\r\n\tpublic getHash(): string\r\n\t{\r\n\t\treturn this.value;\r\n\t}\r\n\r\n\tpublic getElement(): HTMLElement\r\n\t{\r\n\t\treturn this.targetElement;\r\n\t}\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToElement(element: HTMLElement, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tVelocity.animate(element, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: () => onScrollFinishedCallback !== undefined && onScrollFinishedCallback(),\r\n\t});\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n        to[j] = from[i];\r\n    return to;\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export class AssertionError extends Error {}\r\nexport function assert(condition: any, message?: string): asserts condition {\r\n\tif ( ! condition) {\r\n\t\tthrow new AssertionError(message);\r\n\t}\r\n}\r\n","import {HashTarget} from '../HashTarget';\r\nimport {scrollToElement} from './scrollToElement';\r\nimport {assert} from '../assert';\r\n\r\nexport function scrollToTarget(hashTarget: HashTarget|string, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tif (typeof hashTarget === 'string') {\r\n\t\thashTarget = HashTarget.fromString(hashTarget, document);\r\n\t}\r\n\r\n\tscrollToElement(\r\n\t\thashTarget.getElement(),\r\n\t\t() => {\r\n\t\t\tassert(hashTarget instanceof HashTarget);\r\n\t\t\twindow.location.hash = hashTarget.getHash();\r\n\t\t\tonScrollFinishedCallback !== undefined && onScrollFinishedCallback();\r\n\t\t},\r\n\t);\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {HashTarget} from '../../HashTarget';\r\nimport {assert} from '../../assert';\r\n\r\n/**\r\n * Scrolls smoothly to an element if there is a hash in the URL.\r\n * E.g. you have `#example` in URL, then it scrolls to element with id `example`.\r\n *\r\n * Note:\r\n * Because of UX, this behaviour is limited only when whole document is loaded in less than 500ms.\r\n * Otherwise, it jumps directly to desired element without smooth scrolling, because too visible jumping through the page would appear.\r\n */\r\nexport function initializeOnLoadScroll(): void\r\n{\r\n\tconst hash = window.location.hash;\r\n\tif (hash === '' || hash === '#') {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet hashTarget: HashTarget|null = null;\r\n\tconst start = performance.now();\r\n\r\n\tdocument.addEventListener('DOMContentLoaded', () => {\r\n\t\thashTarget = HashTarget.fromString(hash, document);\r\n\t});\r\n\r\n\t/**\r\n\t * The `load` event has been chosen intentionally as it is the state when everything is ready -\r\n\t * all styles are loaded and offsets are computed correctly - so the scroll will be computed correctly.\r\n\t */\r\n\twindow.addEventListener('load', () => {\r\n\t\tconst end = performance.now();\r\n\r\n\t\t// If difference between start and stop is greater than 500ms, do nothing.\r\n\t\tif (end - start > 500) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// First, we need to go to top immediately (hack to prevent jump to desired element).\r\n\t\twindow.scroll({top: 0, left: 0});\r\n\r\n\t\t// Then, scroll down to it smoothly.\r\n\t\tassert(hashTarget !== null, 'Hash target should be set on DOM loaded.');\r\n\t\tscrollToTarget(hashTarget);\r\n\t});\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {assert} from '../../assert';\r\nimport {HashTarget} from '../../HashTarget';\r\n\r\nexport function initializeOnLinkClickScroll(): void\r\n{\r\n\tdocument.addEventListener('DOMContentLoaded', () =>\r\n\t\tdocument.querySelectorAll('a[href^=\"#\"]').forEach((item) =>\r\n\t\t\titem.addEventListener('click', (event) => {\r\n\t\t\t\tconst element = event.currentTarget as HTMLAnchorElement;\r\n\t\t\t\tassert(element !== null);\r\n\r\n\t\t\t\tif (element.hash === '' || element.hash === '#') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tscrollToTarget(HashTarget.fromString(element.hash, document));\r\n\t\t\t})));\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToOffset(\r\n\ttopOffset: number,\r\n\tonScrollFinishedCallback?: () => void,\r\n): void\r\n{\r\n\t/**\r\n\t * Setting `<html>` as the element to scroll to with offset simulates `window.scrollTo()` behavior.\r\n\t * See last paragraph at http://velocityjs.org/#scroll\r\n\t */\r\n\tVelocity.animate(document.documentElement, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\toffset: topOffset,\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: onScrollFinishedCallback,\r\n\t});\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport bindEasingToVelocity from './easing/bindEasingToVelocity';\r\nimport {initializeOnLoadScroll} from './handlers/loadScroll/initializeOnLoadScroll';\r\nimport {initializeOnLinkClickScroll} from './handlers/linkClickScroll/initializeOnLinkClickScroll';\r\nimport {scrollToElement} from './scrollers/scrollToElement';\r\nimport {scrollToOffset} from './scrollers/scrollToOffset';\r\nimport {scrollToTarget} from './scrollers/scrollToTarget';\r\nimport {HashTarget} from './HashTarget';\r\n\r\n\r\n// bind automatically on library import\r\nbindEasingToVelocity(Velocity);\r\n\r\n\r\nfunction handleOnLoadScroll(): void\r\n{\r\n\tinitializeOnLoadScroll();\r\n}\r\n\r\nfunction handleOnLinkClickScroll(): void\r\n{\r\n\tinitializeOnLinkClickScroll();\r\n}\r\n\r\nexport {\r\n\tHashTarget,\r\n\thandleOnLoadScroll,\r\n\thandleOnLinkClickScroll,\r\n\tscrollToElement,\r\n\tscrollToOffset,\r\n\tscrollToTarget,\r\n};\r\n"],"names":["EASE_IN_SKIP_OUT_EASING","mapIntervalLinear","number","originalFrom","originalTo","newFrom","newTo","oldDistance","newDistance","normalized","composeEasing","firstHalfEasingFn","secondHalfEasingFn","time","opts","tweenDelta","normalizedTime","computeHowMuchToSkip","howManyScreens","Math","abs","window","innerHeight","howMuchToSkip","bindEasingToVelocity","velocity","Easings"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.esm.js","sources":["../src/easing/bindEasingToVelocity.js","../src/HashTarget.ts","../src/scrollers/scrollToElement.ts","../node_modules/tslib/tslib.es6.js","../src/assert.ts","../src/scrollers/scrollToTarget.ts","../src/handlers/loadScroll/initializeOnLoadScroll.ts","../src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts","../src/scrollers/scrollToOffset.ts","../src/index.ts"],"sourcesContent":["export const EASE_IN_SKIP_OUT_EASING = 'ease-in-skip-out';\r\n\r\n// e.g. (5, 5, 10, 500, 1000) => 500\r\n// e.g. (5, 0, 10, 500, 1000) => 750\r\nconst mapIntervalLinear = (number, originalFrom, originalTo, newFrom, newTo) => {\r\n\tconst oldDistance = originalTo - originalFrom;\r\n\tconst newDistance = newTo - newFrom;\r\n\r\n\t// normalize value into interval 0 .. 1\r\n\tconst normalized = (number - originalFrom) / oldDistance;\r\n\t// extend and move normalized value into new interval\r\n\treturn (normalized * newDistance) + newFrom;\r\n};\r\n\r\n/**\r\n * Composes easings together, splits time into half.\r\n *\r\n * @param firstHalfEasingFn first half of easing\r\n * @param secondHalfEasingFn second half of easing\r\n * @return {function(*=, *=, *=)} the composed easing\r\n */\r\nconst composeEasing = (firstHalfEasingFn, secondHalfEasingFn) => {\r\n\r\n\t// time: The call's completion percentage (decimal value).\r\n\t// opts (optional): The options object passed into the triggering Velocity call.\r\n\t// tweenDelta (optional): The difference between the animating property's ending value and its starting value.\r\n\treturn (time, opts, tweenDelta) => {\r\n\t\tif (time < 0.5) {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0, 0.5, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(firstHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0, 0.5); // map  1 - 0   =>   0 - 0.5\r\n\r\n\t\t} else {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0.5, 1, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(secondHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0.5, 1); // map  1 - 0   =>   0 - 0.5\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst computeHowMuchToSkip = (tweenDelta) => {\r\n\tconst howManyScreens = Math.abs(tweenDelta) / window.innerHeight;\r\n\r\n\t// 0 .. 1 (percents)\r\n\tlet howMuchToSkip = 0;\r\n\r\n\t// by testing in browser we have found following values as smooth:\r\n\t// howManyScreens .. howMuchToSkip\r\n\t// 1 .. 0%\r\n\t// 2 .. 0%\r\n\t// 3 .. 30%\r\n\t// 8 .. 60%\r\n\t// 30 .. 85%\r\n\t// 60 .. 90%\r\n\t// 100 .. 90%\r\n\tif (howManyScreens <= 2) {\r\n\t\thowMuchToSkip = 0;\r\n\t} else if (howManyScreens <= 4) { // 2 - 4 screens; skip 0% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 2, 4, 0, 0.3);\r\n\t} else if (howManyScreens <= 8) { // 4 - 8 screens; skip 30% - 60% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 4, 8, 0.3, 0.6);\r\n\t} else if (howManyScreens <= 30) { // 8 - 30 screens; skip 60% - 85% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 8, 30, 0.6, 0.85);\r\n\t} else if (howManyScreens <= 60) { // 30 - 60 screens; skip 85% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 30, 60, 0.85, 0.9);\r\n\t} else { // > 60 screens; skip 90% of content\r\n\t\thowMuchToSkip = 0.9;\r\n\t}\r\n\r\n\treturn howMuchToSkip;\r\n};\r\n\r\nconst bindEasingToVelocity = (velocity) => {\r\n\tvelocity.Easings[EASE_IN_SKIP_OUT_EASING] = composeEasing(\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-in'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\t0, 1 - computeHowMuchToSkip(tweenDelta), // to interval\r\n\t\t),\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-out'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\tcomputeHowMuchToSkip(tweenDelta), 1, // to interval\r\n\t\t),\r\n\t);\r\n};\r\n\r\nexport default bindEasingToVelocity;\r\n","/**\r\n * Represents valid hash as per https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash\r\n */\r\nexport class HashTarget\r\n{\r\n\tprivate constructor(\r\n\t\tprivate readonly value: string,\r\n\t\tprivate readonly targetElement: HTMLElement,\r\n\t) {}\r\n\r\n\tpublic static fromString(value: string, document: HTMLDocument): HashTarget\r\n\t{\r\n\t\tif (value === '' || value === '#') {\r\n\t\t\tthrow new Error('Hash does not contain any fragment.');\r\n\t\t}\r\n\r\n\t\tconst targetElementId = value.substring(1);\r\n\t\tconst targetElement = document.getElementById(targetElementId);\r\n\t\tif (targetElement === null) {\r\n\t\t\tthrow new Error(`No referenced element with ID ${targetElementId} exists.`);\r\n\t\t}\r\n\r\n\t\treturn new this(value, targetElement);\r\n\t}\r\n\r\n\tpublic getHash(): string\r\n\t{\r\n\t\treturn this.value;\r\n\t}\r\n\r\n\tpublic getElement(): HTMLElement\r\n\t{\r\n\t\treturn this.targetElement;\r\n\t}\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToElement(element: HTMLElement, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tVelocity.animate(element, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: () => onScrollFinishedCallback !== undefined && onScrollFinishedCallback(),\r\n\t});\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n        to[j] = from[i];\r\n    return to;\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export class AssertionError extends Error {}\r\nexport function assert(condition: any, message?: string): asserts condition {\r\n\tif ( ! condition) {\r\n\t\tthrow new AssertionError(message);\r\n\t}\r\n}\r\n","import {HashTarget} from '../HashTarget';\r\nimport {scrollToElement} from './scrollToElement';\r\nimport {assert} from '../assert';\r\n\r\nexport function scrollToTarget(hashTarget: HashTarget|string, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tif (typeof hashTarget === 'string') {\r\n\t\thashTarget = HashTarget.fromString(hashTarget, document);\r\n\t}\r\n\r\n\tscrollToElement(\r\n\t\thashTarget.getElement(),\r\n\t\t() => {\r\n\t\t\tassert(hashTarget instanceof HashTarget);\r\n\t\t\twindow.location.hash = hashTarget.getHash();\r\n\t\t\tonScrollFinishedCallback !== undefined && onScrollFinishedCallback();\r\n\t\t},\r\n\t);\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {HashTarget} from '../../HashTarget';\r\nimport {assert} from '../../assert';\r\n\r\n/**\r\n * Scrolls smoothly to an element if there is a hash in the URL.\r\n * E.g. you have `#example` in URL, then it scrolls to element with id `example`.\r\n *\r\n * Note:\r\n * Because of UX, this behaviour is limited only when whole document is loaded in less than 500ms.\r\n * Otherwise, it jumps directly to desired element without smooth scrolling, because too visible jumping through the page would appear.\r\n */\r\nexport function initializeOnLoadScroll(): void\r\n{\r\n\tconst hash = window.location.hash;\r\n\tif (hash === '' || hash === '#') {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet hashTarget: HashTarget|null = null;\r\n\tconst start = performance.now();\r\n\r\n\tdocument.addEventListener('DOMContentLoaded', () => {\r\n\t\ttry {\r\n\t\t\thashTarget = HashTarget.fromString(hash, document);\r\n\t\t} catch (e) {} // when URL contains hash which has no corresponding DOM element, just ignore it\r\n\t});\r\n\r\n\t/**\r\n\t * The `load` event has been chosen intentionally as it is the state when everything is ready -\r\n\t * all styles are loaded and offsets are computed correctly - so the scroll will be computed correctly.\r\n\t */\r\n\twindow.addEventListener('load', () => {\r\n\t\tif (hashTarget === null) { // if target does not exist\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst end = performance.now();\r\n\r\n\t\t// If difference between start and stop is greater than 500ms, do nothing.\r\n\t\tif (end - start > 500) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// First, we need to go to top immediately (hack to prevent jump to desired element).\r\n\t\twindow.scroll({top: 0, left: 0});\r\n\r\n\t\t// Then, scroll down to it smoothly.\r\n\t\tscrollToTarget(hashTarget);\r\n\t});\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {assert} from '../../assert';\r\nimport {HashTarget} from '../../HashTarget';\r\n\r\nexport function initializeOnLinkClickScroll(): void\r\n{\r\n\tdocument.addEventListener('DOMContentLoaded', () =>\r\n\t\tdocument.querySelectorAll('a[href^=\"#\"]').forEach((item) =>\r\n\t\t\titem.addEventListener('click', (event) => {\r\n\t\t\t\tconst element = event.currentTarget as HTMLAnchorElement;\r\n\t\t\t\tassert(element !== null);\r\n\r\n\t\t\t\tif (element.hash === '' || element.hash === '#') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tscrollToTarget(HashTarget.fromString(element.hash, document));\r\n\t\t\t})));\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToOffset(\r\n\ttopOffset: number,\r\n\tonScrollFinishedCallback?: () => void,\r\n): void\r\n{\r\n\t/**\r\n\t * Setting `<html>` as the element to scroll to with offset simulates `window.scrollTo()` behavior.\r\n\t * See last paragraph at http://velocityjs.org/#scroll\r\n\t */\r\n\tVelocity.animate(document.documentElement, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\toffset: topOffset,\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: onScrollFinishedCallback,\r\n\t});\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport bindEasingToVelocity from './easing/bindEasingToVelocity';\r\nimport {initializeOnLoadScroll} from './handlers/loadScroll/initializeOnLoadScroll';\r\nimport {initializeOnLinkClickScroll} from './handlers/linkClickScroll/initializeOnLinkClickScroll';\r\nimport {scrollToElement} from './scrollers/scrollToElement';\r\nimport {scrollToOffset} from './scrollers/scrollToOffset';\r\nimport {scrollToTarget} from './scrollers/scrollToTarget';\r\nimport {HashTarget} from './HashTarget';\r\n\r\n\r\n// bind automatically on library import\r\nbindEasingToVelocity(Velocity);\r\n\r\n\r\nfunction handleOnLoadScroll(): void\r\n{\r\n\tinitializeOnLoadScroll();\r\n}\r\n\r\nfunction handleOnLinkClickScroll(): void\r\n{\r\n\tinitializeOnLinkClickScroll();\r\n}\r\n\r\nexport {\r\n\tHashTarget,\r\n\thandleOnLoadScroll,\r\n\thandleOnLinkClickScroll,\r\n\tscrollToElement,\r\n\tscrollToOffset,\r\n\tscrollToTarget,\r\n};\r\n"],"names":["EASE_IN_SKIP_OUT_EASING","mapIntervalLinear","number","originalFrom","originalTo","newFrom","newTo","oldDistance","newDistance","normalized","composeEasing","firstHalfEasingFn","secondHalfEasingFn","time","opts","tweenDelta","normalizedTime","computeHowMuchToSkip","howManyScreens","Math","abs","window","innerHeight","howMuchToSkip","bindEasingToVelocity","velocity","Easings"],"mappings":"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"}
\ No newline at end of file
diff --git a/dist/index.js b/dist/index.js
index 0912850b2e349fa895a18b85a36f6b5b3476ac95..e6c7df2d44607d0cdd67c139bfdd00f0cd5fe27d 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -207,15 +207,20 @@
 	    var hashTarget = null;
 	    var start = performance.now();
 	    document.addEventListener('DOMContentLoaded', function () {
-	        hashTarget = HashTarget.fromString(hash, document);
+	        try {
+	            hashTarget = HashTarget.fromString(hash, document);
+	        }
+	        catch (e) { }
 	    });
 	    window.addEventListener('load', function () {
+	        if (hashTarget === null) {
+	            return;
+	        }
 	        var end = performance.now();
 	        if (end - start > 500) {
 	            return;
 	        }
 	        window.scroll({ top: 0, left: 0 });
-	        assert(hashTarget !== null, 'Hash target should be set on DOM loaded.');
 	        scrollToTarget(hashTarget);
 	    });
 	}
diff --git a/dist/index.js.map b/dist/index.js.map
index f6b262e92e7f4bba6a487e7c0a8d407868695360..7b92ffe1bffb2f561ef559eefb33ad5bfc7cbb3c 100644
--- a/dist/index.js.map
+++ b/dist/index.js.map
@@ -1 +1 @@
-{"version":3,"file":"index.js","sources":["../src/easing/bindEasingToVelocity.js","../src/HashTarget.ts","../src/scrollers/scrollToElement.ts","../node_modules/tslib/tslib.es6.js","../src/assert.ts","../src/scrollers/scrollToTarget.ts","../src/handlers/loadScroll/initializeOnLoadScroll.ts","../src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts","../src/scrollers/scrollToOffset.ts","../src/index.ts"],"sourcesContent":["export const EASE_IN_SKIP_OUT_EASING = 'ease-in-skip-out';\r\n\r\n// e.g. (5, 5, 10, 500, 1000) => 500\r\n// e.g. (5, 0, 10, 500, 1000) => 750\r\nconst mapIntervalLinear = (number, originalFrom, originalTo, newFrom, newTo) => {\r\n\tconst oldDistance = originalTo - originalFrom;\r\n\tconst newDistance = newTo - newFrom;\r\n\r\n\t// normalize value into interval 0 .. 1\r\n\tconst normalized = (number - originalFrom) / oldDistance;\r\n\t// extend and move normalized value into new interval\r\n\treturn (normalized * newDistance) + newFrom;\r\n};\r\n\r\n/**\r\n * Composes easings together, splits time into half.\r\n *\r\n * @param firstHalfEasingFn first half of easing\r\n * @param secondHalfEasingFn second half of easing\r\n * @return {function(*=, *=, *=)} the composed easing\r\n */\r\nconst composeEasing = (firstHalfEasingFn, secondHalfEasingFn) => {\r\n\r\n\t// time: The call's completion percentage (decimal value).\r\n\t// opts (optional): The options object passed into the triggering Velocity call.\r\n\t// tweenDelta (optional): The difference between the animating property's ending value and its starting value.\r\n\treturn (time, opts, tweenDelta) => {\r\n\t\tif (time < 0.5) {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0, 0.5, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(firstHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0, 0.5); // map  1 - 0   =>   0 - 0.5\r\n\r\n\t\t} else {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0.5, 1, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(secondHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0.5, 1); // map  1 - 0   =>   0 - 0.5\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst computeHowMuchToSkip = (tweenDelta) => {\r\n\tconst howManyScreens = Math.abs(tweenDelta) / window.innerHeight;\r\n\r\n\t// 0 .. 1 (percents)\r\n\tlet howMuchToSkip = 0;\r\n\r\n\t// by testing in browser we have found following values as smooth:\r\n\t// howManyScreens .. howMuchToSkip\r\n\t// 1 .. 0%\r\n\t// 2 .. 0%\r\n\t// 3 .. 30%\r\n\t// 8 .. 60%\r\n\t// 30 .. 85%\r\n\t// 60 .. 90%\r\n\t// 100 .. 90%\r\n\tif (howManyScreens <= 2) {\r\n\t\thowMuchToSkip = 0;\r\n\t} else if (howManyScreens <= 4) { // 2 - 4 screens; skip 0% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 2, 4, 0, 0.3);\r\n\t} else if (howManyScreens <= 8) { // 4 - 8 screens; skip 30% - 60% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 4, 8, 0.3, 0.6);\r\n\t} else if (howManyScreens <= 30) { // 8 - 30 screens; skip 60% - 85% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 8, 30, 0.6, 0.85);\r\n\t} else if (howManyScreens <= 60) { // 30 - 60 screens; skip 85% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 30, 60, 0.85, 0.9);\r\n\t} else { // > 60 screens; skip 90% of content\r\n\t\thowMuchToSkip = 0.9;\r\n\t}\r\n\r\n\treturn howMuchToSkip;\r\n};\r\n\r\nconst bindEasingToVelocity = (velocity) => {\r\n\tvelocity.Easings[EASE_IN_SKIP_OUT_EASING] = composeEasing(\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-in'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\t0, 1 - computeHowMuchToSkip(tweenDelta), // to interval\r\n\t\t),\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-out'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\tcomputeHowMuchToSkip(tweenDelta), 1, // to interval\r\n\t\t),\r\n\t);\r\n};\r\n\r\nexport default bindEasingToVelocity;\r\n","/**\r\n * Represents valid hash as per https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash\r\n */\r\nexport class HashTarget\r\n{\r\n\tprivate constructor(\r\n\t\tprivate readonly value: string,\r\n\t\tprivate readonly targetElement: HTMLElement,\r\n\t) {}\r\n\r\n\tpublic static fromString(value: string, document: HTMLDocument): HashTarget\r\n\t{\r\n\t\tif (value === '' || value === '#') {\r\n\t\t\tthrow new Error('Hash does not contain any fragment.');\r\n\t\t}\r\n\r\n\t\tconst targetElementId = value.substring(1);\r\n\t\tconst targetElement = document.getElementById(targetElementId);\r\n\t\tif (targetElement === null) {\r\n\t\t\tthrow new Error(`No referenced element with ID ${targetElementId} exists.`);\r\n\t\t}\r\n\r\n\t\treturn new this(value, targetElement);\r\n\t}\r\n\r\n\tpublic getHash(): string\r\n\t{\r\n\t\treturn this.value;\r\n\t}\r\n\r\n\tpublic getElement(): HTMLElement\r\n\t{\r\n\t\treturn this.targetElement;\r\n\t}\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToElement(element: HTMLElement, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tVelocity.animate(element, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: () => onScrollFinishedCallback !== undefined && onScrollFinishedCallback(),\r\n\t});\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n        to[j] = from[i];\r\n    return to;\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export class AssertionError extends Error {}\r\nexport function assert(condition: any, message?: string): asserts condition {\r\n\tif ( ! condition) {\r\n\t\tthrow new AssertionError(message);\r\n\t}\r\n}\r\n","import {HashTarget} from '../HashTarget';\r\nimport {scrollToElement} from './scrollToElement';\r\nimport {assert} from '../assert';\r\n\r\nexport function scrollToTarget(hashTarget: HashTarget|string, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tif (typeof hashTarget === 'string') {\r\n\t\thashTarget = HashTarget.fromString(hashTarget, document);\r\n\t}\r\n\r\n\tscrollToElement(\r\n\t\thashTarget.getElement(),\r\n\t\t() => {\r\n\t\t\tassert(hashTarget instanceof HashTarget);\r\n\t\t\twindow.location.hash = hashTarget.getHash();\r\n\t\t\tonScrollFinishedCallback !== undefined && onScrollFinishedCallback();\r\n\t\t},\r\n\t);\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {HashTarget} from '../../HashTarget';\r\nimport {assert} from '../../assert';\r\n\r\n/**\r\n * Scrolls smoothly to an element if there is a hash in the URL.\r\n * E.g. you have `#example` in URL, then it scrolls to element with id `example`.\r\n *\r\n * Note:\r\n * Because of UX, this behaviour is limited only when whole document is loaded in less than 500ms.\r\n * Otherwise, it jumps directly to desired element without smooth scrolling, because too visible jumping through the page would appear.\r\n */\r\nexport function initializeOnLoadScroll(): void\r\n{\r\n\tconst hash = window.location.hash;\r\n\tif (hash === '' || hash === '#') {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet hashTarget: HashTarget|null = null;\r\n\tconst start = performance.now();\r\n\r\n\tdocument.addEventListener('DOMContentLoaded', () => {\r\n\t\thashTarget = HashTarget.fromString(hash, document);\r\n\t});\r\n\r\n\t/**\r\n\t * The `load` event has been chosen intentionally as it is the state when everything is ready -\r\n\t * all styles are loaded and offsets are computed correctly - so the scroll will be computed correctly.\r\n\t */\r\n\twindow.addEventListener('load', () => {\r\n\t\tconst end = performance.now();\r\n\r\n\t\t// If difference between start and stop is greater than 500ms, do nothing.\r\n\t\tif (end - start > 500) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// First, we need to go to top immediately (hack to prevent jump to desired element).\r\n\t\twindow.scroll({top: 0, left: 0});\r\n\r\n\t\t// Then, scroll down to it smoothly.\r\n\t\tassert(hashTarget !== null, 'Hash target should be set on DOM loaded.');\r\n\t\tscrollToTarget(hashTarget);\r\n\t});\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {assert} from '../../assert';\r\nimport {HashTarget} from '../../HashTarget';\r\n\r\nexport function initializeOnLinkClickScroll(): void\r\n{\r\n\tdocument.addEventListener('DOMContentLoaded', () =>\r\n\t\tdocument.querySelectorAll('a[href^=\"#\"]').forEach((item) =>\r\n\t\t\titem.addEventListener('click', (event) => {\r\n\t\t\t\tconst element = event.currentTarget as HTMLAnchorElement;\r\n\t\t\t\tassert(element !== null);\r\n\r\n\t\t\t\tif (element.hash === '' || element.hash === '#') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tscrollToTarget(HashTarget.fromString(element.hash, document));\r\n\t\t\t})));\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToOffset(\r\n\ttopOffset: number,\r\n\tonScrollFinishedCallback?: () => void,\r\n): void\r\n{\r\n\t/**\r\n\t * Setting `<html>` as the element to scroll to with offset simulates `window.scrollTo()` behavior.\r\n\t * See last paragraph at http://velocityjs.org/#scroll\r\n\t */\r\n\tVelocity.animate(document.documentElement, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\toffset: topOffset,\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: onScrollFinishedCallback,\r\n\t});\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport bindEasingToVelocity from './easing/bindEasingToVelocity';\r\nimport {initializeOnLoadScroll} from './handlers/loadScroll/initializeOnLoadScroll';\r\nimport {initializeOnLinkClickScroll} from './handlers/linkClickScroll/initializeOnLinkClickScroll';\r\nimport {scrollToElement} from './scrollers/scrollToElement';\r\nimport {scrollToOffset} from './scrollers/scrollToOffset';\r\nimport {scrollToTarget} from './scrollers/scrollToTarget';\r\nimport {HashTarget} from './HashTarget';\r\n\r\n\r\n// bind automatically on library import\r\nbindEasingToVelocity(Velocity);\r\n\r\n\r\nfunction handleOnLoadScroll(): void\r\n{\r\n\tinitializeOnLoadScroll();\r\n}\r\n\r\nfunction handleOnLinkClickScroll(): void\r\n{\r\n\tinitializeOnLinkClickScroll();\r\n}\r\n\r\nexport {\r\n\tHashTarget,\r\n\thandleOnLoadScroll,\r\n\thandleOnLinkClickScroll,\r\n\tscrollToElement,\r\n\tscrollToOffset,\r\n\tscrollToTarget,\r\n};\r\n"],"names":["EASE_IN_SKIP_OUT_EASING","mapIntervalLinear","number","originalFrom","originalTo","newFrom","newTo","oldDistance","newDistance","normalized","composeEasing","firstHalfEasingFn","secondHalfEasingFn","time","opts","tweenDelta","normalizedTime","computeHowMuchToSkip","howManyScreens","Math","abs","window","innerHeight","howMuchToSkip","bindEasingToVelocity","velocity","Easings","Velocity"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index.js","sources":["../src/easing/bindEasingToVelocity.js","../src/HashTarget.ts","../src/scrollers/scrollToElement.ts","../node_modules/tslib/tslib.es6.js","../src/assert.ts","../src/scrollers/scrollToTarget.ts","../src/handlers/loadScroll/initializeOnLoadScroll.ts","../src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts","../src/scrollers/scrollToOffset.ts","../src/index.ts"],"sourcesContent":["export const EASE_IN_SKIP_OUT_EASING = 'ease-in-skip-out';\r\n\r\n// e.g. (5, 5, 10, 500, 1000) => 500\r\n// e.g. (5, 0, 10, 500, 1000) => 750\r\nconst mapIntervalLinear = (number, originalFrom, originalTo, newFrom, newTo) => {\r\n\tconst oldDistance = originalTo - originalFrom;\r\n\tconst newDistance = newTo - newFrom;\r\n\r\n\t// normalize value into interval 0 .. 1\r\n\tconst normalized = (number - originalFrom) / oldDistance;\r\n\t// extend and move normalized value into new interval\r\n\treturn (normalized * newDistance) + newFrom;\r\n};\r\n\r\n/**\r\n * Composes easings together, splits time into half.\r\n *\r\n * @param firstHalfEasingFn first half of easing\r\n * @param secondHalfEasingFn second half of easing\r\n * @return {function(*=, *=, *=)} the composed easing\r\n */\r\nconst composeEasing = (firstHalfEasingFn, secondHalfEasingFn) => {\r\n\r\n\t// time: The call's completion percentage (decimal value).\r\n\t// opts (optional): The options object passed into the triggering Velocity call.\r\n\t// tweenDelta (optional): The difference between the animating property's ending value and its starting value.\r\n\treturn (time, opts, tweenDelta) => {\r\n\t\tif (time < 0.5) {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0, 0.5, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(firstHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0, 0.5); // map  1 - 0   =>   0 - 0.5\r\n\r\n\t\t} else {\r\n\t\t\tconst normalizedTime = mapIntervalLinear(time, 0.5, 1, 0, 1); // map  0 - 0.5   =>   0 - 1\r\n\t\t\treturn mapIntervalLinear(secondHalfEasingFn(normalizedTime, opts, tweenDelta), 0, 1, 0.5, 1); // map  1 - 0   =>   0 - 0.5\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst computeHowMuchToSkip = (tweenDelta) => {\r\n\tconst howManyScreens = Math.abs(tweenDelta) / window.innerHeight;\r\n\r\n\t// 0 .. 1 (percents)\r\n\tlet howMuchToSkip = 0;\r\n\r\n\t// by testing in browser we have found following values as smooth:\r\n\t// howManyScreens .. howMuchToSkip\r\n\t// 1 .. 0%\r\n\t// 2 .. 0%\r\n\t// 3 .. 30%\r\n\t// 8 .. 60%\r\n\t// 30 .. 85%\r\n\t// 60 .. 90%\r\n\t// 100 .. 90%\r\n\tif (howManyScreens <= 2) {\r\n\t\thowMuchToSkip = 0;\r\n\t} else if (howManyScreens <= 4) { // 2 - 4 screens; skip 0% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 2, 4, 0, 0.3);\r\n\t} else if (howManyScreens <= 8) { // 4 - 8 screens; skip 30% - 60% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 4, 8, 0.3, 0.6);\r\n\t} else if (howManyScreens <= 30) { // 8 - 30 screens; skip 60% - 85% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 8, 30, 0.6, 0.85);\r\n\t} else if (howManyScreens <= 60) { // 30 - 60 screens; skip 85% - 30% of content\r\n\t\thowMuchToSkip = mapIntervalLinear(howManyScreens, 30, 60, 0.85, 0.9);\r\n\t} else { // > 60 screens; skip 90% of content\r\n\t\thowMuchToSkip = 0.9;\r\n\t}\r\n\r\n\treturn howMuchToSkip;\r\n};\r\n\r\nconst bindEasingToVelocity = (velocity) => {\r\n\tvelocity.Easings[EASE_IN_SKIP_OUT_EASING] = composeEasing(\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-in'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\t0, 1 - computeHowMuchToSkip(tweenDelta), // to interval\r\n\t\t),\r\n\t\t(time, opts, tweenDelta) => mapIntervalLinear(\r\n\t\t\tvelocity.Easings['ease-out'](time, opts, tweenDelta),\r\n\t\t\t0, 1, // from interval\r\n\t\t\tcomputeHowMuchToSkip(tweenDelta), 1, // to interval\r\n\t\t),\r\n\t);\r\n};\r\n\r\nexport default bindEasingToVelocity;\r\n","/**\r\n * Represents valid hash as per https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/hash\r\n */\r\nexport class HashTarget\r\n{\r\n\tprivate constructor(\r\n\t\tprivate readonly value: string,\r\n\t\tprivate readonly targetElement: HTMLElement,\r\n\t) {}\r\n\r\n\tpublic static fromString(value: string, document: HTMLDocument): HashTarget\r\n\t{\r\n\t\tif (value === '' || value === '#') {\r\n\t\t\tthrow new Error('Hash does not contain any fragment.');\r\n\t\t}\r\n\r\n\t\tconst targetElementId = value.substring(1);\r\n\t\tconst targetElement = document.getElementById(targetElementId);\r\n\t\tif (targetElement === null) {\r\n\t\t\tthrow new Error(`No referenced element with ID ${targetElementId} exists.`);\r\n\t\t}\r\n\r\n\t\treturn new this(value, targetElement);\r\n\t}\r\n\r\n\tpublic getHash(): string\r\n\t{\r\n\t\treturn this.value;\r\n\t}\r\n\r\n\tpublic getElement(): HTMLElement\r\n\t{\r\n\t\treturn this.targetElement;\r\n\t}\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToElement(element: HTMLElement, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tVelocity.animate(element, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: () => onScrollFinishedCallback !== undefined && onScrollFinishedCallback(),\r\n\t});\r\n}\r\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    if (typeof b !== \"function\" && b !== null)\r\n        throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n    for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n}\r\n\r\nexport function __spreadArray(to, from) {\r\n    for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)\r\n        to[j] = from[i];\r\n    return to;\r\n}\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n    o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n    __setModuleDefault(result, mod);\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","export class AssertionError extends Error {}\r\nexport function assert(condition: any, message?: string): asserts condition {\r\n\tif ( ! condition) {\r\n\t\tthrow new AssertionError(message);\r\n\t}\r\n}\r\n","import {HashTarget} from '../HashTarget';\r\nimport {scrollToElement} from './scrollToElement';\r\nimport {assert} from '../assert';\r\n\r\nexport function scrollToTarget(hashTarget: HashTarget|string, onScrollFinishedCallback?: () => void): void\r\n{\r\n\tif (typeof hashTarget === 'string') {\r\n\t\thashTarget = HashTarget.fromString(hashTarget, document);\r\n\t}\r\n\r\n\tscrollToElement(\r\n\t\thashTarget.getElement(),\r\n\t\t() => {\r\n\t\t\tassert(hashTarget instanceof HashTarget);\r\n\t\t\twindow.location.hash = hashTarget.getHash();\r\n\t\t\tonScrollFinishedCallback !== undefined && onScrollFinishedCallback();\r\n\t\t},\r\n\t);\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {HashTarget} from '../../HashTarget';\r\nimport {assert} from '../../assert';\r\n\r\n/**\r\n * Scrolls smoothly to an element if there is a hash in the URL.\r\n * E.g. you have `#example` in URL, then it scrolls to element with id `example`.\r\n *\r\n * Note:\r\n * Because of UX, this behaviour is limited only when whole document is loaded in less than 500ms.\r\n * Otherwise, it jumps directly to desired element without smooth scrolling, because too visible jumping through the page would appear.\r\n */\r\nexport function initializeOnLoadScroll(): void\r\n{\r\n\tconst hash = window.location.hash;\r\n\tif (hash === '' || hash === '#') {\r\n\t\treturn;\r\n\t}\r\n\r\n\tlet hashTarget: HashTarget|null = null;\r\n\tconst start = performance.now();\r\n\r\n\tdocument.addEventListener('DOMContentLoaded', () => {\r\n\t\ttry {\r\n\t\t\thashTarget = HashTarget.fromString(hash, document);\r\n\t\t} catch (e) {} // when URL contains hash which has no corresponding DOM element, just ignore it\r\n\t});\r\n\r\n\t/**\r\n\t * The `load` event has been chosen intentionally as it is the state when everything is ready -\r\n\t * all styles are loaded and offsets are computed correctly - so the scroll will be computed correctly.\r\n\t */\r\n\twindow.addEventListener('load', () => {\r\n\t\tif (hashTarget === null) { // if target does not exist\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst end = performance.now();\r\n\r\n\t\t// If difference between start and stop is greater than 500ms, do nothing.\r\n\t\tif (end - start > 500) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// First, we need to go to top immediately (hack to prevent jump to desired element).\r\n\t\twindow.scroll({top: 0, left: 0});\r\n\r\n\t\t// Then, scroll down to it smoothly.\r\n\t\tscrollToTarget(hashTarget);\r\n\t});\r\n}\r\n","import {scrollToTarget} from '../../scrollers/scrollToTarget';\r\nimport {assert} from '../../assert';\r\nimport {HashTarget} from '../../HashTarget';\r\n\r\nexport function initializeOnLinkClickScroll(): void\r\n{\r\n\tdocument.addEventListener('DOMContentLoaded', () =>\r\n\t\tdocument.querySelectorAll('a[href^=\"#\"]').forEach((item) =>\r\n\t\t\titem.addEventListener('click', (event) => {\r\n\t\t\t\tconst element = event.currentTarget as HTMLAnchorElement;\r\n\t\t\t\tassert(element !== null);\r\n\r\n\t\t\t\tif (element.hash === '' || element.hash === '#') {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tscrollToTarget(HashTarget.fromString(element.hash, document));\r\n\t\t\t})));\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';\r\n\r\nexport function scrollToOffset(\r\n\ttopOffset: number,\r\n\tonScrollFinishedCallback?: () => void,\r\n): void\r\n{\r\n\t/**\r\n\t * Setting `<html>` as the element to scroll to with offset simulates `window.scrollTo()` behavior.\r\n\t * See last paragraph at http://velocityjs.org/#scroll\r\n\t */\r\n\tVelocity.animate(document.documentElement, 'scroll', {\r\n\t\tduration: 1200, // todo: different depending on offset from page top?\r\n\t\toffset: topOffset,\r\n\t\teasing: EASE_IN_SKIP_OUT_EASING,\r\n\t\tcomplete: onScrollFinishedCallback,\r\n\t});\r\n}\r\n","import * as Velocity from 'velocity-animate';\r\nimport bindEasingToVelocity from './easing/bindEasingToVelocity';\r\nimport {initializeOnLoadScroll} from './handlers/loadScroll/initializeOnLoadScroll';\r\nimport {initializeOnLinkClickScroll} from './handlers/linkClickScroll/initializeOnLinkClickScroll';\r\nimport {scrollToElement} from './scrollers/scrollToElement';\r\nimport {scrollToOffset} from './scrollers/scrollToOffset';\r\nimport {scrollToTarget} from './scrollers/scrollToTarget';\r\nimport {HashTarget} from './HashTarget';\r\n\r\n\r\n// bind automatically on library import\r\nbindEasingToVelocity(Velocity);\r\n\r\n\r\nfunction handleOnLoadScroll(): void\r\n{\r\n\tinitializeOnLoadScroll();\r\n}\r\n\r\nfunction handleOnLinkClickScroll(): void\r\n{\r\n\tinitializeOnLinkClickScroll();\r\n}\r\n\r\nexport {\r\n\tHashTarget,\r\n\thandleOnLoadScroll,\r\n\thandleOnLinkClickScroll,\r\n\tscrollToElement,\r\n\tscrollToOffset,\r\n\tscrollToTarget,\r\n};\r\n"],"names":["EASE_IN_SKIP_OUT_EASING","mapIntervalLinear","number","originalFrom","originalTo","newFrom","newTo","oldDistance","newDistance","normalized","composeEasing","firstHalfEasingFn","secondHalfEasingFn","time","opts","tweenDelta","normalizedTime","computeHowMuchToSkip","howManyScreens","Math","abs","window","innerHeight","howMuchToSkip","bindEasingToVelocity","velocity","Easings","Velocity"],"mappings":"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"}
\ No newline at end of file
diff --git a/src/handlers/loadScroll/initializeOnLoadScroll.ts b/src/handlers/loadScroll/initializeOnLoadScroll.ts
index 63bb0a3f14a96a0ae180780bc1234b2a3789f1c2..335d65d07655b28c8c0aa6f35cc89d8d50033cea 100644
--- a/src/handlers/loadScroll/initializeOnLoadScroll.ts
+++ b/src/handlers/loadScroll/initializeOnLoadScroll.ts
@@ -21,7 +21,9 @@ export function initializeOnLoadScroll(): void
 	const start = performance.now();
 
 	document.addEventListener('DOMContentLoaded', () => {
-		hashTarget = HashTarget.fromString(hash, document);
+		try {
+			hashTarget = HashTarget.fromString(hash, document);
+		} catch (e) {} // when URL contains hash which has no corresponding DOM element, just ignore it
 	});
 
 	/**
@@ -29,6 +31,10 @@ export function initializeOnLoadScroll(): void
 	 * all styles are loaded and offsets are computed correctly - so the scroll will be computed correctly.
 	 */
 	window.addEventListener('load', () => {
+		if (hashTarget === null) { // if target does not exist
+			return;
+		}
+
 		const end = performance.now();
 
 		// If difference between start and stop is greater than 500ms, do nothing.
@@ -40,7 +46,6 @@ export function initializeOnLoadScroll(): void
 		window.scroll({top: 0, left: 0});
 
 		// Then, scroll down to it smoothly.
-		assert(hashTarget !== null, 'Hash target should be set on DOM loaded.');
 		scrollToTarget(hashTarget);
 	});
 }
diff --git a/src/handlers/loadScroll/unitTest.html b/src/handlers/loadScroll/unitTest.html
index aa3bb3affa5c962e1b3e8ca4aa1d7e50ed478257..7634e6765106f9706a6f761ea6124ed758646394 100644
--- a/src/handlers/loadScroll/unitTest.html
+++ b/src/handlers/loadScroll/unitTest.html
@@ -22,6 +22,10 @@
 		<strong>Load this page with <code>#test</code> in URL. This section should be skipped on the page load.</strong>
 	</p>
 
+	<p>
+		<strong>Load this page with <code>#testnotarget</code> in URL. There should be no error in console.</strong>
+	</p>
+
 	<!-- placeholder text so that custom easing is visible -->
 	<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam ornare wisi eu metus. Pellentesque ipsum. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Donec ipsum massa, ullamcorper in, auctor et, scelerisque sed, est. Mauris tincidunt sem sed arcu. Curabitur ligula sapien, pulvinar a vestibulum quis, facilisis vel sapien. Sed ac dolor sit amet purus malesuada congue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris dolor felis, sagittis at, luctus sed, aliquam non, tellus. Proin pede metus, vulputate nec, fermentum fringilla, vehicula vitae, justo. Etiam posuere lacus quis dolor. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. Integer tempor. Morbi scelerisque luctus velit. Sed vel lectus. Donec odio tempus molestie, porttitor ut, iaculis quis, sem. Suspendisse sagittis ultrices augue.</p>
 	<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam ornare wisi eu metus. Pellentesque ipsum. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Donec ipsum massa, ullamcorper in, auctor et, scelerisque sed, est. Mauris tincidunt sem sed arcu. Curabitur ligula sapien, pulvinar a vestibulum quis, facilisis vel sapien. Sed ac dolor sit amet purus malesuada congue. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris dolor felis, sagittis at, luctus sed, aliquam non, tellus. Proin pede metus, vulputate nec, fermentum fringilla, vehicula vitae, justo. Etiam posuere lacus quis dolor. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat. Integer tempor. Morbi scelerisque luctus velit. Sed vel lectus. Donec odio tempus molestie, porttitor ut, iaculis quis, sem. Suspendisse sagittis ultrices augue.</p>