{"version":3,"sources":["carousel.js","components/carousel.js"],"names":["_classCallCheck","a","n","TypeError","_defineProperties","e","r","t","length","o","enumerable","configurable","writable","Object","defineProperty","_toPropertyKey","key","_createClass","prototype","_defineProperty","value","i","_toPrimitive","_typeof","Symbol","toPrimitive","call","String","Number","iterator","constructor","define","amd","exports","dragscroll","this","window","l","document","c","m","d","s","f","u","container","md","mu","mm","slice","getElementsByClassName","hasAttribute","elementFromPoint","pageX","pageY","clientX","clientY","preventDefault","scroller","scrollLeft","scrollTop","body","documentElement","readyState","reset","polyfill","w","style","__forceSmoothScrollPolyfill__","userAgent","Element","HTMLElement","original","scroll","scrollTo","scrollBy","elementScroll","scrollElement","scrollIntoView","now","performance","bind","Date","ROUNDING_TOLERANCE","navigator","RegExp","join","test","undefined","arguments","shouldBailOut","smoothScroll","left","scrollX","pageXOffset","top","scrollY","pageYOffset","SyntaxError","behavior","scrollableParent","el","isScrollable","parentNode","host","findScrollableParent","parentRects","getBoundingClientRect","clientRects","getComputedStyle","position","x","y","firstArg","hasScrollableSpace","axis","clientHeight","scrollHeight","clientWidth","scrollWidth","canOverflow","overflowValue","isScrollableY","isScrollableX","step","context","currentX","currentY","k","elapsed","startTime","Math","cos","PI","startX","startY","method","scrollable","requestAnimationFrame","module","app","Carousel","viewport","ui","querySelector","right","links","getLinks","_this","initialId","parseInt","getAttribute","oldMouseX","mouseX","mouseDown","clicked","centred","controlClicked","activate","snap","infinite","padding","JSON","parse","id","widthOfOneItem","offsetWidth","getContainerPadding","containerWidth","initialItem","offsetLeft","setActive","find","dataset","defineBreakpoints","checkBreakpoint","watchControls","watchKeys","watchLinks","watchScroll","watchResize","resetKeys","updateStatus","addEventListener","updateControls","querySelectorAll","forEach","setAttribute","optionsOverride","breakpoints","breakpoint","options","assign","breakpointChanged","matches","currentBreakpoint","ignoreActive","_this2","getTarget","classList","remove","setTimeout","removeAttribute","destination","duration","easing","callback","start","timestamp","time","min","timeFunction","easings","ceil","_this3","toString","setViewing","moved","onmousedown","isValid","onmousemove","last","first","shiftRight","shiftLeft","onmouseup","target","preventClick","removeEventListener","onfocus","updateActive","onblur","unsetActive","prepend","_this4","D3R","throttle","_this5","add","animate","updated","viewing","unsetViewing","_this6","item","active","activeElement","_this7","keys","meta","ctrl","sizes","_this8","arithmetic","units","_loop","calculation","indexOf","push","unit","paddingFunctions","total","array","_this9","_this0","resetFocus","disableFocus","scrolled","timeout","_this1","visible","filter","floor","clearTimeout","focus","preventScroll","center","down","appendChild","_this10","data","scrollRight","stopImmediatePropagation","dispatchEvent","CustomEvent","detail","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","px","replace","vw","innerWidth","vh","innerHeight","D3RSite","carousels","carousel","init"],"mappings":"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","file":"../../javascript/carousel.js","sourcesContent":["!function(e,n){\"function\"==typeof define&&define.amd?define([\"exports\"],n):n(\"undefined\"!=typeof exports?exports:e.dragscroll={})}(this,function(e){var n,t,o=window,l=document,c=\"mousemove\",r=\"mouseup\",i=\"mousedown\",m=\"EventListener\",d=\"add\"+m,s=\"remove\"+m,f=[],u=function(e,m){for(e=0;e<f.length;)m=f[e++],m=m.container||m,m[s](i,m.md,0),o[s](r,m.mu,0),o[s](c,m.mm,0);for(f=[].slice.call(l.getElementsByClassName(\"dragscroll\")),e=0;e<f.length;)!function(e,m,s,f,u,a){(a=e.container||e)[d](i,a.md=function(n){e.hasAttribute(\"nochilddrag\")&&l.elementFromPoint(n.pageX,n.pageY)!=a||(f=1,m=n.clientX,s=n.clientY,n.preventDefault())},0),o[d](r,a.mu=function(){f=0},0),o[d](c,a.mm=function(o){f&&((u=e.scroller||e).scrollLeft-=n=-m+(m=o.clientX),u.scrollTop-=t=-s+(s=o.clientY),e==l.body&&((u=l.documentElement).scrollLeft-=n,u.scrollTop-=t))},0)}(f[e++])};\"complete\"==l.readyState?u():o[d](\"load\",u,0),e.reset=u});\n/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n(function () {\n  'use strict';\n\n  // polyfill\n  function polyfill() {\n    // aliases\n    var w = window;\n    var d = document;\n\n    // return if scroll behavior is supported and polyfill is not forced\n    if (\n      'scrollBehavior' in d.documentElement.style &&\n      w.__forceSmoothScrollPolyfill__ !== true\n    ) {\n      return;\n    }\n\n    // globals\n    var Element = w.HTMLElement || w.Element;\n    var SCROLL_TIME = 468;\n\n    // object gathering original scroll methods\n    var original = {\n      scroll: w.scroll || w.scrollTo,\n      scrollBy: w.scrollBy,\n      elementScroll: Element.prototype.scroll || scrollElement,\n      scrollIntoView: Element.prototype.scrollIntoView\n    };\n\n    // define timing method\n    var now =\n      w.performance && w.performance.now\n        ? w.performance.now.bind(w.performance)\n        : Date.now;\n\n    /**\n     * indicates if a the current browser is made by Microsoft\n     * @method isMicrosoftBrowser\n     * @param {String} userAgent\n     * @returns {Boolean}\n     */\n    function isMicrosoftBrowser(userAgent) {\n      var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];\n\n      return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n    }\n\n    /*\n     * IE has rounding bug rounding down clientHeight and clientWidth and\n     * rounding up scrollHeight and scrollWidth causing false positives\n     * on hasScrollableSpace\n     */\n    var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n\n    /**\n     * changes scroll position inside an element\n     * @method scrollElement\n     * @param {Number} x\n     * @param {Number} y\n     * @returns {undefined}\n     */\n    function scrollElement(x, y) {\n      this.scrollLeft = x;\n      this.scrollTop = y;\n    }\n\n    /**\n     * returns result of applying ease math function to a number\n     * @method ease\n     * @param {Number} k\n     * @returns {Number}\n     */\n    function ease(k) {\n      return 0.5 * (1 - Math.cos(Math.PI * k));\n    }\n\n    /**\n     * indicates if a smooth behavior should be applied\n     * @method shouldBailOut\n     * @param {Number|Object} firstArg\n     * @returns {Boolean}\n     */\n    function shouldBailOut(firstArg) {\n      if (\n        firstArg === null ||\n        typeof firstArg !== 'object' ||\n        firstArg.behavior === undefined ||\n        firstArg.behavior === 'auto' ||\n        firstArg.behavior === 'instant'\n      ) {\n        // first argument is not an object/null\n        // or behavior is auto, instant or undefined\n        return true;\n      }\n\n      if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {\n        // first argument is an object and behavior is smooth\n        return false;\n      }\n\n      // throw error when behavior is not supported\n      throw new TypeError(\n        'behavior member of ScrollOptions ' +\n          firstArg.behavior +\n          ' is not a valid value for enumeration ScrollBehavior.'\n      );\n    }\n\n    /**\n     * indicates if an element has scrollable space in the provided axis\n     * @method hasScrollableSpace\n     * @param {Node} el\n     * @param {String} axis\n     * @returns {Boolean}\n     */\n    function hasScrollableSpace(el, axis) {\n      if (axis === 'Y') {\n        return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n      }\n\n      if (axis === 'X') {\n        return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n      }\n    }\n\n    /**\n     * indicates if an element has a scrollable overflow property in the axis\n     * @method canOverflow\n     * @param {Node} el\n     * @param {String} axis\n     * @returns {Boolean}\n     */\n    function canOverflow(el, axis) {\n      var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n\n      return overflowValue === 'auto' || overflowValue === 'scroll';\n    }\n\n    /**\n     * indicates if an element can be scrolled in either axis\n     * @method isScrollable\n     * @param {Node} el\n     * @param {String} axis\n     * @returns {Boolean}\n     */\n    function isScrollable(el) {\n      var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n      var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n\n      return isScrollableY || isScrollableX;\n    }\n\n    /**\n     * finds scrollable parent of an element\n     * @method findScrollableParent\n     * @param {Node} el\n     * @returns {Node} el\n     */\n    function findScrollableParent(el) {\n      while (el !== d.body && isScrollable(el) === false) {\n        el = el.parentNode || el.host;\n      }\n\n      return el;\n    }\n\n    /**\n     * self invoked function that, given a context, steps through scrolling\n     * @method step\n     * @param {Object} context\n     * @returns {undefined}\n     */\n    function step(context) {\n      var time = now();\n      var value;\n      var currentX;\n      var currentY;\n      var elapsed = (time - context.startTime) / SCROLL_TIME;\n\n      // avoid elapsed times higher than one\n      elapsed = elapsed > 1 ? 1 : elapsed;\n\n      // apply easing to elapsed time\n      value = ease(elapsed);\n\n      currentX = context.startX + (context.x - context.startX) * value;\n      currentY = context.startY + (context.y - context.startY) * value;\n\n      context.method.call(context.scrollable, currentX, currentY);\n\n      // scroll more if we have not reached our destination\n      if (currentX !== context.x || currentY !== context.y) {\n        w.requestAnimationFrame(step.bind(w, context));\n      }\n    }\n\n    /**\n     * scrolls window or element with a smooth behavior\n     * @method smoothScroll\n     * @param {Object|Node} el\n     * @param {Number} x\n     * @param {Number} y\n     * @returns {undefined}\n     */\n    function smoothScroll(el, x, y) {\n      var scrollable;\n      var startX;\n      var startY;\n      var method;\n      var startTime = now();\n\n      // define scroll context\n      if (el === d.body) {\n        scrollable = w;\n        startX = w.scrollX || w.pageXOffset;\n        startY = w.scrollY || w.pageYOffset;\n        method = original.scroll;\n      } else {\n        scrollable = el;\n        startX = el.scrollLeft;\n        startY = el.scrollTop;\n        method = scrollElement;\n      }\n\n      // scroll looping over a frame\n      step({\n        scrollable: scrollable,\n        method: method,\n        startTime: startTime,\n        startX: startX,\n        startY: startY,\n        x: x,\n        y: y\n      });\n    }\n\n    // ORIGINAL METHODS OVERRIDES\n    // w.scroll and w.scrollTo\n    w.scroll = w.scrollTo = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        original.scroll.call(\n          w,\n          arguments[0].left !== undefined\n            ? arguments[0].left\n            : typeof arguments[0] !== 'object'\n              ? arguments[0]\n              : w.scrollX || w.pageXOffset,\n          // use top prop, second argument if present or fallback to scrollY\n          arguments[0].top !== undefined\n            ? arguments[0].top\n            : arguments[1] !== undefined\n              ? arguments[1]\n              : w.scrollY || w.pageYOffset\n        );\n\n        return;\n      }\n\n      // LET THE SMOOTHNESS BEGIN!\n      smoothScroll.call(\n        w,\n        d.body,\n        arguments[0].left !== undefined\n          ? ~~arguments[0].left\n          : w.scrollX || w.pageXOffset,\n        arguments[0].top !== undefined\n          ? ~~arguments[0].top\n          : w.scrollY || w.pageYOffset\n      );\n    };\n\n    // w.scrollBy\n    w.scrollBy = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0])) {\n        original.scrollBy.call(\n          w,\n          arguments[0].left !== undefined\n            ? arguments[0].left\n            : typeof arguments[0] !== 'object' ? arguments[0] : 0,\n          arguments[0].top !== undefined\n            ? arguments[0].top\n            : arguments[1] !== undefined ? arguments[1] : 0\n        );\n\n        return;\n      }\n\n      // LET THE SMOOTHNESS BEGIN!\n      smoothScroll.call(\n        w,\n        d.body,\n        ~~arguments[0].left + (w.scrollX || w.pageXOffset),\n        ~~arguments[0].top + (w.scrollY || w.pageYOffset)\n      );\n    };\n\n    // Element.prototype.scroll and Element.prototype.scrollTo\n    Element.prototype.scroll = Element.prototype.scrollTo = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        // if one number is passed, throw error to match Firefox implementation\n        if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n          throw new SyntaxError('Value could not be converted');\n        }\n\n        original.elementScroll.call(\n          this,\n          // use left prop, first number argument or fallback to scrollLeft\n          arguments[0].left !== undefined\n            ? ~~arguments[0].left\n            : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,\n          // use top prop, second argument or fallback to scrollTop\n          arguments[0].top !== undefined\n            ? ~~arguments[0].top\n            : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop\n        );\n\n        return;\n      }\n\n      var left = arguments[0].left;\n      var top = arguments[0].top;\n\n      // LET THE SMOOTHNESS BEGIN!\n      smoothScroll.call(\n        this,\n        this,\n        typeof left === 'undefined' ? this.scrollLeft : ~~left,\n        typeof top === 'undefined' ? this.scrollTop : ~~top\n      );\n    };\n\n    // Element.prototype.scrollBy\n    Element.prototype.scrollBy = function() {\n      // avoid action when no arguments are passed\n      if (arguments[0] === undefined) {\n        return;\n      }\n\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        original.elementScroll.call(\n          this,\n          arguments[0].left !== undefined\n            ? ~~arguments[0].left + this.scrollLeft\n            : ~~arguments[0] + this.scrollLeft,\n          arguments[0].top !== undefined\n            ? ~~arguments[0].top + this.scrollTop\n            : ~~arguments[1] + this.scrollTop\n        );\n\n        return;\n      }\n\n      this.scroll({\n        left: ~~arguments[0].left + this.scrollLeft,\n        top: ~~arguments[0].top + this.scrollTop,\n        behavior: arguments[0].behavior\n      });\n    };\n\n    // Element.prototype.scrollIntoView\n    Element.prototype.scrollIntoView = function() {\n      // avoid smooth behavior if not required\n      if (shouldBailOut(arguments[0]) === true) {\n        original.scrollIntoView.call(\n          this,\n          arguments[0] === undefined ? true : arguments[0]\n        );\n\n        return;\n      }\n\n      // LET THE SMOOTHNESS BEGIN!\n      var scrollableParent = findScrollableParent(this);\n      var parentRects = scrollableParent.getBoundingClientRect();\n      var clientRects = this.getBoundingClientRect();\n\n      if (scrollableParent !== d.body) {\n        // reveal element inside parent\n        smoothScroll.call(\n          this,\n          scrollableParent,\n          scrollableParent.scrollLeft + clientRects.left - parentRects.left,\n          scrollableParent.scrollTop + clientRects.top - parentRects.top\n        );\n\n        // reveal parent in viewport unless is fixed\n        if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n          w.scrollBy({\n            left: parentRects.left,\n            top: parentRects.top,\n            behavior: 'smooth'\n          });\n        }\n      } else {\n        // reveal element in viewport\n        w.scrollBy({\n          left: clientRects.left,\n          top: clientRects.top,\n          behavior: 'smooth'\n        });\n      }\n    };\n  }\n\n  if (typeof exports === 'object' && typeof module !== 'undefined') {\n    // commonjs\n    module.exports = { polyfill: polyfill };\n  } else {\n    // global\n    polyfill();\n  }\n\n}());\n\n\n;(function (app) {\n    class Carousel {\n        /**\n         * @type {window.Viewport}\n         */\n        viewport = app.viewport;\n\n        /**\n         * @type {HTMLElement}\n         */\n        el;\n\n        /**\n         * @type {{left: ?HTMLElement, right: ?HTMLElement, container: ?HTMLElement, links: HTMLElement[]}}\n         */\n        ui = {};\n\n        /**\n         * @type {HTMLElement|null}\n         */\n        container;\n\n        /**\n         * @type {HTMLElement[]}\n         */\n        links;\n\n        /**\n         * @type {number}\n         */\n        initialId = 0;\n\n        /**\n         * @type {?number}\n         */\n        oldMouseX = null;\n\n        /**\n         * @type {?number}\n         */\n        mouseX = null;\n\n        /**\n         * @type {boolean}\n         */\n        mouseDown = false;\n\n        /**\n         * @type {boolean}\n         */\n        clicked = false;\n\n        /**\n         * @type {?string}\n         */\n        activate;\n\n        /**\n         * @type {boolean}\n         */\n        snap = false;\n\n        /**\n         * @type {boolean}\n         */\n        infinite = false;\n\n        /**\n         * Centre the current item?\n         * @type {boolean}\n         */\n        centred = false;\n\n        /**\n         * @type {number}\n         */\n        id = 0;\n\n        /**\n         * Define breakpoint padding\n         *\n         * @type {?Object}\n         */\n        padding\n\n        /**\n         * @type {Object}\n         */\n        breakpoints;\n\n        /**\n         * @type {Object}\n         */\n        currentBreakpoint;\n\n        duration = 200;\n\n        /**\n         * @type {Object<function>}\n         */\n        static easings = {\n            linear(t) {\n                return t;\n            },\n            easeInQuad(t) {\n                return t * t;\n            },\n            easeOutQuad(t) {\n                return t * (2 - t);\n            },\n            easeInOutQuad(t) {\n                return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n            },\n            easeInCubic(t) {\n                return t * t * t;\n            },\n            easeOutCubic(t) {\n                return (--t) * t * t + 1;\n            },\n            easeInOutCubic(t) {\n                return t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;\n            },\n            easeInQuart(t) {\n                return t * t * t * t;\n            },\n            easeOutQuart(t) {\n                return 1 - (--t) * t * t * t;\n            },\n            easeInOutQuart(t) {\n                return t < 0.5 ? 8 * t * t * t * t : 1 - 8 * (--t) * t * t * t;\n            },\n            easeInQuint(t) {\n                return t * t * t * t * t;\n            },\n            easeOutQuint(t) {\n                return 1 + (--t) * t * t * t * t;\n            },\n            easeInOutQuint(t) {\n                return t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * (--t) * t * t * t * t;\n            }\n        };\n\n        /**\n         * Functions to calculate padding values from parsed units\n         *\n         * @type {Object<function>}\n         */\n        static paddingFunctions = {\n            px(value) {\n                return parseInt(value.replace('px', ''));\n            },\n            vw(value) {\n                return (window.innerWidth / 100) * parseInt(value.replace('vw', ''));\n            },\n            vh(value) {\n                return (window.innerHeight / 100) * parseInt(value.replace('vh', ''));\n            },\n            '+'(total, value) {\n                return total + value;\n            },\n            '-'(total, value) {\n                return total - value;\n            },\n            '/'(total, value) {\n                return total / value;\n            },\n            '*'(total, value) {\n                return total * value;\n            }\n        };\n\n        /**\n         * @param {HTMLElement} el\n         */\n        constructor(el) {\n            this.el = el;\n            this.ui = {\n                left: this.el.querySelector('button[data-direction=\"left\"].js-carousel__control'),\n                right: this.el.querySelector('button[data-direction=\"right\"].js-carousel__control'),\n                container: this.el.querySelector('.js-carousel__container'),\n            }\n            this.ui.links = this.getLinks();\n        }\n\n        /**\n         * Collect elements, set things up and bind to events\n         */\n        init() {\n            this.initialId = parseInt(this.el.getAttribute('data-initial-id'), 10);\n            this.oldMouseX = null;\n            this.mouseX = null;\n            this.mouseDown = false;\n            this.clicked = false;\n            this.centred = false;\n            this.controlClicked = false;\n            this.activate = this.el.getAttribute('data-carousel-activate');\n            this.snap = this.el.hasAttribute('data-carousel-snap');\n            this.infinite = this.el.hasAttribute('data-carousel-infinite');\n            this.centred = this.el.hasAttribute('data-carousel-centred');\n            this.padding = JSON.parse(this.el.getAttribute('data-carousel-padding'));\n            this.id = 0;\n\n            if (this.initialId) {\n                // Adjust the scroll if we are not starting on the first item\n                const widthOfOneItem = this.ui.links[0].offsetWidth - this.getContainerPadding();\n                if (this.centred) {\n                    const containerWidth = this.el.scrollWidth;\n                    const initialItem = this.ui.links[this.initialId];\n                    this.ui.container.scrollLeft = initialItem.offsetLeft - (containerWidth - initialItem.offsetWidth) / 2;\n                } else {\n                    this.ui.container.scrollLeft = this.initialId * widthOfOneItem;\n                }\n                this.setActive(this.ui.links.find(e => parseInt(e.dataset.id, 10) === this.initialId));\n                this.id = this.initialId + 1;\n            }\n\n            window.requestAnimationFrame(() => {\n                this.defineBreakpoints();\n                this.checkBreakpoint();\n                this.watchControls();\n                this.watchKeys();\n                this.watchLinks();\n                this.watchScroll();\n                this.watchResize();\n                this.resetKeys();\n                this.updateStatus();\n\n                window.addEventListener('load', () => {\n                    this.updateControls();\n                });\n            })\n        }\n\n        /**\n         * @return {Array<HTMLElement>}\n         */\n        getLinks() {\n            /**\n             * @type {Array<HTMLElement>}\n             */\n            const links = [].slice.call(\n                this.ui.container.querySelectorAll(this.el.getAttribute('data-carousel-items')));\n            links.forEach((e, i) => e.setAttribute('data-id', i));\n            return links;\n        }\n\n        /**\n         * Check the current breakpoint\n         *\n         * @param {Object} optionsOverride\n         */\n        checkBreakpoint(optionsOverride) {\n            if (typeof this.breakpoints === 'undefined') {\n                return;\n            }\n\n            let breakpoint;\n            const options = Object.assign(\n                {\n                    breakpointChanged: () => {\n                    }\n                },\n                optionsOverride\n            );\n\n\n            for (let i in this.breakpoints) {\n                if (typeof this.breakpoints[i] !== 'undefined') {\n                    if (this.viewport.matches(this.breakpoints[i])) {\n                        breakpoint = i;\n                    }\n                } else {\n                    breakpoint = i;\n                }\n            }\n\n            if (this.currentBreakpoint !== breakpoint) {\n                this.currentBreakpoint = breakpoint;\n\n                if (typeof options.breakpointChanged === 'function') {\n                    options.breakpointChanged();\n                }\n            }\n        }\n\n        /**\n         * Disable focus on all (or all BUT the active item) items\n         *\n         * @param ignoreActive\n         */\n        disableFocus(ignoreActive) {\n            const item = this.getTarget();\n\n            item.forEach((el, i) => {\n                if (!ignoreActive || (ignoreActive && i !== this.id)) {\n                    el.setAttribute('tabIndex', -1);\n                }\n            });\n        }\n\n        /**\n         * Set the viewed carousel item\n         *\n         * @param {Element} el\n         */\n        setViewing(el) {\n            this.el.classList.remove('carousel--scrolling');\n            el.setAttribute('data-carousel-item-active', true);\n            window.setTimeout(() => {\n                el.setAttribute('data-carousel-item-viewing', true);\n            },50);\n        }\n\n        /**\n         * Update the state of the carousel controls\n         */\n        updateControls() {\n            if (this.ui.left) {\n                if (this.ui.container.scrollLeft === 0 && !this.infinite) {\n                    this.ui.left.setAttribute('disabled', true);\n                } else {\n                    this.ui.left.removeAttribute('disabled');\n                }\n            }\n            if (this.ui.right) {\n                if ((this.ui.container.scrollLeft + this.ui.container.clientWidth === this.ui.container.scrollWidth) && !this.infinite) {\n                    this.ui.right.setAttribute('disabled', true);\n                } else {\n                    this.ui.right.removeAttribute('disabled');\n                }\n            }\n        }\n\n        /**\n         * @param {number} destination\n         * @param {number} duration\n         * @param {string} easing\n         * @param {function} callback\n         */\n        animate(destination, duration = this.duration, easing = 'linear', callback) {\n            const start = this.ui.container.scrollLeft;\n            const container = this.ui.container;\n            let startTime;\n\n            if (destination < 0) {\n                destination = 0;\n            } else if (this.ui.container.scrollWidth - this.ui.container.clientWidth < destination) {\n                destination = this.ui.container.scrollWidth - this.ui.container.clientWidth;\n            }\n\n            function scroll(timestamp) {\n                if (startTime === undefined) {\n                    startTime = timestamp;\n                }\n                const elapsed = timestamp - startTime;\n\n                const time = Math.min(1, (elapsed / duration));\n                const timeFunction = Carousel.easings[easing](time);\n\n                container.scroll(Math.ceil((timeFunction * (destination - start)) + start), 0);\n\n                if (container.scrollLeft === destination) {\n                    if (callback) {\n                        callback();\n                    }\n                    return;\n                }\n\n                requestAnimationFrame(scroll);\n            }\n\n            requestAnimationFrame(scroll);\n        }\n\n        /**\n         * Watch the carousel links for mouse events\n         */\n        watchLinks() {\n            this.ui.links.forEach((el, i) => {\n                // Assign an ID to the link\n                el.setAttribute('data-id', i.toString(10));\n\n                if (i === this.initialId) {\n                    this.setViewing(el);\n                }\n\n                let moved = false;\n\n                // When the mouse is clicked, activate the mouseDown variable\n                el.onmousedown = (e) => {\n                    if (this.isValid()) {\n                        e.preventDefault();\n                        this.mouseDown = true;\n                    }\n                    moved = false;\n                }\n\n                // When the mouse is moved, updated the mouseX variable\n                el.onmousemove = (e) => {\n                    if (this.mouseDown) {\n                        e.preventDefault();\n                        if (this.isValid()) {\n                            let last = this.ui.links[this.ui.links.length - 1];\n                            let first = this.ui.links[0];\n                            if (this.infinite) {\n                                if (e.clientX < this.mouseX) {\n                                    if (this.ui.container.scrollLeft + this.ui.container.offsetWidth >= last.offsetLeft + last.offsetWidth) {\n                                        this.shiftRight(first, 2 * first.scrollWidth);\n                                    }\n                                } else if (e.clientX > this.mouseX) {\n                                    if (this.infinite) {\n                                        if (this.ui.container.scrollLeft <= 0 && first.offsetLeft === 0) {\n                                            this.shiftLeft(last);\n                                        }\n                                    }\n                                }\n                            }\n                            this.mouseX = e.clientX;\n                        }\n                    }\n                    moved = true;\n                }\n\n                // When the mouse is released, if the mouseX has not changed, then trigger the click on the link\n                el.onmouseup = (e) => {\n                    if (this.isValid()) {\n                        e.preventDefault();\n                        this.mouseDown = false;\n\n                        if (moved) {\n                            e.target.addEventListener('click', this.preventClick);\n                        } else {\n                            e.target.removeEventListener('click', this.preventClick);\n                        }\n                        this.oldMouseX = this.mouseX;\n                    }\n                }\n\n                // Scroll to the link when it is focussed\n                el.onfocus = () => {\n                    if (this.isValid()) {\n                        this.id = i;\n                        this.scrollTo(el);\n                        this.updateActive(true);\n                    }\n                }\n\n                // Unset the active state of the link when it is blurred\n                el.onblur = () => {\n                    if (this.isValid()) {\n                        this.unsetActive(el, true);\n                    }\n                }\n            });\n        }\n\n        shiftLeft(last) {\n            this.ui.container.prepend(last);\n            this.ui.container.scrollLeft = this.ui.container.scrollLeft + last.offsetWidth;\n            this.ui.links = this.getLinks();\n        }\n\n        getTarget() {\n            return this.ui.links;\n        }\n\n        /**\n         * Watch resize event\n         */\n        watchResize() {\n            window.addEventListener('resize', D3R.throttle(50, false, (e) => {\n                this.updateStatus();\n            }));\n        }\n\n        /**\n         * Scroll left by one item\n         */\n        scrollLeft() {\n            let last = this.ui.links[this.ui.links.length - 1];\n\n            if (this.infinite) {\n                window.requestAnimationFrame(() => {\n                    this.el.classList.add('carousel--scrolling');\n                    this.shiftLeft(last);\n                });\n            }\n\n            window.requestAnimationFrame(() => {\n                this.el.classList.add('carousel--scrolling');\n                this.animate(\n                    this.ui.container.scrollLeft - (this.ui.container.clientWidth - this.getContainerPadding()),\n                    this.duration,\n                    'easeInOutQuad',\n                    () => {\n                        if (this.infinite) {\n                            this.id = this.id === 0 ? this.ui.links.length - 1 : this.id - 1;\n                        }\n                        this.updated();\n                    }\n                );\n                this.controlClicked = true;\n            });\n        }\n\n        /**\n         * Unset the active carousel item\n         *\n         * @param el\n         * @param viewing\n         */\n        unsetActive(el, viewing) {\n            el.removeAttribute('data-carousel-item-active');\n\n            if (!viewing) {\n                this.unsetViewing(el);\n            }\n        }\n\n        /**\n         * Unset the last active carousel item and set the new one\n         *\n         * @param {boolean} onfocus\n         */\n        updateActive(onfocus) {\n            const item = this.getTarget();\n\n            if (typeof item[this.id] === 'undefined') {\n                return;\n            }\n\n            let active = item[this.id];\n\n            if (onfocus) {\n                active = document.activeElement;\n            }\n            item.forEach((el) => {\n                this.unsetActive(el);\n            });\n\n            this.setActive(active);\n        }\n\n        /**\n         * Watch the document for keypress events\n         */\n        watchKeys() {\n            document.addEventListener('keydown', e => {\n                if (e.key === 'Meta') {\n                    this.keys.meta = true;\n                }\n                if (e.key === 'Control') {\n                    this.keys.ctrl = true;\n                }\n            });\n\n            document.addEventListener('keyup', (e) => {\n                if (e.key === 'Meta') {\n                    this.keys.meta = false;\n                }\n                if (e.key === 'Control') {\n                    this.keys.ctrl = false;\n                }\n            });\n        }\n\n        /**\n         * Check if the carousel is valid to be shown/interacted with\n         *\n         * @return {boolean}\n         */\n        isValid() {\n            if (this.activate) {\n                return this.viewport.matches(D3R.sizes[this.activate]);\n            }\n            return true;\n        }\n\n        /**\n         * Scroll to the active item\n         */\n        scroll() {\n            this.scrollTo(this.ui.links[this.id]);\n            this.updated();\n        }\n\n        /**\n         * Define the padding on the container\n         *\n         * @return {?number}\n         */\n        getContainerPadding() {\n            if (!this.padding) {\n                return null;\n            }\n\n            let padding = false;\n            const arithmetic = ['+', '-', '/', '*'];\n            const units = ['px', 'vw', 'vh'];\n\n            for (let i in this.padding) {\n                let value = this.padding[i];\n\n                if (typeof this.padding[i] === 'object') {\n                    let calculation = [];\n\n                    this.padding[i].forEach((el) => {\n                        if (typeof el === 'string') {\n                            if (arithmetic.indexOf(el) > -1) {\n                                calculation.push(el);\n                            } else {\n                                units.forEach((unit) => {\n                                    if (el.indexOf(unit) > -1) {\n                                        calculation.push(Carousel.paddingFunctions[unit](el));\n                                    }\n                                });\n                            }\n                        } else {\n                            calculation.push(el);\n                        }\n                    });\n\n                    let total = 0;\n                    let method = null;\n\n                    calculation.forEach((array, l) => {\n                        if (method === null) {\n                            if (typeof array[l] === 'string') {\n                                if (arithmetic.indexOf(array[l]) > -1) {\n                                    method = array[l];\n                                }\n                            } else {\n                                total = array[l];\n                            }\n                        } else {\n                            total = Carousel.paddingFunctions[method](total, array[l]);\n                        }\n                    });\n\n                    value = total;\n                }\n                if (D3R.sizes[i] !== false) {\n                    if (this.viewport.matches(D3R.sizes[i])) {\n                        padding = value;\n                    }\n                } else {\n                    if (padding === false) {\n                        padding = value;\n                    }\n                }\n            }\n\n            return padding;\n        }\n\n        /**\n         * Scroll right by one item\n         */\n        scrollRight() {\n            let first = this.ui.links[0];\n            this.el.classList.add('carousel--scrolling');\n\n            window.requestAnimationFrame(() => {\n                this.animate(\n                    (this.infinite && first) ?\n                        // Infinite carousel so just move by one item\n                        first.offsetWidth\n                        // Otherwise try to scroll the whole container\n                        : this.ui.container.scrollLeft + (this.ui.container.clientWidth - this.getContainerPadding()),\n                    this.duration,\n                    'easeInOutQuad',\n                    () => {\n                        if (this.infinite) {\n                            this.id = this.id === this.ui.links.length - 1 ? this.ui.links.length - 1 : this.id + 1;\n                        }\n\n                        this.updated();\n\n                        if (this.infinite) {\n                            window.requestAnimationFrame(() => {\n                                this.shiftRight(first, 0);\n                            });\n                        }\n                    }\n                );\n                this.controlClicked = true;\n            });\n        }\n\n        /**\n         * Scroll to a given item\n         *\n         * @param {Element} el\n         */\n        scrollTo(el) {\n            this.updateControls();\n\n            if (this.ui.container.scrollLeft + this.ui.container.clientWidth === this.ui.container.scrollWidth) {\n                this.resetFocus();\n                if (this.controlClicked) {\n                    this.disableFocus(true);\n                    this.ui.links[this.id].onfocus = () => {\n                        this.scrollTo(this);\n                        this.resetFocus();\n                        this.updateActive(true);\n                    }\n                }\n                this.controlClicked = false;\n            } else {\n                this.animate(\n                    el.parentNode.offsetLeft - el.parentNode.parentNode.offsetLeft - this.getContainerPadding(), 200,\n                    'easeInOutQuad', () => {\n                        this.updateActive(false);\n                        this.resetFocus();\n                        this.scrolled = true;\n                    }\n                );\n            }\n        }\n\n        /**\n         * Watch the carousel for scrolling\n         */\n        watchScroll() {\n            let timeout;\n\n            this.ui.container.addEventListener('scroll', () => {\n                if (this.scrolled) {\n                    this.scrolled = false;\n                    return;\n                }\n\n                const d = [];\n                // Find all links that are fully visible\n                const visible = this.ui.links.filter((el) => {\n                    return el.getBoundingClientRect().left >= this.ui.container.getBoundingClientRect().left\n                        && el.getBoundingClientRect().right <= this.ui.container.getBoundingClientRect().right;\n                });\n\n                if (visible.length > 0) {\n                    // If we have visible items, select the middle-most one (preferring the LHS if there are an even number)\n                    this.id = parseInt(visible[Math.floor(visible.length / 2)].getAttribute('data-id'));\n                }\n\n                this.resetFocus();\n                this.disableFocus(true);\n\n                const item = this.getTarget();\n                if (typeof item[this.id] !== 'undefined') {\n                    item[this.id].onfocus = () => {\n                        this.resetFocus();\n                        this.updateActive(true);\n                    }\n                }\n\n                clearTimeout(timeout);\n\n                timeout = setTimeout(() => {\n                    if (!this.controlClicked) {\n                        this.resetFocus();\n                        if (typeof item[this.id] !== 'undefined') {\n                            const item = this.getTarget();\n\n                            item[this.id].focus({preventScroll: true});\n                        }\n                    } else {\n                        this.controlClicked = false;\n                    }\n\n                    this.updateControls();\n                    this.updated();\n                    this.updateActive(false);\n\n                    if (this.snap) {\n                        const center = this.getContainerPadding();\n\n                        this.ui.links.forEach((el) => {\n                            if (\n                                center >= el.offsetLeft - this.ui.container.scrollLeft\n                                && center <= el.offsetLeft - this.ui.container.scrollLeft + el.clientWidth\n                            ) {\n                                this.scrollTo(el);\n                                el.focus({preventScroll: true});\n                            }\n                        });\n                    }\n                }, 100);\n            });\n        }\n\n        shiftRight(first, left) {\n            const down = this.mouseDown;\n            this.mouseDown = false;\n            this.ui.container.appendChild(first);\n            this.ui.container.scrollLeft = left;\n            this.ui.links = this.getLinks();\n            this.mouseDown = down;\n        }\n\n        /**\n         * Set the active carousel item\n         *\n         * @param el\n         */\n        setActive(el) {\n            el.setAttribute('data-carousel-item-active', true);\n\n            this.setViewing(el);\n        }\n\n        /**\n         * Unset the viewed carousel item\n         *\n         * @param {Element} el\n         */\n        unsetViewing(el) {\n            el.removeAttribute('data-carousel-item-viewing');\n        }\n\n        /**\n         * Define the breakpoints to be taken into consideration for layout changes\n         */\n        defineBreakpoints() {\n            const data = JSON.parse(this.el.getAttribute('data-carousel-layout-check'));\n\n            if (!data || data.length === 0) {\n                return;\n            }\n\n            this.breakpoints = {};\n            this.currentBreakpoint;\n\n            data.forEach((el) => {\n                this.breakpoints[el] = D3R.breakpoints[D3R.sizes[el]];\n            });\n        }\n\n        updateStatus() {\n            if (this.isValid()) {\n                this.el.classList.add('carousel--active');\n            } else {\n                this.el.classList.remove('carousel--active');\n            }\n        }\n\n        resetFocus() {\n            const item = this.getTarget();\n\n            item.forEach((el) => {\n                el.removeAttribute('tabIndex');\n            });\n        }\n\n        /**\n         * Watch the carousel controls for click events\n         */\n        watchControls() {\n            if (this.ui.left) {\n                this.ui.left.addEventListener('click', this.scrollLeft.bind(this));\n            }\n\n            if (this.ui.right) {\n                this.ui.right.addEventListener('click', this.scrollRight.bind(this));\n            }\n        }\n\n        preventClick(e) {\n            e.preventDefault();\n            e.stopImmediatePropagation();\n\n            e.target.removeEventListener('click', this.preventClick);\n        }\n\n        updated() {\n            this.el.setAttribute('data-active', this.id);\n            this.el.dispatchEvent(new CustomEvent('carouselUpdated', {\n                detail: {\n                    item: this.ui.links[this.id]\n                }\n            }));\n        }\n\n        resetKeys() {\n            this.keys = {\n                meta: false,\n                ctrl: false\n            };\n        }\n    }\n\n    app.Carousel = Carousel;\n})(window.D3RSite = window.D3RSite || {})\n\nD3R.carousels = [];\n\nD3R.carousel = function() {\n    document.querySelectorAll('.js-carousel').forEach((el) => {\n        const carousel = new D3RSite.Carousel(el);\n        D3R.carousels.push(carousel);\n\n        window.addEventListener('load', () => {\n            carousel.init();\n        })\n    });\n}\n\n\nD3R.carousel();\n","D3R.carousels = [];\n\nD3R.carousel = function() {\n    document.querySelectorAll('.js-carousel').forEach((el) => {\n        const carousel = new D3RSite.Carousel(el);\n        D3R.carousels.push(carousel);\n\n        window.addEventListener('load', () => {\n            carousel.init();\n        })\n    });\n}\n"]}