{"version":3,"sources":["webpack:///dynamic-conveyor-carousel-ac259dd6080f85168d62.js","webpack:///webpack/bootstrap 49e3f4ed5eed6f7b6fe0","webpack:///./src/js/lib/dot_indicator.js","webpack:///./src/js/lib/dragger1d.js","webpack:///./components/dynamic-conveyor-carousel/dynamic-conveyor-carousel.js","webpack:///./src/js/lib/tween.js","webpack:///./src/js/lib/nudge_interaction_cue.js","webpack:///./src/js/lib/currency.js","webpack:///./src/js/lib/drag_selector1d.js","webpack:///./src/js/lib/interaction_cue.js","webpack:///./src/js/lib/interaction_cue_hand.png.js","webpack:///./src/js/lib/scheduler.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","13","__webpack_exports__","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","length","descriptor","writable","key","protoProps","staticProps","_Liftoff","Liftoff","_Liftoff$DOMUtils","DOMUtils","createElement","replaceStyle","range","Utils","DotIndicator","count","_ref","_this","this","containerStyle","dotStyle","activeDotStyle","horizontalCarousel","_ref$dotsTopOrBottom","dotsTopOrBottom","undefined","currentIndex","background","verticalCarousel","dotsClasses","dotClasses","push","dotElements","map","classList","style","element","children","setIndex","value","newIndex","oldDotElement","remove","newDotElement","add","14","off","on","transitionEndPromise","clamp","Dragger1D","_ref$isEnabled","isEnabled","_ref$bounds","bounds","min","max","_ref$onDragStart","onDragStart","_ref$onDragMove","onDragMove","_ref$onDragEnd","onDragEnd","_ref$onClick","onClick","_ref$dragAnywhere","dragAnywhere","_ref$transitionMS","transitionMS","_ref$horizontalCarous","_ref$carouselSnapsToS","carouselSnapsToScreen","conveyorImagesTransition","_ref$forConveyor","forConveyor","slideWidth","itemCount","baseSlidePosition","baseFramePosition","basePosition","oldTransitionStyle","defaultStyle","position","top","left","right","bottom","transition","frameElement","width","height","activeSlideStyle","axis","setBounds","resetPosition","dragStartEvents","mousedown touchstart","e","_onStart","_elementEvents","assign","click","_onClick","_windowEvents","mousemove touchmove","_onMove","mouseup touchend mouseleave touchleave","_onEnd","window","index","_resetState","_setElementPosition","newBasePosition","framePosition","_ref2","_ref2$min","Infinity","_ref2$max","_ref3","_this2","_ref3$offset","offset","_ref3$durationMS","durationMS","_ref3$conveyorBorderT","conveyorBorderTransition","elementToNudge","newPosition","oldTransition","matchTarget","then","oldPosition","finally","isDragging","dragDelta","dragStartPosition","setBaseFramePosition","hasDragMoved","notNudgingFrame","transform","_setFramePosition","stopPropagation","pointerEvent","touches","clientX","clientY","_getState","pointerEvents","dragMoved","state","currentDragPosition","dragPosition","145","146","_possibleConstructorReturn","self","ReferenceError","_inherits","subClass","superClass","create","constructor","setPrototypeOf","__proto__","_toConsumableArray","arr","Array","isArray","arr2","from","__WEBPACK_IMPORTED_MODULE_0__src_js_lib_currency__","__WEBPACK_IMPORTED_MODULE_1__src_js_lib_dot_indicator__","__WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__","__WEBPACK_IMPORTED_MODULE_3__src_js_lib_interaction_cue__","__WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__","__WEBPACK_IMPORTED_MODULE_5__src_js_lib_scheduler__","__WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__","_get","receiver","Function","desc","getOwnPropertyDescriptor","parent","getPrototypeOf","_window$Liftoff","Component","_window$Liftoff$Utils","loadImage","_window$Liftoff$DOMUt","appendChildren","empty","fragmentFromString","currencyAnimationDurationMS","isDigit","char","getNumericalPrice","price","Number","parseFloat","concat","filter","join","getDiscount","product","normalPrice","specialPrice","normal","special","discount","ProductDiscount","discountTextStyle","totalDiscount","startTime","Date","now","tagName","tween","startValue","endValue","easingFn","Easing","EaseOutQuad","start","onUpdate","currentDiscount","textContent","Math","floor","ProductPrice","mainPriceStyle","overriddenPriceStyle","shouldAnimatePrice","mainPrice","overriddenPrice","priceFormatter","mainPriceEl","initAnimation","numericalMainPrice","updatePrice","currentTweenValue","currentTweenDigits","round","renderProductInfo","infoElement","containerClassList","prefixHTML","prefixStyle","suffixHTML","suffixStyle","renderProductImage","productImageSizing","imageURL","backgroundImage","backgroundSize","ProductCarouselSlide","_ref4","_ref4$productSlideCon","productSlideConfig","productImageStyle","productContainerStyle","showPrices","priceInfoConfig","showTitle","titleTextStyle","titleInfoConfig","showDescription","descriptionTextStyle","descriptionInfoConfig","showDiscount","discountInfoConfig","interactionCueHand","title","description","showDiscountWithDefault","getElement","productElement","reset","ProductCarousel","_ref5","products","onProductClick","onProductSelection","interactionCueType","interactionCueInterval","_ref5$interactionCueH","flickInteractionCueHand","attachHandToSlides","productSlides","dragSelector","slidesPerView","onSelection","productSlide","nudgeInteractionCue","nudgeType","intervalMS","nudger","stop","activate","slidesPerConveyorView","ProductConveyorSlide","_ref6","zIndex","eventHandlers","ProductConveyor","_ref7","_ref7$interactionCueH","slide","slideIndex","setInteractionCueHand","setHandForSlide","register","_Component","DynamicConveyorCarousel","config","_this3","hasDragSelected","currentProductIndex","useStaticProducts","productCount","Madlib","getNextProduct","rawProduct","id","image_url","display_price","special_display_price","autoTransitionScheduler","autoScrollDelayMS","callback","_handleAutoTransition","bind","allImageURLs","_ref8","customHandImage","url","Promise","all","parentNode","_this4","el","appendChild","boundingClientRect","getBoundingClientRect","isCarouselInteractive","carouselInteractionCue","isConveyorInteractive","conveyorInteractionCue","showInteractionCueHand","useAutoScroll","interactionCueHandStyle","carousel","_handleDragStart","_stopInteractionCues","_handleProductClick","_handleProductSelection","priceContainerStyle","pricePrefix","pricePrefixStyle","priceSuffix","priceSuffixStyle","titleStyle","titlePrefix","titlePrefixStyle","titleSuffix","titleSuffixStyle","descriptionStyle","descriptionPrefix","descriptionPrefixStyle","descriptionSuffix","descriptionSuffixStyle","discountStyle","discountPrefix","discountPrefixStyle","discountSuffix","discountSuffixStyle","conveyor","activeConveyorSlideStyle","dotIndicator","dotsContainerStyle","spacingPx","verticalSpacing","makeSpacer","showConveyor","showDots","firstProductIndex","_setProductIndex","startInteractionCue","_startInteractionCues","stopInteractionCue","hide","_stopAutoTransitions","indexDelta","_this5","flick","onFlickReady","_transitionProductView","flickDuration","productIndex","mergeClickParams","pid","recordInteraction","handleNavigationClick","_updateGlobalProductIdParam","147","15","_typeof","Symbol","iterator","obj","Tween","forEach","param","end","ease","f","k","callbackMap","arguments","startTS","stopped","update","currentValue","valueNow","requestAnimationFrame","onComplete","elapsed","Linear","EaseInSine","cos","PI","EaseOutSine","sin","EaseInOutSine","EaseInQuad","pow","EaseInOutQuad","EaseInCubic","EaseOutCubic","EaseInOutCubic","19","__WEBPACK_IMPORTED_MODULE_0__scheduler__","nudgeTypeToPx","nudge-up","nudge-down","nudge-left","nudge-right","getNudgeOffsetPx","NudgeInteractionCue","_ref$interactionCueHa","_ref$conveyorBorderTr","scheduler","nudge","flickDistance","flickRotation","xOrY","resolve","setTimeout","show","31","makeCurrencyFormatter","baseStr","numericChars","prefixStr","shift","suffixStr","pop","decimalSeparator","groupSeparatorIndex","groupSeparator","decimalPosition","charShouldBeGroupSeparator","charIndex","charsFromDecimal","charShouldBeDecimalSeparator","intToFormat","strToFormat","String","repeat","formattedDigits","reverse","reduce","reversedFormatted","digitChar","digitIndex","digitsBeforeDecimalCount","32","__WEBPACK_IMPORTED_MODULE_0__dragger1d__","DragSelector1D","_ref$onSelection","slideHeight","widthOrHeight","slideWidthOrHeight","minDivisor","maxDivisor","dragger","_getNearestIndex","getFrameElement","_dragger","apply","setBasePosition","dragState","sign","33","__WEBPACK_IMPORTED_MODULE_0__interaction_cue_hand_png__","runTransitionSequence","InteractionCue","cueImageURL","backgroundRepeat","display","_ref$onFlickReady","_ref$flickDistance","_ref$flickRotation","_ref$flickDuration","_ref$flickGrowth","flickGrowth","_ref$xOrY","transitionTimingFunction","34","5","Scheduler","_ref$leading","leading","isActive","intervalID","setInterval","clearInterval"],"mappings":"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","file":"dynamic-conveyor-carousel-ac259dd6080f85168d62.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 145);\n/******/ })\n/************************************************************************/\n/******/ ({\n\n/***/ 13:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Liftoff = Liftoff,\n _Liftoff$DOMUtils = _Liftoff.DOMUtils,\n createElement = _Liftoff$DOMUtils.createElement,\n replaceStyle = _Liftoff$DOMUtils.replaceStyle,\n range = _Liftoff.Utils.range;\n\nvar DotIndicator = function () {\n function DotIndicator(count, _ref) {\n var _this = this;\n\n var containerStyle = _ref.containerStyle,\n dotStyle = _ref.dotStyle,\n activeDotStyle = _ref.activeDotStyle,\n horizontalCarousel = _ref.horizontalCarousel,\n _ref$dotsTopOrBottom = _ref.dotsTopOrBottom,\n dotsTopOrBottom = _ref$dotsTopOrBottom === undefined ? false : _ref$dotsTopOrBottom;\n\n _classCallCheck(this, DotIndicator);\n\n this.count = count;\n this.currentIndex = 0;\n this.dotStyle = dotStyle;\n this.activeDotStyle = activeDotStyle;\n if (!this.activeDotStyle) {\n this.activeDotStyle = {\n background: \"#999\"\n };\n }\n this.horizontalCarousel = horizontalCarousel;\n this.verticalCarousel = horizontalCarousel === false; // explicitly using 'false' for backwards compatibility\n\n this.dotsClasses = [\"dots\"];\n this.dotClasses = [\"dot\"];\n if (horizontalCarousel) {\n this.dotsClasses.push(\"dots-horizontal-style\");\n this.dotClasses.push(\"dot-style\");\n } else if (this.verticalCarousel) {\n this.dotsClasses.push(dotsTopOrBottom || \"dots-vertical-style-top\");\n this.dotClasses.push(\"dot-style\");\n }\n\n this.dotElements = range(0, count).map(function () {\n return createElement({\n classList: _this.dotClasses,\n style: dotStyle\n });\n });\n\n this.element = createElement({\n classList: this.dotsClasses,\n children: this.dotElements,\n style: containerStyle\n });\n\n this.setIndex(0);\n }\n\n _createClass(DotIndicator, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"setIndex\",\n value: function setIndex(newIndex) {\n if (!(0 <= newIndex && newIndex < this.count)) return;\n\n var oldDotElement = this.dotElements[this.currentIndex];\n replaceStyle(oldDotElement, this.dotStyle);\n oldDotElement.classList.remove(\"active\");\n\n this.currentIndex = newIndex;\n\n var newDotElement = this.dotElements[this.currentIndex];\n replaceStyle(newDotElement, this.dotStyle, this.activeDotStyle);\n newDotElement.classList.add(\"active\");\n }\n }]);\n\n return DotIndicator;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (DotIndicator);\n\n/***/ }),\n\n/***/ 14:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar _Liftoff = Liftoff,\n _Liftoff$DOMUtils = _Liftoff.DOMUtils,\n createElement = _Liftoff$DOMUtils.createElement,\n off = _Liftoff$DOMUtils.off,\n on = _Liftoff$DOMUtils.on,\n transitionEndPromise = _Liftoff$DOMUtils.transitionEndPromise,\n clamp = _Liftoff.Utils.clamp;\n\nvar Dragger1D = function () {\n function Dragger1D(_ref) {\n var _this = this;\n\n var _ref$isEnabled = _ref.isEnabled,\n isEnabled = _ref$isEnabled === undefined ? true : _ref$isEnabled,\n _ref$bounds = _ref.bounds,\n min = _ref$bounds.min,\n max = _ref$bounds.max,\n _ref$onDragStart = _ref.onDragStart,\n onDragStart = _ref$onDragStart === undefined ? function () {} : _ref$onDragStart,\n _ref$onDragMove = _ref.onDragMove,\n onDragMove = _ref$onDragMove === undefined ? function () {} : _ref$onDragMove,\n _ref$onDragEnd = _ref.onDragEnd,\n onDragEnd = _ref$onDragEnd === undefined ? function () {} : _ref$onDragEnd,\n _ref$onClick = _ref.onClick,\n onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n _ref$dragAnywhere = _ref.dragAnywhere,\n dragAnywhere = _ref$dragAnywhere === undefined ? false : _ref$dragAnywhere,\n _ref$transitionMS = _ref.transitionMS,\n transitionMS = _ref$transitionMS === undefined ? 500 : _ref$transitionMS,\n children = _ref.children,\n _ref$horizontalCarous = _ref.horizontalCarousel,\n horizontalCarousel = _ref$horizontalCarous === undefined ? true : _ref$horizontalCarous,\n _ref$carouselSnapsToS = _ref.carouselSnapsToScreen,\n carouselSnapsToScreen = _ref$carouselSnapsToS === undefined ? true : _ref$carouselSnapsToS,\n conveyorImagesTransition = _ref.conveyorImagesTransition,\n _ref$forConveyor = _ref.forConveyor,\n forConveyor = _ref$forConveyor === undefined ? false : _ref$forConveyor,\n slideWidth = _ref.slideWidth,\n itemCount = _ref.itemCount;\n\n _classCallCheck(this, Dragger1D);\n\n this.itemCount = itemCount;\n this.baseSlidePosition = false;\n this.baseFramePosition = false;\n this.isEnabled = isEnabled;\n this.forConveyor = forConveyor;\n this.horizontalCarousel = horizontalCarousel;\n this.carouselSnapsToScreen = carouselSnapsToScreen;\n this.conveyorImagesTransition = conveyorImagesTransition;\n this.onDragStart = onDragStart;\n this.onDragMove = onDragMove;\n this.onDragEnd = onDragEnd;\n this.onClick = onClick;\n this.transitionMS = transitionMS;\n this.slideWidth = slideWidth;\n\n this.basePosition = 0;\n this.oldTransitionStyle = null;\n this.defaultStyle = {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n transition: \"transform \" + transitionMS + \"ms ease-out\"\n };\n\n this.element = createElement({\n style: this.defaultStyle,\n children: children\n });\n\n this.frameElement = createElement({\n classList: [\"center-frame\"],\n style: Object.assign({\n width: slideWidth + \"px\",\n height: slideWidth + \"px\"\n }, this.defaultStyle, this.activeSlideStyle)\n });\n\n this.axis = this.horizontalCarousel || this.forConveyor ? \"X\" : \"Y\";\n\n this.setBounds({ min: min, max: max });\n\n this.resetPosition();\n\n var dragStartEvents = {\n \"mousedown touchstart\": function mousedownTouchstart(e) {\n return _this._onStart(e);\n }\n };\n this._elementEvents = Object.assign({}, dragAnywhere ? {} : dragStartEvents, {\n click: function click(e) {\n return _this._onClick(e);\n }\n });\n this._windowEvents = Object.assign({}, dragAnywhere ? dragStartEvents : {}, {\n \"mousemove touchmove\": function mousemoveTouchmove(e) {\n return _this._onMove(e);\n },\n \"mouseup touchend mouseleave touchleave\": function mouseupTouchendMouseleaveTouchleave(e) {\n return _this._onEnd(e);\n }\n });\n\n on(this.element, this._elementEvents);\n on(window, this._windowEvents);\n }\n\n _createClass(Dragger1D, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"getFrameElement\",\n value: function getFrameElement() {\n return this.frameElement;\n }\n }, {\n key: \"resetPosition\",\n value: function resetPosition(index) {\n this._resetState();\n this._setElementPosition(this.basePosition, index);\n }\n }, {\n key: \"setBasePosition\",\n value: function setBasePosition(newBasePosition) {\n this.basePosition = newBasePosition;\n }\n }, {\n key: \"setBaseFramePosition\",\n value: function setBaseFramePosition(position) {\n var baseFramePositionUnuset = !this.baseFramePosition && position !== 0;\n if (baseFramePositionUnuset) {\n this.baseFramePosition = this.framePosition;\n }\n }\n }, {\n key: \"setBounds\",\n value: function setBounds(_ref2) {\n var _ref2$min = _ref2.min,\n min = _ref2$min === undefined ? -Infinity : _ref2$min,\n _ref2$max = _ref2.max,\n max = _ref2$max === undefined ? Infinity : _ref2$max;\n\n this.min = min;\n this.max = max;\n }\n }, {\n key: \"nudge\",\n value: function nudge(_ref3) {\n var _this2 = this;\n\n var _ref3$offset = _ref3.offset,\n offset = _ref3$offset === undefined ? 0 : _ref3$offset,\n _ref3$durationMS = _ref3.durationMS,\n durationMS = _ref3$durationMS === undefined ? 1000 : _ref3$durationMS,\n _ref3$conveyorBorderT = _ref3.conveyorBorderTransition,\n conveyorBorderTransition = _ref3$conveyorBorderT === undefined ? false : _ref3$conveyorBorderT;\n\n this.elementToNudge = conveyorBorderTransition ? this.frameElement : this.element;\n\n var newPosition = conveyorBorderTransition ? -this.framePosition - offset : this.basePosition - offset;\n\n var oldTransition = this.elementToNudge.style.transition;\n\n // NOTE(cory) Divide `durationMS` by 2 because the transition should play out twice.\n this.elementToNudge.style.transition = \"transform \" + durationMS / 2 + \"ms ease-out\";\n\n this._setElementPosition(newPosition, false);\n return transitionEndPromise(this.elementToNudge, { matchTarget: true }).then(function () {\n var oldPosition = conveyorBorderTransition ? -_this2.baseFramePosition : _this2.basePosition;\n _this2._setElementPosition(oldPosition, false);\n return transitionEndPromise(_this2.elementToNudge, { matchTarget: true });\n }).finally(function () {\n _this2.elementToNudge.style.transition = oldTransition;\n });\n }\n }, {\n key: \"clean\",\n value: function clean() {\n off(this.element, this._elementEvents);\n off(window, this._windowEvents);\n }\n }, {\n key: \"_resetState\",\n value: function _resetState() {\n this.isDragging = false;\n if (!this.carouselSnapsToScreen && this.dragDelta) {\n this.basePosition = clamp(this.dragDelta, this.min, this.max);\n } else {\n this.dragStartPosition = null;\n this.dragDelta = null;\n }\n this.baseFramePosition = this.setBaseFramePosition(this.basePosition);\n this.hasDragMoved = false;\n }\n }, {\n key: \"_setFramePosition\",\n value: function _setFramePosition(position, index) {\n var moveFramePosition = this.forConveyor && !this.conveyorImagesTransition;\n if (moveFramePosition) {\n // Fix frame position being offset when < 5 products and <= 2 products\n var notNudgingFrame = index !== false;\n if (notNudgingFrame) {\n if (this.itemCount < 5) {\n index++;\n }\n if (this.itemCount <= 2) {\n index++;\n }\n }\n\n this.framePosition = notNudgingFrame ? this.slideWidth / 2 + this.slideWidth * index : -position;\n\n this.frameElement.style.transform = \"translate\" + this.axis + \"(\" + this.framePosition + \"px)\";\n this.setBaseFramePosition(position);\n }\n }\n }, {\n key: \"_setElementPosition\",\n value: function _setElementPosition(position, index) {\n this._setFramePosition(position, index);\n\n var movingImagePosition = this.conveyorImagesTransition || !this.forConveyor || !this.baseSlidePosition;\n if (movingImagePosition) {\n this.baseSlidePosition = position !== 0 ? -position : this.baseSlidePosition;\n\n this.element.style.transform = \"translate\" + this.axis + \"(\" + -position + \"px)\";\n }\n }\n }, {\n key: \"_onStart\",\n value: function _onStart(e) {\n if (this.isDragging || !this.isEnabled) return;\n\n // NOTE(cory) Stopping this propagation allows nested dragger targets. This is necessary when\n // any dragger uses `dragAnywhere` while another dragger exists.\n e.stopPropagation();\n\n var pointerEvent = e.touches != null ? e.touches[0] : e;\n\n this.isDragging = true;\n this.dragStartPosition = this.horizontalCarousel ? pointerEvent.clientX : pointerEvent.clientY;\n this.dragDelta = 0;\n this.hasDragMoved = false;\n\n if (this.oldTransitionStyle == null) {\n this.oldTransitionStyle = this.element.style.transition;\n this.element.style.transition = \"none\";\n }\n\n this.onDragStart(this._getState());\n }\n }, {\n key: \"_onMove\",\n value: function _onMove(e) {\n if (!this.isDragging) return;\n\n this.element.style.pointerEvents = \"none\";\n\n var pointerEvent = e.touches != null ? e.touches[0] : e;\n this.dragMoved = this.horizontalCarousel ? pointerEvent.clientX : pointerEvent.clientY;\n this.dragDelta = this.dragStartPosition - this.dragMoved;\n if (!this.carouselSnapsToScreen && this.basePosition && !this.forConveyor) {\n this.dragDelta = this.basePosition + this.dragDelta;\n }\n this.hasDragMoved = true;\n\n var state = this._getState();\n\n this._setElementPosition(state.currentDragPosition);\n\n this.onDragMove(state);\n }\n }, {\n key: \"_onEnd\",\n value: function _onEnd() {\n if (!this.isDragging) return;\n\n this.element.style.pointerEvents = null;\n\n var state = this._getState();\n\n this._resetState();\n\n if (this.oldTransitionStyle != null) {\n this.element.style.transition = this.oldTransitionStyle;\n this.oldTransitionStyle = null;\n }\n\n this.onDragEnd(state);\n }\n }, {\n key: \"_onClick\",\n value: function _onClick(e) {\n var state = this._getState();\n if (state.hasDragMoved) return;\n\n this.onClick(e, state);\n }\n }, {\n key: \"_getState\",\n value: function _getState() {\n var dragPosition = this.carouselSnapsToScreen ? this.basePosition + this.dragDelta : this.dragDelta;\n return {\n currentDragPosition: clamp(dragPosition, this.min, this.max),\n dragStartPosition: this.dragStartPosition,\n dragDelta: this.dragDelta,\n hasDragMoved: this.hasDragMoved\n };\n }\n }]);\n\n return Dragger1D;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Dragger1D);\n\n/***/ }),\n\n/***/ 145:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(146);\nmodule.exports = __webpack_require__(147);\n\n\n/***/ }),\n\n/***/ 146:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_js_lib_currency__ = __webpack_require__(31);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_js_lib_dot_indicator__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__ = __webpack_require__(32);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_js_lib_interaction_cue__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__ = __webpack_require__(19);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_js_lib_scheduler__ = __webpack_require__(5);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__ = __webpack_require__(15);\nvar _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if (\"value\" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n\n\n\n\n\n\n\n\nvar _window$Liftoff = window.Liftoff,\n Component = _window$Liftoff.Component,\n _window$Liftoff$Utils = _window$Liftoff.Utils,\n loadImage = _window$Liftoff$Utils.loadImage,\n range = _window$Liftoff$Utils.range,\n _window$Liftoff$DOMUt = _window$Liftoff.DOMUtils,\n appendChildren = _window$Liftoff$DOMUt.appendChildren,\n createElement = _window$Liftoff$DOMUt.createElement,\n empty = _window$Liftoff$DOMUt.empty,\n fragmentFromString = _window$Liftoff$DOMUt.fragmentFromString;\n\n\nvar DEFAULT_VERTICAL_SPACING = \"15px\";\nvar INTERACTION_CUE_TYPE_NONE = \"none\";\n\nvar currencyAnimationDurationMS = 1000;\nvar isDigit = function isDigit(char) {\n return char >= \"0\" && char <= \"9\";\n};\nvar getNumericalPrice = function getNumericalPrice(price) {\n // NOTE(Casey): We assume that normal and special prices are formatted similarly (i.e. same number of\n // fractional parts). With this assumption, we can parse prices for discount calculations just by removing\n // non-digits.\n return Number.parseFloat([].concat(_toConsumableArray(price)).filter(function (d) {\n return isDigit(d);\n }).join(\"\"));\n};\nvar getDiscount = function getDiscount(product) {\n var normalPrice = product.normalPrice,\n specialPrice = product.specialPrice;\n\n if (specialPrice == null) {\n return null;\n }\n\n var normal = getNumericalPrice(normalPrice);\n var special = getNumericalPrice(specialPrice);\n\n var discount = special / normal - 1;\n if (discount === 0) {\n return null;\n }\n\n return discount;\n};\n\nvar ProductDiscount = function () {\n function ProductDiscount(_ref) {\n var product = _ref.product,\n discountTextStyle = _ref.discountTextStyle;\n\n _classCallCheck(this, ProductDiscount);\n\n this.totalDiscount = getDiscount(product);\n this.startTime = Date.now();\n\n this.element = this.totalDiscount == null ? null : createElement({\n tagName: \"span\",\n style: discountTextStyle,\n children: [\"0%\"]\n });\n\n this.tween = new __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */]({\n startValue: 0,\n endValue: this.totalDiscount,\n durationMS: currencyAnimationDurationMS,\n easingFn: __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */].Easing.EaseOutQuad\n });\n }\n\n _createClass(ProductDiscount, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"reset\",\n value: function reset() {\n var _this = this;\n\n if (this.totalDiscount == null) return;\n\n this.tween.start({\n onUpdate: function onUpdate(currentDiscount) {\n _this.element.textContent = Math.floor(currentDiscount * 100) + \"%\";\n }\n });\n }\n }]);\n\n return ProductDiscount;\n}();\n\nvar ProductPrice = function () {\n function ProductPrice(_ref2) {\n var product = _ref2.product,\n mainPriceStyle = _ref2.mainPriceStyle,\n overriddenPriceStyle = _ref2.overriddenPriceStyle,\n shouldAnimatePrice = _ref2.shouldAnimatePrice;\n\n _classCallCheck(this, ProductPrice);\n\n var specialPrice = product.specialPrice,\n normalPrice = product.normalPrice;\n\n var mainPrice = specialPrice || normalPrice;\n var overriddenPrice = mainPrice !== normalPrice ? normalPrice : null;\n\n if (mainPrice == null) {\n this.element = null;\n return null;\n }\n\n var priceFormatter = shouldAnimatePrice ? Object(__WEBPACK_IMPORTED_MODULE_0__src_js_lib_currency__[\"a\" /* makeCurrencyFormatter */])(mainPrice) : null;\n this.shouldAnimatePrice = shouldAnimatePrice && mainPrice != null && priceFormatter != null;\n\n var mainPriceEl = createElement({\n tagName: \"span\",\n style: mainPriceStyle,\n children: [this.shouldAnimatePrice ? 0 : mainPrice]\n });\n\n this.element = createElement({\n tagName: \"span\",\n children: [overriddenPrice && {\n tagName: \"span\",\n style: overriddenPriceStyle,\n children: [overriddenPrice]\n }, \" \", mainPriceEl]\n });\n\n this.initAnimation(mainPrice, mainPriceEl, priceFormatter);\n }\n\n _createClass(ProductPrice, [{\n key: \"initAnimation\",\n value: function initAnimation(mainPrice, mainPriceEl, priceFormatter) {\n if (!this.shouldAnimatePrice) return;\n\n var numericalMainPrice = getNumericalPrice(mainPrice);\n this.tween = new __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */]({\n startValue: 0,\n endValue: numericalMainPrice,\n durationMS: currencyAnimationDurationMS,\n easingFn: __WEBPACK_IMPORTED_MODULE_6__src_js_lib_tween__[\"a\" /* default */].Easing.EaseOutQuad\n });\n\n this.updatePrice = function (currentTweenValue) {\n var currentTweenDigits = Math.round(currentTweenValue);\n mainPriceEl.textContent = priceFormatter(currentTweenDigits);\n };\n }\n }, {\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"reset\",\n value: function reset() {\n if (!this.shouldAnimatePrice) return;\n\n this.tween.start({\n onUpdate: this.updatePrice\n });\n }\n }]);\n\n return ProductPrice;\n}();\n\nvar renderProductInfo = function renderProductInfo(infoElement, _ref3) {\n var containerClassList = _ref3.containerClassList,\n containerStyle = _ref3.containerStyle,\n prefixHTML = _ref3.prefixHTML,\n prefixStyle = _ref3.prefixStyle,\n suffixHTML = _ref3.suffixHTML,\n suffixStyle = _ref3.suffixStyle;\n\n return createElement({\n classList: containerClassList,\n style: containerStyle,\n children: [!!prefixHTML && {\n tagName: \"span\",\n style: prefixStyle,\n children: [fragmentFromString(prefixHTML)]\n }, infoElement, \" \", !!suffixHTML && {\n tagName: \"span\",\n style: suffixStyle,\n children: [fragmentFromString(suffixHTML)]\n }]\n });\n};\n\nvar renderProductImage = function renderProductImage(product, productImageSizing) {\n return product.imageURL && {\n classList: [\"product-image\"],\n style: {\n backgroundImage: \"url(\" + product.imageURL + \")\",\n backgroundSize: productImageSizing\n }\n };\n};\n\nvar ProductCarouselSlide = function () {\n function ProductCarouselSlide(_ref4) {\n var product = _ref4.product,\n index = _ref4.index,\n width = _ref4.width,\n _ref4$productSlideCon = _ref4.productSlideConfig,\n productImageStyle = _ref4$productSlideCon.productImageStyle,\n productContainerStyle = _ref4$productSlideCon.productContainerStyle,\n productImageSizing = _ref4$productSlideCon.productImageSizing,\n showPrices = _ref4$productSlideCon.showPrices,\n mainPriceStyle = _ref4$productSlideCon.mainPriceStyle,\n overriddenPriceStyle = _ref4$productSlideCon.overriddenPriceStyle,\n priceInfoConfig = _ref4$productSlideCon.priceInfoConfig,\n showTitle = _ref4$productSlideCon.showTitle,\n titleTextStyle = _ref4$productSlideCon.titleTextStyle,\n titleInfoConfig = _ref4$productSlideCon.titleInfoConfig,\n showDescription = _ref4$productSlideCon.showDescription,\n descriptionTextStyle = _ref4$productSlideCon.descriptionTextStyle,\n descriptionInfoConfig = _ref4$productSlideCon.descriptionInfoConfig,\n showDiscount = _ref4$productSlideCon.showDiscount,\n discountTextStyle = _ref4$productSlideCon.discountTextStyle,\n discountInfoConfig = _ref4$productSlideCon.discountInfoConfig,\n shouldAnimatePrice = _ref4$productSlideCon.shouldAnimatePrice,\n interactionCueHand = _ref4.interactionCueHand;\n\n _classCallCheck(this, ProductCarouselSlide);\n\n this.discount = new ProductDiscount({ product: product, discountTextStyle: discountTextStyle });\n this.price = new ProductPrice({\n product: product,\n overriddenPriceStyle: overriddenPriceStyle,\n mainPriceStyle: mainPriceStyle,\n shouldAnimatePrice: shouldAnimatePrice\n });\n\n var title = product.title,\n description = product.description;\n\n this.interactionCueHand = interactionCueHand;\n\n // NOTE(Casey): 'showDiscount' was added after some creatives were\n // already using this component, so add a default here to ensure\n // consistent behavior for creatives that were missing this parameter.\n var showDiscountWithDefault = showDiscount == null ? this.discount.getElement() != null : showDiscount;\n\n this.productElement = createElement({\n style: productContainerStyle,\n children: [{\n style: productImageStyle,\n children: [renderProductImage(product, productImageSizing)]\n }, showDiscountWithDefault && renderProductInfo(this.discount.getElement(), discountInfoConfig), showPrices && renderProductInfo(this.price.getElement(), Object.assign(priceInfoConfig, {\n containerClassList: [\"product-prices\"]\n })), showTitle && renderProductInfo(createElement({\n tagName: \"span\",\n children: [title],\n style: titleTextStyle\n }), titleInfoConfig), showDescription && renderProductInfo(createElement({\n tagName: \"span\",\n children: [description],\n style: descriptionTextStyle\n }), descriptionInfoConfig)]\n });\n\n this.element = createElement({\n classList: [\"product-slide\"],\n style: { transform: \"translateX(\" + index * width + \"px)\" },\n children: [this.productElement]\n });\n }\n\n _createClass(ProductCarouselSlide, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"activate\",\n value: function activate() {\n this.discount.reset();\n this.price.reset();\n if (this.interactionCueHand != null) {\n appendChildren(this.productElement, [this.interactionCueHand.getElement()]);\n }\n }\n }]);\n\n return ProductCarouselSlide;\n}();\n\nvar ProductCarousel = function () {\n function ProductCarousel(_ref5) {\n var products = _ref5.products,\n width = _ref5.width,\n onDragStart = _ref5.onDragStart,\n onDragMove = _ref5.onDragMove,\n onProductClick = _ref5.onProductClick,\n dragAnywhere = _ref5.dragAnywhere,\n onProductSelection = _ref5.onProductSelection,\n interactionCueType = _ref5.interactionCueType,\n interactionCueInterval = _ref5.interactionCueInterval,\n _ref5$interactionCueH = _ref5.interactionCueHand,\n interactionCueHand = _ref5$interactionCueH === undefined ? null : _ref5$interactionCueH,\n flickInteractionCueHand = _ref5.flickInteractionCueHand,\n attachHandToSlides = _ref5.attachHandToSlides,\n productSlideConfig = _ref5.productSlideConfig;\n\n _classCallCheck(this, ProductCarousel);\n\n this.products = products;\n this.width = width;\n this.currentIndex = null;\n this.interactionCueHand = interactionCueHand;\n\n this.productSlides = this.products.map(function (product, index) {\n return new ProductCarouselSlide({\n product: product,\n index: index,\n width: width,\n productSlideConfig: productSlideConfig,\n interactionCueHand: attachHandToSlides ? interactionCueHand : null\n });\n });\n\n this.dragSelector = new __WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__[\"a\" /* default */]({\n itemCount: products.length,\n width: width,\n slidesPerView: 1,\n onDragStart: onDragStart,\n onDragMove: onDragMove,\n onClick: onProductClick,\n dragAnywhere: dragAnywhere,\n onSelection: onProductSelection,\n children: this.productSlides.map(function (productSlide) {\n return productSlide.getElement();\n })\n });\n\n this.element = createElement({\n classList: [\"product-carousel\"],\n children: [this.dragSelector.getElement()]\n });\n\n this.nudgeInteractionCue = new __WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__[\"a\" /* default */]({\n nudgeType: interactionCueType,\n intervalMS: interactionCueInterval,\n interactionCueHand: interactionCueHand,\n flickInteractionCueHand: flickInteractionCueHand,\n nudger: this.dragSelector\n });\n }\n\n _createClass(ProductCarousel, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"startInteractionCue\",\n value: function startInteractionCue() {\n this.nudgeInteractionCue.start();\n }\n }, {\n key: \"stopInteractionCue\",\n value: function stopInteractionCue() {\n this.nudgeInteractionCue.stop();\n }\n }, {\n key: \"setIndex\",\n value: function setIndex(index) {\n this.currentIndex = index;\n this.dragSelector.setIndex(index);\n this.productSlides[index].activate();\n }\n }]);\n\n return ProductCarousel;\n}();\n\nvar slidesPerConveyorView = 6;\n\nvar ProductConveyorSlide = function () {\n function ProductConveyorSlide(_ref6) {\n var index = _ref6.index,\n width = _ref6.width,\n product = _ref6.product,\n productImageSizing = _ref6.productImageSizing,\n onProductSelection = _ref6.onProductSelection;\n\n _classCallCheck(this, ProductConveyorSlide);\n\n this.element = createElement({\n classList: [\"product-slide\"],\n style: {\n width: width + \"px\",\n transform: \"translateX(\" + index * width + \"px)\",\n // Images to the left are in the front so the hand (positioned to the right of the image) is not\n // under the image to the right.\n zIndex: -index\n },\n children: [renderProductImage(product, productImageSizing)],\n eventHandlers: {\n click: function click() {\n onProductSelection(index);\n }\n }\n });\n }\n\n _createClass(ProductConveyorSlide, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"setInteractionCueHand\",\n value: function setInteractionCueHand(interactionCueHand) {\n if (interactionCueHand == null) return;\n appendChildren(this.element, [interactionCueHand.getElement()]);\n }\n }]);\n\n return ProductConveyorSlide;\n}();\n\nvar ProductConveyor = function () {\n function ProductConveyor(_ref7) {\n var _this2 = this;\n\n var products = _ref7.products,\n width = _ref7.width,\n onDragStart = _ref7.onDragStart,\n onDragMove = _ref7.onDragMove,\n onProductSelection = _ref7.onProductSelection,\n interactionCueType = _ref7.interactionCueType,\n interactionCueInterval = _ref7.interactionCueInterval,\n _ref7$interactionCueH = _ref7.interactionCueHand,\n interactionCueHand = _ref7$interactionCueH === undefined ? null : _ref7$interactionCueH,\n flickInteractionCueHand = _ref7.flickInteractionCueHand,\n activeSlideStyle = _ref7.activeSlideStyle,\n productImageSizing = _ref7.productImageSizing;\n\n _classCallCheck(this, ProductConveyor);\n\n this.products = products;\n this.width = width;\n this.activeSlideStyle = activeSlideStyle;\n this.currentIndex = null;\n this.interactionCueHand = interactionCueHand;\n\n this.slideWidth = width / slidesPerConveyorView;\n this.productSlides = products.map(function (product, index) {\n return new ProductConveyorSlide({\n width: _this2.slideWidth,\n index: index,\n product: product,\n productImageSizing: productImageSizing,\n onProductSelection: onProductSelection\n });\n });\n\n this.dragSelector = new __WEBPACK_IMPORTED_MODULE_2__src_js_lib_drag_selector1d__[\"a\" /* default */]({\n itemCount: products.length,\n width: width,\n slidesPerView: slidesPerConveyorView,\n onDragStart: onDragStart,\n onDragMove: onDragMove,\n onSelection: onProductSelection,\n children: this.productSlides.map(function (slide) {\n return slide.getElement();\n })\n });\n\n this.element = createElement({\n classList: [\"product-conveyor\"],\n style: { height: this.slideWidth + \"px\" },\n children: [this.dragSelector.getElement(), {\n classList: [\"center-frame\"],\n style: Object.assign({\n width: this.slideWidth + \"px\",\n height: this.slideWidth + \"px\"\n }, this.activeSlideStyle)\n }]\n });\n\n this.nudgeInteractionCue = new __WEBPACK_IMPORTED_MODULE_4__src_js_lib_nudge_interaction_cue__[\"a\" /* default */]({\n nudgeType: interactionCueType,\n intervalMS: interactionCueInterval,\n interactionCueHand: interactionCueHand,\n flickInteractionCueHand: flickInteractionCueHand,\n nudger: this.dragSelector\n });\n }\n\n _createClass(ProductConveyor, [{\n key: \"getElement\",\n value: function getElement() {\n return this.element;\n }\n }, {\n key: \"setHandForSlide\",\n value: function setHandForSlide(slideIndex) {\n // NOTE(Casey): We position the hand to the right to avoid interfering with the center frame. The hand\n // won't appear for the last image.\n var slide = this.productSlides[slideIndex + 1];\n if (slide == null) return;\n\n slide.setInteractionCueHand(this.interactionCueHand);\n }\n }, {\n key: \"startInteractionCue\",\n value: function startInteractionCue() {\n this.nudgeInteractionCue.start();\n }\n }, {\n key: \"stopInteractionCue\",\n value: function stopInteractionCue() {\n this.nudgeInteractionCue.stop();\n }\n }, {\n key: \"setIndex\",\n value: function setIndex(index) {\n this.currentIndex = index;\n this.dragSelector.setIndex(index);\n this.setHandForSlide(index);\n }\n }]);\n\n return ProductConveyor;\n}();\n\nComponent.register(\"dynamic-conveyor-carousel\", function (_Component) {\n _inherits(DynamicConveyorCarousel, _Component);\n\n function DynamicConveyorCarousel(config) {\n _classCallCheck(this, DynamicConveyorCarousel);\n\n var _this3 = _possibleConstructorReturn(this, (DynamicConveyorCarousel.__proto__ || Object.getPrototypeOf(DynamicConveyorCarousel)).call(this, config));\n\n _this3.hasDragSelected = false;\n _this3.currentProductIndex = 0;\n _this3.products = _this3.config.useStaticProducts ? _this3.config.products : range(0, _this3.config.productCount).map(function () {\n return window.Madlib.getNextProduct();\n }).filter(function (rawProduct) {\n return rawProduct != null;\n }).map(function (rawProduct) {\n return {\n id: rawProduct.id,\n imageURL: rawProduct.image_url,\n normalPrice: rawProduct.display_price,\n specialPrice: rawProduct.special_display_price,\n title: rawProduct.title,\n description: rawProduct.description\n };\n });\n\n _this3.autoTransitionScheduler = new __WEBPACK_IMPORTED_MODULE_5__src_js_lib_scheduler__[\"a\" /* default */]({\n intervalMS: _this3.config.autoScrollDelayMS,\n callback: _this3._handleAutoTransition.bind(_this3)\n });\n return _this3;\n }\n\n _createClass(DynamicConveyorCarousel, [{\n key: \"load\",\n value: function load() {\n var allImageURLs = this.products.map(function (_ref8) {\n var imageURL = _ref8.imageURL;\n return imageURL;\n }).concat([this.config.customHandImage]).filter(function (url) {\n return url != null;\n });\n\n return Promise.all(allImageURLs.map(function (imageURL) {\n return loadImage(imageURL);\n }));\n }\n }, {\n key: \"layout\",\n value: function layout(parentNode) {\n var _this4 = this;\n\n _get(DynamicConveyorCarousel.prototype.__proto__ || Object.getPrototypeOf(DynamicConveyorCarousel.prototype), \"layout\", this).call(this, parentNode);\n\n empty(this.parentNode);\n\n if (this.products.length === 0) return;\n\n this.el = createElement({ classList: [\"dynamic-conveyor-carousel\"] });\n\n this.parentNode.appendChild(this.el);\n\n var boundingClientRect = this.el.getBoundingClientRect();\n var isCarouselInteractive = this.config.carouselInteractionCue != null && this.config.carouselInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n var isConveyorInteractive = this.config.conveyorInteractionCue != null && this.config.conveyorInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n\n this.interactionCueHand = this.config.showInteractionCueHand && (this.config.useAutoScroll || isCarouselInteractive || isConveyorInteractive) ? new __WEBPACK_IMPORTED_MODULE_3__src_js_lib_interaction_cue__[\"a\" /* default */](this.config.customHandImage, this.config.interactionCueHandStyle) : null;\n\n var productImageSizing = this.config.productImageSizing === \"fill\" ? \"100% 100%\" : this.config.productImageSizing;\n\n // TODO(cory) Eliminate `attachHandToSlides` if we standardize flick-with-nudge.\n var attachHandToSlides = !this.config.useAutoScroll && !this.config.flickInteractionCueHand;\n\n this.carousel = new ProductCarousel({\n products: this.products,\n width: boundingClientRect.width,\n onDragStart: function onDragStart() {\n return _this4._handleDragStart();\n },\n onDragMove: function onDragMove() {\n return _this4._stopInteractionCues();\n },\n onProductClick: function onProductClick(e, index) {\n return _this4._handleProductClick(e, index);\n },\n dragAnywhere: this.config.dragAnywhere,\n onProductSelection: function onProductSelection(index) {\n return _this4._handleProductSelection(index);\n },\n interactionCueType: this.config.carouselInteractionCue,\n interactionCueInterval: this.config.interactionCueInterval,\n interactionCueHand: isCarouselInteractive ? this.interactionCueHand : null,\n flickInteractionCueHand: this.config.flickInteractionCueHand,\n attachHandToSlides: attachHandToSlides,\n productSlideConfig: {\n productImageStyle: this.config.productImageStyle,\n productContainerStyle: this.config.productContainerStyle,\n productImageSizing: productImageSizing,\n shouldAnimatePrice: this.config.shouldAnimatePrice,\n\n // Price\n showPrices: this.config.showPrices,\n mainPriceStyle: this.config.mainPriceStyle,\n overriddenPriceStyle: this.config.overriddenPriceStyle,\n priceInfoConfig: {\n containerStyle: this.config.priceContainerStyle,\n prefixHTML: this.config.pricePrefix,\n prefixStyle: this.config.pricePrefixStyle,\n suffixHTML: this.config.priceSuffix,\n suffixStyle: this.config.priceSuffixStyle\n },\n\n // Title\n showTitle: this.config.showTitle,\n titleTextStyle: this.config.titleTextStyle,\n titleInfoConfig: {\n containerStyle: this.config.titleStyle,\n prefixHTML: this.config.titlePrefix,\n prefixStyle: this.config.titlePrefixStyle,\n suffixHTML: this.config.titleSuffix,\n suffixStyle: this.config.titleSuffixStyle\n },\n\n // Description\n showDescription: this.config.showDescription,\n descriptionTextStyle: this.config.descriptionTextStyle,\n descriptionInfoConfig: {\n containerStyle: this.config.descriptionStyle,\n prefixHTML: this.config.descriptionPrefix,\n prefixStyle: this.config.descriptionPrefixStyle,\n suffixHTML: this.config.descriptionSuffix,\n suffixStyle: this.config.descriptionSuffixStyle\n },\n\n // Discount\n showDiscount: this.config.showDiscount,\n discountTextStyle: this.config.discountTextStyle,\n discountInfoConfig: {\n containerStyle: this.config.discountStyle,\n prefixHTML: this.config.discountPrefix,\n prefixStyle: this.config.discountPrefixStyle,\n suffixHTML: this.config.discountSuffix,\n suffixStyle: this.config.discountSuffixStyle\n }\n }\n });\n\n this.conveyor = new ProductConveyor({\n productImageSizing: productImageSizing,\n products: this.products,\n width: boundingClientRect.width,\n onDragStart: function onDragStart() {\n return _this4._handleDragStart();\n },\n onDragMove: function onDragMove() {\n return _this4._stopInteractionCues();\n },\n onProductSelection: function onProductSelection(index) {\n return _this4._handleProductSelection(index);\n },\n interactionCueType: this.config.conveyorInteractionCue,\n interactionCueInterval: this.config.interactionCueInterval,\n interactionCueHand: isConveyorInteractive && !isCarouselInteractive && !this.config.useAutoScroll ? this.interactionCueHand : null,\n flickInteractionCueHand: this.config.flickInteractionCueHand,\n activeSlideStyle: this.config.activeConveyorSlideStyle\n });\n\n this.dotIndicator = new __WEBPACK_IMPORTED_MODULE_1__src_js_lib_dot_indicator__[\"a\" /* default */](this.products.length, {\n containerStyle: this.config.dotsContainerStyle,\n dotStyle: this.config.dotStyle,\n activeDotStyle: this.config.activeDotStyle\n });\n\n var spacingPx = this.config.verticalSpacing == null ? DEFAULT_VERTICAL_SPACING : this.config.verticalSpacing + \"px\";\n var makeSpacer = function makeSpacer() {\n return createElement({\n // This class name is included only to improve the interpretability of the DOM. No CSS is applied\n // to this class.\n classList: [\"liftoff-spacer\"],\n style: { height: spacingPx }\n });\n };\n\n appendChildren(this.el, [{\n classList: [\"product-carousel-container\"],\n children: [this.carousel.getElement(), !attachHandToSlides && this.interactionCueHand && this.interactionCueHand.getElement()]\n }, makeSpacer(), this.config.showConveyor && this.conveyor.getElement(), makeSpacer(), this.config.showDots && {\n classList: [\"product-dots\"],\n children: [this.dotIndicator.getElement()]\n }, this.config.showDots && makeSpacer()]);\n\n // NOTE(Casey): firstProductIndex is a required parameter, but it was added in later iterations on this\n // component. The null-check is for backwards compatibility.\n var firstProductIndex = this.config.firstProductIndex === \"Auto\" || this.config.firstProductIndex == null ? Math.floor(this.products.length / 2 - 0.5) : // The parameter value is a 1-based index.\n this.config.firstProductIndex - 1;\n\n this._setProductIndex(firstProductIndex);\n }\n }, {\n key: \"resize\",\n value: function resize() {}\n }, {\n key: \"_startInteractionCues\",\n value: function _startInteractionCues() {\n this.carousel.startInteractionCue();\n this.conveyor.startInteractionCue();\n }\n }, {\n key: \"start\",\n value: function start() {\n if (this.products.length === 0) return;\n\n if (this.config.useAutoScroll) {\n this.autoTransitionScheduler.start();\n } else {\n this._startInteractionCues();\n }\n }\n }, {\n key: \"_stopInteractionCues\",\n value: function _stopInteractionCues() {\n this.carousel.stopInteractionCue();\n this.conveyor.stopInteractionCue();\n }\n }, {\n key: \"_stopAutoTransitions\",\n value: function _stopAutoTransitions() {\n this.autoTransitionScheduler.stop();\n if (this.interactionCueHand != null && this.config.useAutoScroll) {\n this.interactionCueHand.hide();\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.products.length === 0) return;\n\n this._stopAutoTransitions();\n this._stopInteractionCues();\n }\n }, {\n key: \"restart\",\n value: function restart() {}\n }, {\n key: \"_transitionProductView\",\n value: function _transitionProductView(indexDelta) {\n var newIndex = (this.currentProductIndex + indexDelta + this.products.length) % this.products.length;\n\n this._setProductIndex(newIndex);\n }\n }, {\n key: \"_handleAutoTransition\",\n value: function _handleAutoTransition() {\n var _this5 = this;\n\n if (!this.config.useAutoScroll) return;\n\n if (this.interactionCueHand != null && this.currentProductIndex !== this.products.length - 1) {\n this.interactionCueHand.flick({\n onFlickReady: function onFlickReady() {\n return _this5._transitionProductView(1);\n },\n flickDuration: Math.min(this.config.autoScrollDelayMS / 2, 900)\n });\n } else {\n this._transitionProductView(1);\n }\n }\n }, {\n key: \"_updateGlobalProductIdParam\",\n value: function _updateGlobalProductIdParam(productIndex) {\n var product = this.products[productIndex];\n if (product == null) return;\n\n Liftoff.mergeClickParams({ pid: product.id });\n }\n }, {\n key: \"_handleDragStart\",\n value: function _handleDragStart() {\n this.recordInteraction();\n this._stopAutoTransitions();\n\n if (!this.hasDragSelected) {\n this._startInteractionCues();\n }\n }\n }, {\n key: \"_handleProductClick\",\n value: function _handleProductClick(e, index) {\n if (!(0 <= index && index < this.products.length)) return;\n\n var product = this.products[index];\n window.Madlib.handleNavigationClick(e, { pid: product.id });\n }\n }, {\n key: \"_handleProductSelection\",\n value: function _handleProductSelection(index) {\n if (!(0 <= index && index < this.products.length)) return;\n\n if (index !== this.currentProductIndex) {\n this.hasDragSelected = true;\n this._stopInteractionCues();\n } else if (!this.hasDragSelected) {\n this._startInteractionCues();\n }\n\n this._setProductIndex(index);\n }\n }, {\n key: \"_setProductIndex\",\n value: function _setProductIndex(index) {\n this.currentProductIndex = index;\n\n this.carousel.setIndex(index);\n this.conveyor.setIndex(index);\n this.dotIndicator.setIndex(index);\n\n this._updateGlobalProductIdParam(index);\n }\n }]);\n\n return DynamicConveyorCarousel;\n}(Component));\n\n/***/ }),\n\n/***/ 147:\n/***/ (function(module, exports) {\n\n// removed by extract-text-webpack-plugin\n\n/***/ }),\n\n/***/ 15:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Tween = function () {\n _createClass(Tween, null, [{\n key: \"Tween\",\n value: function Tween(start, end, ease, f) {\n f = Math.min(1, Math.max(0, f));\n switch (typeof start === \"undefined\" ? \"undefined\" : _typeof(start)) {\n case \"number\":\n return start + (end - start) * ease(f);\n case \"object\":\n var value = {};\n for (var k in start) {\n value[k] = start[k] + (end[k] - start[k]) * ease(f);\n }\n return value;\n }\n }\n }]);\n\n function Tween(config) {\n var _this = this;\n\n _classCallCheck(this, Tween);\n\n [\"startValue\", \"endValue\", \"durationMS\", \"easingFn\"].forEach(function (param) {\n return _this[param] = config[param];\n });\n }\n\n _createClass(Tween, [{\n key: \"from\",\n value: function from(startValue) {\n this.startValue = startValue;\n return this;\n }\n }, {\n key: \"to\",\n value: function to(endValue) {\n this.endValue = endValue;\n return this;\n }\n }, {\n key: \"in\",\n value: function _in(durationMS) {\n this.durationMS = durationMS;\n return this;\n }\n }, {\n key: \"with\",\n value: function _with(easingFn) {\n this.easingFn = easingFn;\n return this;\n }\n\n // Cannot use `performance.now()` here due to lack of browser support.\n\n }, {\n key: \"start\",\n value: function start() {\n var _this2 = this;\n\n var callbackMap = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.startTS = Date.now();\n this.stopped = false;\n var update = function update() {\n if (_this2.stopped) return;\n var currentValue = _this2.valueNow();\n if (callbackMap.onUpdate) {\n callbackMap.onUpdate(currentValue);\n }\n if (Date.now() - _this2.startTS <= _this2.durationMS) {\n requestAnimationFrame(update);\n } else if (callbackMap.onComplete) {\n callbackMap.onComplete(currentValue);\n }\n };\n requestAnimationFrame(update);\n return this;\n }\n }, {\n key: \"stop\",\n value: function stop() {\n this.stopped = true;\n return this;\n }\n }, {\n key: \"valueNow\",\n value: function valueNow() {\n return Tween.Tween(this.startValue, this.endValue, this.easingFn, (Date.now() - this.startTS) / this.durationMS);\n }\n }, {\n key: \"valueAfterMS\",\n value: function valueAfterMS(elapsed) {\n return Tween.Tween(this.startValue, this.endValue, this.easingFn, elapsed / this.durationMS);\n }\n }, {\n key: \"valueAfterFraction\",\n value: function valueAfterFraction(f) {\n return Tween.Tween(this.startValue, this.endValue, this.easingFn, f);\n }\n }]);\n\n return Tween;\n}();\n\nTween.Easing = {\n Linear: function Linear(f) {\n return f;\n },\n EaseInSine: function EaseInSine(f) {\n return 1 - Math.cos(f * Math.PI / 2);\n },\n EaseOutSine: function EaseOutSine(f) {\n return Math.sin(f * Math.PI / 2);\n },\n EaseInOutSine: function EaseInOutSine(f) {\n return (1 - Math.cos(f * Math.PI)) / 2;\n },\n EaseInQuad: function EaseInQuad(f) {\n return Math.pow(f, 2);\n },\n EaseOutQuad: function EaseOutQuad(f) {\n return f * (2 - f);\n },\n EaseInOutQuad: function EaseInOutQuad(f) {\n f *= 2;\n if (f < 1) {\n return Math.pow(f, 2) / 2;\n } else {\n f -= 1;\n return (1 - f * (f - 2)) / 2;\n }\n },\n EaseInCubic: function EaseInCubic(f) {\n return Math.pow(f, 3);\n },\n EaseOutCubic: function EaseOutCubic(f) {\n return Math.pow(f - 1, 3) + 1;\n },\n EaseInOutCubic: function EaseInOutCubic(f) {\n f *= 2;\n if (f < 1) {\n return Math.pow(f, 3) / 2;\n } else {\n return (Math.pow(f - 2, 3) + 2) / 2;\n }\n }\n};\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Tween);\n\n/***/ }),\n\n/***/ 19:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scheduler__ = __webpack_require__(5);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar nudgeTypeToPx = {\n \"nudge-up\": 20,\n \"nudge-down\": -20,\n \"nudge-left\": -20,\n \"nudge-right\": 20\n};\nvar getNudgeOffsetPx = function getNudgeOffsetPx(nudgeType) {\n return nudgeTypeToPx[nudgeType] || 0;\n};\n\nvar NudgeInteractionCue = function () {\n function NudgeInteractionCue(_ref) {\n var nudgeType = _ref.nudgeType,\n intervalMS = _ref.intervalMS,\n _ref$interactionCueHa = _ref.interactionCueHand,\n interactionCueHand = _ref$interactionCueHa === undefined ? null : _ref$interactionCueHa,\n flickInteractionCueHand = _ref.flickInteractionCueHand,\n nudger = _ref.nudger,\n _ref$horizontalCarous = _ref.horizontalCarousel,\n horizontalCarousel = _ref$horizontalCarous === undefined ? true : _ref$horizontalCarous,\n _ref$conveyorBorderTr = _ref.conveyorBorderTransition,\n conveyorBorderTransition = _ref$conveyorBorderTr === undefined ? false : _ref$conveyorBorderTr;\n\n _classCallCheck(this, NudgeInteractionCue);\n\n this.interactionCueHand = interactionCueHand;\n\n var offset = getNudgeOffsetPx(nudgeType);\n\n this.scheduler = offset !== 0 ? new __WEBPACK_IMPORTED_MODULE_0__scheduler__[\"a\" /* default */]({\n intervalMS: intervalMS,\n callback: function callback() {\n var flickDuration = Math.min(intervalMS / 2, 900);\n if (interactionCueHand != null && flickInteractionCueHand) {\n interactionCueHand.flick({\n onFlickReady: function onFlickReady() {\n // NOTE(cory) We choose not to wait on the nudge promise so the animations play in parallel.\n nudger.nudge({\n offset: offset,\n durationMS: intervalMS / 2,\n conveyorBorderTransition: conveyorBorderTransition\n });\n },\n flickDistance: offset,\n flickRotation: 10,\n flickDuration: flickDuration,\n xOrY: horizontalCarousel ? \"X\" : \"Y\"\n });\n } else {\n // NOTE(cory) Wait for this timeout to sync nudges between carousel and conveyor.\n // Unfortunately, this is coupled to the implementation of flick, and the amount of\n // time it takes to call its `onFlickReady` argument.\n new Promise(function (resolve) {\n setTimeout(resolve, flickDuration / 2);\n }).then(function () {\n nudger.nudge({\n offset: offset,\n durationMS: intervalMS / 2,\n conveyorBorderTransition: conveyorBorderTransition\n });\n });\n }\n }\n }) : null;\n }\n\n _createClass(NudgeInteractionCue, [{\n key: \"start\",\n value: function start() {\n if (this.scheduler != null) {\n this.scheduler.start();\n }\n if (this.interactionCueHand != null) {\n this.interactionCueHand.show();\n }\n }\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.scheduler != null) {\n this.scheduler.stop();\n }\n if (this.interactionCueHand != null) {\n this.interactionCueHand.hide();\n }\n }\n }]);\n\n return NudgeInteractionCue;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (NudgeInteractionCue);\n\n/***/ }),\n\n/***/ 31:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return makeCurrencyFormatter; });\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar isDigit = function isDigit(char) {\n return char >= \"0\" && char <= \"9\";\n};\n\n/**\n * Given an \"example\" currency string, returns a function that takes an integer\n * argument and returns the integer formatted in the same way as the example.\n * E.g.,\n *\n * const formatter = makeCurrencyFormatter(\"$1,234.56\");\n * formatter(9876543210) // => $98,765,432.10\n * formatter(0) // => $0.00\n * formatter(321) // => $3.21\n *\n * Assumes:\n * 1) There are either 0 or 2 decimal places.\n * 2) Every third digit may be separated by a consistent separator.\n * 3) The only characters between the first digit and the last digit are\n * either a digit, the decimal separator, or the group separator.\n * 4) Any characters before the first digit or after the last digit should\n * appear in any properly formatted string.\n *\n * Returns 'null' if the example string cannot be parsed according to the above\n * assumptions.\n */\n\n// eslint-disable-next-line\nvar makeCurrencyFormatter = function makeCurrencyFormatter(baseStr) {\n var numericChars = [].concat(_toConsumableArray(baseStr));\n var prefixStr = \"\";\n while (numericChars.length !== 0 && !isDigit(numericChars[0])) {\n prefixStr = \"\" + prefixStr + numericChars.shift();\n }\n\n var suffixStr = \"\";\n while (numericChars.length !== 0 && !isDigit(numericChars[numericChars.length - 1])) {\n suffixStr = \"\" + numericChars.pop() + suffixStr;\n }\n\n var decimalSeparator = numericChars[numericChars.length - 3];\n if (isDigit(decimalSeparator)) {\n decimalSeparator = null;\n }\n\n var groupSeparatorIndex = decimalSeparator == null ? numericChars.length - 4 : numericChars.length - 7;\n\n var groupSeparator = numericChars[groupSeparatorIndex];\n if (isDigit(groupSeparator)) {\n groupSeparator = null;\n }\n\n if (numericChars.length === 0) {\n return null;\n }\n\n // Check that the character at each position is of the expected class.\n var decimalPosition = decimalSeparator == null ? numericChars.length : numericChars.length - 3;\n\n var shouldBeGroupSeparator = function shouldBeGroupSeparator(charIndex) {\n var charsFromDecimal = decimalPosition - charIndex;\n return groupSeparator != null && charIndex !== 0 && charsFromDecimal > 0 && charsFromDecimal % 4 === 0;\n };\n\n var shouldBeDecimalSeparator = function shouldBeDecimalSeparator(charIndex) {\n return decimalSeparator != null && charIndex === numericChars.length - 3;\n };\n\n for (var i = 0; i < numericChars.length; i++) {\n var char = numericChars[i];\n var charShouldBeGroupSeparator = shouldBeGroupSeparator(i);\n var charShouldBeDecimalSeparator = shouldBeDecimalSeparator(i);\n if (charShouldBeGroupSeparator && char !== groupSeparator || charShouldBeDecimalSeparator && char !== decimalSeparator || !charShouldBeGroupSeparator && !charShouldBeDecimalSeparator && !isDigit(char)) {\n return null;\n }\n }\n\n return function (intToFormat) {\n var strToFormat = String(intToFormat);\n if (decimalSeparator != null && strToFormat.length < 3) {\n var zerosNeeded = 3 - strToFormat.length;\n var zeroPadding = \"0\".repeat(zerosNeeded);\n strToFormat = \"\" + zeroPadding + strToFormat;\n }\n\n var formattedDigits = [].concat(_toConsumableArray(strToFormat)).reverse().reduce(function (reversedFormatted, digitChar, digitIndex) {\n var digitsBeforeDecimalCount = decimalSeparator == null ? digitIndex : digitIndex - 2;\n\n if (digitIndex === 2 && decimalSeparator != null) {\n reversedFormatted.push(decimalSeparator);\n } else if (digitsBeforeDecimalCount > 0 && digitsBeforeDecimalCount % 3 === 0 & groupSeparator != null) {\n reversedFormatted.push(groupSeparator);\n }\n\n reversedFormatted.push(digitChar);\n return reversedFormatted;\n }, []).reverse().join(\"\");\n\n return \"\" + prefixStr + formattedDigits + suffixStr;\n };\n};\n\n/***/ }),\n\n/***/ 32:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__dragger1d__ = __webpack_require__(14);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar _Liftoff = Liftoff,\n clamp = _Liftoff.Utils.clamp;\n\nvar DragSelector1D = function () {\n function DragSelector1D(_ref) {\n var _this = this;\n\n var itemCount = _ref.itemCount,\n width = _ref.width,\n height = _ref.height,\n slidesPerView = _ref.slidesPerView,\n onDragStart = _ref.onDragStart,\n onDragMove = _ref.onDragMove,\n _ref$onClick = _ref.onClick,\n _onClick = _ref$onClick === undefined ? function () {} : _ref$onClick,\n _ref$dragAnywhere = _ref.dragAnywhere,\n dragAnywhere = _ref$dragAnywhere === undefined ? false : _ref$dragAnywhere,\n _ref$onSelection = _ref.onSelection,\n onSelection = _ref$onSelection === undefined ? function () {} : _ref$onSelection,\n _ref$transitionMS = _ref.transitionMS,\n transitionMS = _ref$transitionMS === undefined ? 500 : _ref$transitionMS,\n children = _ref.children,\n _ref$horizontalCarous = _ref.horizontalCarousel,\n horizontalCarousel = _ref$horizontalCarous === undefined ? true : _ref$horizontalCarous,\n _ref$carouselSnapsToS = _ref.carouselSnapsToScreen,\n carouselSnapsToScreen = _ref$carouselSnapsToS === undefined ? true : _ref$carouselSnapsToS,\n conveyorImagesTransition = _ref.conveyorImagesTransition,\n forConveyor = _ref.forConveyor,\n activeSlideStyle = _ref.activeSlideStyle;\n\n _classCallCheck(this, DragSelector1D);\n\n this.itemCount = itemCount;\n this.width = width;\n this.height = height;\n\n this.slideWidth = width / slidesPerView;\n this.slideHeight = height / slidesPerView;\n\n this.widthOrHeight = horizontalCarousel || forConveyor ? this.width : this.height;\n this.slideWidthOrHeight = horizontalCarousel || forConveyor ? this.slideWidth : this.slideHeight;\n // explicitly using 'false' for backwards compatibility\n this.minDivisor = carouselSnapsToScreen === false ? 10 : 2;\n this.maxDivisor = carouselSnapsToScreen === false ? 1 : 2;\n this.dragger = new __WEBPACK_IMPORTED_MODULE_0__dragger1d__[\"a\" /* default */]({\n horizontalCarousel: horizontalCarousel,\n carouselSnapsToScreen: carouselSnapsToScreen,\n conveyorImagesTransition: conveyorImagesTransition,\n activeSlideStyle: activeSlideStyle,\n slideWidth: this.slideWidth,\n slideHeight: this.slideHeight,\n widthOrHeight: this.widthOrHeight,\n itemCount: itemCount,\n bounds: {\n min: -this.widthOrHeight / this.minDivisor,\n max: -this.widthOrHeight / this.maxDivisor + this.slideWidthOrHeight * itemCount\n },\n onDragStart: onDragStart,\n onDragMove: onDragMove,\n onDragEnd: function onDragEnd(state) {\n if (state.hasDragMoved) {\n onSelection(_this._getNearestIndex(state));\n }\n },\n onClick: function onClick(e, state) {\n _onClick(e, _this._getNearestIndex(state));\n },\n dragAnywhere: dragAnywhere,\n transitionMS: transitionMS,\n children: children,\n forConveyor: forConveyor\n });\n }\n\n _createClass(DragSelector1D, [{\n key: \"getElement\",\n value: function getElement() {\n return this.dragger.getElement();\n }\n }, {\n key: \"getFrameElement\",\n value: function getFrameElement() {\n return this.dragger.getFrameElement();\n }\n }, {\n key: \"nudge\",\n value: function nudge() {\n var _dragger;\n\n return (_dragger = this.dragger).nudge.apply(_dragger, arguments);\n }\n }, {\n key: \"setIndex\",\n value: function setIndex(index) {\n var position = -this.widthOrHeight / 2 + (index + 0.5) * this.slideWidthOrHeight;\n this.dragger.setBasePosition(position);\n this.dragger.resetPosition(index);\n }\n }, {\n key: \"_getNearestIndex\",\n value: function _getNearestIndex(dragState) {\n return clamp(Math.floor(((this.widthOrHeight - this.slideWidthOrHeight) / 2 + dragState.currentDragPosition) / this.slideWidthOrHeight + // Find the left edge of the nearest product view.\n 0.5 + // Align with the center on a scale of 0 to 1.\n 0.3 * Math.sign(dragState.dragDelta)\n // The drag direction (`dragDelta`) shows some user intent.\n // The product view in the forward direction is treated as being closer.\n ), 0, this.itemCount - 1);\n }\n }]);\n\n return DragSelector1D;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (DragSelector1D);\n\n/***/ }),\n\n/***/ 33:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__interaction_cue_hand_png__ = __webpack_require__(34);\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n\n\nvar _Liftoff = Liftoff,\n _Liftoff$DOMUtils = _Liftoff.DOMUtils,\n createElement = _Liftoff$DOMUtils.createElement,\n runTransitionSequence = _Liftoff$DOMUtils.runTransitionSequence;\n\nvar InteractionCue = function () {\n function InteractionCue(cueImageURL) {\n var style = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n _classCallCheck(this, InteractionCue);\n\n this.el = createElement({\n classList: [\"liftoff-interaction-cue-hand\", \"interaction-cue-hand-style\"],\n style: style,\n children: [createElement({\n style: {\n backgroundImage: \"url(\" + (cueImageURL || __WEBPACK_IMPORTED_MODULE_0__interaction_cue_hand_png__[\"a\" /* default */]) + \")\",\n backgroundSize: \"contain\",\n backgroundRepeat: \"no-repeat\",\n pointerEvents: \"none\",\n width: \"100%\",\n height: \"100%\"\n }\n })]\n });\n }\n\n _createClass(InteractionCue, [{\n key: \"getElement\",\n value: function getElement() {\n return this.el;\n }\n }, {\n key: \"hide\",\n value: function hide() {\n this.el.style.display = \"none\";\n }\n }, {\n key: \"show\",\n value: function show() {\n this.el.style.display = \"block\";\n }\n\n /**\n * Triggers a finger \"flick\" animation. The finger moves `flickDistance` px and rotates `flickRotation` deg\n * to the right from its base position; `onFlickReady` is then called; the finger moves back to the left,\n * overshooting its base position by `flickDistance / 2` px and `flickRotation / 2` deg; then the finger\n * moves back to its base position. The entire animation is completed in `flickDuration` ms. If\n * `flickDistance` is negative, the finger flicks in the other direction. `flickGrowth` controls\n * the maximum fractional increase in the size of hand during the \"wind-up\" phase, increasing the\n * impression of the finger being lifted from the screen.\n */\n\n }, {\n key: \"flick\",\n value: function flick(_ref) {\n var _ref$onFlickReady = _ref.onFlickReady,\n onFlickReady = _ref$onFlickReady === undefined ? function () {\n return null;\n } : _ref$onFlickReady,\n _ref$flickDistance = _ref.flickDistance,\n flickDistance = _ref$flickDistance === undefined ? -50 : _ref$flickDistance,\n _ref$flickRotation = _ref.flickRotation,\n flickRotation = _ref$flickRotation === undefined ? 20 : _ref$flickRotation,\n _ref$flickDuration = _ref.flickDuration,\n flickDuration = _ref$flickDuration === undefined ? 900 : _ref$flickDuration,\n _ref$flickGrowth = _ref.flickGrowth,\n flickGrowth = _ref$flickGrowth === undefined ? 0.1 : _ref$flickGrowth,\n _ref$xOrY = _ref.xOrY,\n xOrY = _ref$xOrY === undefined ? \"X\" : _ref$xOrY;\n\n return runTransitionSequence(this.el, [{\n transition: \"transform \" + flickDuration / 4 + \"ms\",\n transitionTimingFunction: \"ease-in\",\n transform: \"translate\" + xOrY + \"(\" + -flickDistance + \"px) \" + (\"rotate(\" + Math.sign(flickDistance) * -flickRotation + \"deg) \") + (\"scale(\" + (1 + flickGrowth) + \")\")\n }, {\n transform: null\n }, onFlickReady, {\n transform: \"translate\" + xOrY + \"(\" + flickDistance / 2 + \"px) \" + (\"rotate(\" + Math.sign(flickDistance) * flickRotation / 2 + \"deg) \") + (\"scale(\" + (1 + 0.5 * flickGrowth) + \")\"),\n transitionTimingFunction: \"ease-out\"\n }, {\n transform: null,\n transitionTimingFunction: \"linear\"\n }, {\n transition: null,\n transform: null\n }]);\n }\n }]);\n\n return InteractionCue;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (InteractionCue);\n\n/***/ }),\n\n/***/ 34:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* eslint-disable-next-line */\nvar handImageData = \"data:image/png;base64,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\";\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (handImageData);\n\n/***/ }),\n\n/***/ 5:\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n// NOTE(cory) `Scheduler` runs a function on an interval, which can be started, stopped, and restarted\n// at any time. Starting a scheduler when it's already running has no effect.\n\nvar Scheduler = function () {\n /**\n * When `leading === true`, the callback is executed on the leading edge of the interval, as well as on\n * the trailing edge.\n */\n function Scheduler(_ref) {\n var intervalMS = _ref.intervalMS,\n callback = _ref.callback,\n _ref$leading = _ref.leading,\n leading = _ref$leading === undefined ? false : _ref$leading;\n\n _classCallCheck(this, Scheduler);\n\n this.intervalMS = intervalMS;\n this.callback = callback;\n this.leading = leading;\n\n this.isActive = false;\n this.intervalID = null;\n }\n\n _createClass(Scheduler, [{\n key: \"start\",\n value: function start() {\n var _this = this;\n\n if (this.isActive) return;\n\n if (this.leading) {\n this.callback();\n }\n\n this.isActive = true;\n this.intervalID = setInterval(function () {\n if (_this.isActive) _this.callback();\n }, this.intervalMS);\n }\n }, {\n key: \"stop\",\n value: function stop() {\n this.isActive = false;\n if (this.intervalID != null) {\n clearInterval(this.intervalID);\n this.intervalID = null;\n }\n }\n }]);\n\n return Scheduler;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Scheduler);\n\n/***/ })\n\n/******/ });\n\n\n// WEBPACK FOOTER //\n// dynamic-conveyor-carousel-ac259dd6080f85168d62.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 145);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 49e3f4ed5eed6f7b6fe0","const {\n DOMUtils: { createElement, replaceStyle },\n Utils: { range },\n} = Liftoff;\n\nexport default class DotIndicator {\n constructor(\n count,\n {\n containerStyle,\n dotStyle,\n activeDotStyle,\n horizontalCarousel,\n dotsTopOrBottom = false,\n }\n ) {\n this.count = count;\n this.currentIndex = 0;\n this.dotStyle = dotStyle;\n this.activeDotStyle = activeDotStyle;\n if (!this.activeDotStyle) {\n this.activeDotStyle = {\n background: \"#999\",\n };\n }\n this.horizontalCarousel = horizontalCarousel;\n this.verticalCarousel = horizontalCarousel === false; // explicitly using 'false' for backwards compatibility\n\n this.dotsClasses = [\"dots\"];\n this.dotClasses = [\"dot\"];\n if (horizontalCarousel) {\n this.dotsClasses.push(\"dots-horizontal-style\");\n this.dotClasses.push(\"dot-style\");\n } else if (this.verticalCarousel) {\n this.dotsClasses.push(dotsTopOrBottom || \"dots-vertical-style-top\");\n this.dotClasses.push(\"dot-style\");\n }\n\n this.dotElements = range(0, count).map(() =>\n createElement({\n classList: this.dotClasses,\n style: dotStyle,\n })\n );\n\n this.element = createElement({\n classList: this.dotsClasses,\n children: this.dotElements,\n style: containerStyle,\n });\n\n this.setIndex(0);\n }\n\n getElement() {\n return this.element;\n }\n\n setIndex(newIndex) {\n if (!(0 <= newIndex && newIndex < this.count)) return;\n\n const oldDotElement = this.dotElements[this.currentIndex];\n replaceStyle(oldDotElement, this.dotStyle);\n oldDotElement.classList.remove(\"active\");\n\n this.currentIndex = newIndex;\n\n const newDotElement = this.dotElements[this.currentIndex];\n replaceStyle(newDotElement, this.dotStyle, this.activeDotStyle);\n newDotElement.classList.add(\"active\");\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/dot_indicator.js","const {\n DOMUtils: { createElement, off, on, transitionEndPromise },\n Utils: { clamp },\n} = Liftoff;\n\nexport default class Dragger1D {\n constructor({\n isEnabled = true,\n bounds: { min, max },\n onDragStart = () => {},\n onDragMove = () => {},\n onDragEnd = () => {},\n onClick = () => {},\n dragAnywhere = false,\n transitionMS = 500,\n children,\n horizontalCarousel = true,\n carouselSnapsToScreen = true,\n conveyorImagesTransition,\n forConveyor = false,\n slideWidth,\n itemCount,\n }) {\n this.itemCount = itemCount;\n this.baseSlidePosition = false;\n this.baseFramePosition = false;\n this.isEnabled = isEnabled;\n this.forConveyor = forConveyor;\n this.horizontalCarousel = horizontalCarousel;\n this.carouselSnapsToScreen = carouselSnapsToScreen;\n this.conveyorImagesTransition = conveyorImagesTransition;\n this.onDragStart = onDragStart;\n this.onDragMove = onDragMove;\n this.onDragEnd = onDragEnd;\n this.onClick = onClick;\n this.transitionMS = transitionMS;\n this.slideWidth = slideWidth;\n\n this.basePosition = 0;\n this.oldTransitionStyle = null;\n this.defaultStyle = {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n right: \"0\",\n bottom: \"0\",\n transition: `transform ${transitionMS}ms ease-out`,\n };\n\n this.element = createElement({\n style: this.defaultStyle,\n children,\n });\n\n this.frameElement = createElement({\n classList: [\"center-frame\"],\n style: {\n width: `${slideWidth}px`,\n height: `${slideWidth}px`,\n ...this.defaultStyle,\n ...this.activeSlideStyle,\n },\n });\n\n this.axis = this.horizontalCarousel || this.forConveyor ? \"X\" : \"Y\";\n\n this.setBounds({ min, max });\n\n this.resetPosition();\n\n const dragStartEvents = {\n \"mousedown touchstart\": (e) => this._onStart(e),\n };\n this._elementEvents = {\n ...(dragAnywhere ? {} : dragStartEvents),\n click: (e) => this._onClick(e),\n };\n this._windowEvents = {\n ...(dragAnywhere ? dragStartEvents : {}),\n \"mousemove touchmove\": (e) => this._onMove(e),\n \"mouseup touchend mouseleave touchleave\": (e) => this._onEnd(e),\n };\n\n on(this.element, this._elementEvents);\n on(window, this._windowEvents);\n }\n\n getElement() {\n return this.element;\n }\n\n getFrameElement() {\n return this.frameElement;\n }\n\n resetPosition(index) {\n this._resetState();\n this._setElementPosition(this.basePosition, index);\n }\n\n setBasePosition(newBasePosition) {\n this.basePosition = newBasePosition;\n }\n\n setBaseFramePosition(position) {\n const baseFramePositionUnuset = !this.baseFramePosition && position !== 0;\n if (baseFramePositionUnuset) {\n this.baseFramePosition = this.framePosition;\n }\n }\n\n setBounds({ min = -Infinity, max = Infinity }) {\n this.min = min;\n this.max = max;\n }\n\n nudge({ offset = 0, durationMS = 1000, conveyorBorderTransition = false }) {\n this.elementToNudge = conveyorBorderTransition\n ? this.frameElement\n : this.element;\n\n const newPosition = conveyorBorderTransition\n ? -this.framePosition - offset\n : this.basePosition - offset;\n\n const oldTransition = this.elementToNudge.style.transition;\n\n // NOTE(cory) Divide `durationMS` by 2 because the transition should play out twice.\n this.elementToNudge.style.transition = `transform ${\n durationMS / 2\n }ms ease-out`;\n\n this._setElementPosition(newPosition, false);\n return transitionEndPromise(this.elementToNudge, { matchTarget: true })\n .then(() => {\n const oldPosition = conveyorBorderTransition\n ? -this.baseFramePosition\n : this.basePosition;\n this._setElementPosition(oldPosition, false);\n return transitionEndPromise(this.elementToNudge, { matchTarget: true });\n })\n .finally(() => {\n this.elementToNudge.style.transition = oldTransition;\n });\n }\n\n clean() {\n off(this.element, this._elementEvents);\n off(window, this._windowEvents);\n }\n\n _resetState() {\n this.isDragging = false;\n if (!this.carouselSnapsToScreen && this.dragDelta) {\n this.basePosition = clamp(this.dragDelta, this.min, this.max);\n } else {\n this.dragStartPosition = null;\n this.dragDelta = null;\n }\n this.baseFramePosition = this.setBaseFramePosition(this.basePosition);\n this.hasDragMoved = false;\n }\n\n _setFramePosition(position, index) {\n const moveFramePosition =\n this.forConveyor && !this.conveyorImagesTransition;\n if (moveFramePosition) {\n // Fix frame position being offset when < 5 products and <= 2 products\n const notNudgingFrame = index !== false;\n if (notNudgingFrame) {\n if (this.itemCount < 5) {\n index++;\n }\n if (this.itemCount <= 2) {\n index++;\n }\n }\n\n this.framePosition = notNudgingFrame\n ? this.slideWidth / 2 + this.slideWidth * index\n : -position;\n\n this.frameElement.style.transform = `translate${this.axis}(${this.framePosition}px)`;\n this.setBaseFramePosition(position);\n }\n }\n\n _setElementPosition(position, index) {\n this._setFramePosition(position, index);\n\n const movingImagePosition =\n this.conveyorImagesTransition ||\n !this.forConveyor ||\n !this.baseSlidePosition;\n if (movingImagePosition) {\n this.baseSlidePosition =\n position !== 0 ? -position : this.baseSlidePosition;\n\n this.element.style.transform = `translate${this.axis}(${-position}px)`;\n }\n }\n\n _onStart(e) {\n if (this.isDragging || !this.isEnabled) return;\n\n // NOTE(cory) Stopping this propagation allows nested dragger targets. This is necessary when\n // any dragger uses `dragAnywhere` while another dragger exists.\n e.stopPropagation();\n\n const pointerEvent = e.touches != null ? e.touches[0] : e;\n\n this.isDragging = true;\n this.dragStartPosition = this.horizontalCarousel\n ? pointerEvent.clientX\n : pointerEvent.clientY;\n this.dragDelta = 0;\n this.hasDragMoved = false;\n\n if (this.oldTransitionStyle == null) {\n this.oldTransitionStyle = this.element.style.transition;\n this.element.style.transition = \"none\";\n }\n\n this.onDragStart(this._getState());\n }\n\n _onMove(e) {\n if (!this.isDragging) return;\n\n this.element.style.pointerEvents = \"none\";\n\n const pointerEvent = e.touches != null ? e.touches[0] : e;\n this.dragMoved = this.horizontalCarousel\n ? pointerEvent.clientX\n : pointerEvent.clientY;\n this.dragDelta = this.dragStartPosition - this.dragMoved;\n if (!this.carouselSnapsToScreen && this.basePosition && !this.forConveyor) {\n this.dragDelta = this.basePosition + this.dragDelta;\n }\n this.hasDragMoved = true;\n\n const state = this._getState();\n\n this._setElementPosition(state.currentDragPosition);\n\n this.onDragMove(state);\n }\n\n _onEnd() {\n if (!this.isDragging) return;\n\n this.element.style.pointerEvents = null;\n\n const state = this._getState();\n\n this._resetState();\n\n if (this.oldTransitionStyle != null) {\n this.element.style.transition = this.oldTransitionStyle;\n this.oldTransitionStyle = null;\n }\n\n this.onDragEnd(state);\n }\n\n _onClick(e) {\n const state = this._getState();\n if (state.hasDragMoved) return;\n\n this.onClick(e, state);\n }\n\n _getState() {\n const dragPosition = this.carouselSnapsToScreen\n ? this.basePosition + this.dragDelta\n : this.dragDelta;\n return {\n currentDragPosition: clamp(dragPosition, this.min, this.max),\n dragStartPosition: this.dragStartPosition,\n dragDelta: this.dragDelta,\n hasDragMoved: this.hasDragMoved,\n };\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/dragger1d.js","import { makeCurrencyFormatter } from \"../../src/js/lib/currency\";\nimport DotIndicator from \"../../src/js/lib/dot_indicator\";\nimport DragSelector1D from \"../../src/js/lib/drag_selector1d\";\nimport InteractionCue from \"../../src/js/lib/interaction_cue\";\nimport NudgeInteractionCue from \"../../src/js/lib/nudge_interaction_cue\";\nimport Scheduler from \"../../src/js/lib/scheduler\";\nimport Tween from \"../../src/js/lib/tween\";\n\nconst {\n Component,\n Utils: { loadImage, range },\n DOMUtils: { appendChildren, createElement, empty, fragmentFromString },\n} = window.Liftoff;\n\nconst DEFAULT_VERTICAL_SPACING = \"15px\";\nconst INTERACTION_CUE_TYPE_NONE = \"none\";\n\nconst currencyAnimationDurationMS = 1000;\nconst isDigit = (char) => char >= \"0\" && char <= \"9\";\nconst getNumericalPrice = (price) => {\n // NOTE(Casey): We assume that normal and special prices are formatted similarly (i.e. same number of\n // fractional parts). With this assumption, we can parse prices for discount calculations just by removing\n // non-digits.\n return Number.parseFloat([...price].filter((d) => isDigit(d)).join(\"\"));\n};\nconst getDiscount = (product) => {\n const { normalPrice, specialPrice } = product;\n if (specialPrice == null) {\n return null;\n }\n\n const normal = getNumericalPrice(normalPrice);\n const special = getNumericalPrice(specialPrice);\n\n const discount = special / normal - 1;\n if (discount === 0) {\n return null;\n }\n\n return discount;\n};\n\nclass ProductDiscount {\n constructor({ product, discountTextStyle }) {\n this.totalDiscount = getDiscount(product);\n this.startTime = Date.now();\n\n this.element =\n this.totalDiscount == null\n ? null\n : createElement({\n tagName: \"span\",\n style: discountTextStyle,\n children: [\"0%\"],\n });\n\n this.tween = new Tween({\n startValue: 0,\n endValue: this.totalDiscount,\n durationMS: currencyAnimationDurationMS,\n easingFn: Tween.Easing.EaseOutQuad,\n });\n }\n\n getElement() {\n return this.element;\n }\n\n reset() {\n if (this.totalDiscount == null) return;\n\n this.tween.start({\n onUpdate: (currentDiscount) => {\n this.element.textContent = `${Math.floor(currentDiscount * 100)}%`;\n },\n });\n }\n}\n\nclass ProductPrice {\n constructor({\n product,\n mainPriceStyle,\n overriddenPriceStyle,\n shouldAnimatePrice,\n }) {\n const { specialPrice, normalPrice } = product;\n const mainPrice = specialPrice || normalPrice;\n const overriddenPrice = mainPrice !== normalPrice ? normalPrice : null;\n\n if (mainPrice == null) {\n this.element = null;\n return null;\n }\n\n const priceFormatter = shouldAnimatePrice\n ? makeCurrencyFormatter(mainPrice)\n : null;\n this.shouldAnimatePrice =\n shouldAnimatePrice && mainPrice != null && priceFormatter != null;\n\n const mainPriceEl = createElement({\n tagName: \"span\",\n style: mainPriceStyle,\n children: [this.shouldAnimatePrice ? 0 : mainPrice],\n });\n\n this.element = createElement({\n tagName: \"span\",\n children: [\n overriddenPrice && {\n tagName: \"span\",\n style: overriddenPriceStyle,\n children: [overriddenPrice],\n },\n \" \",\n mainPriceEl,\n ],\n });\n\n this.initAnimation(mainPrice, mainPriceEl, priceFormatter);\n }\n\n initAnimation(mainPrice, mainPriceEl, priceFormatter) {\n if (!this.shouldAnimatePrice) return;\n\n const numericalMainPrice = getNumericalPrice(mainPrice);\n this.tween = new Tween({\n startValue: 0,\n endValue: numericalMainPrice,\n durationMS: currencyAnimationDurationMS,\n easingFn: Tween.Easing.EaseOutQuad,\n });\n\n this.updatePrice = (currentTweenValue) => {\n const currentTweenDigits = Math.round(currentTweenValue);\n mainPriceEl.textContent = priceFormatter(currentTweenDigits);\n };\n }\n\n getElement() {\n return this.element;\n }\n\n reset() {\n if (!this.shouldAnimatePrice) return;\n\n this.tween.start({\n onUpdate: this.updatePrice,\n });\n }\n}\n\nconst renderProductInfo = (\n infoElement,\n {\n containerClassList,\n containerStyle,\n prefixHTML,\n prefixStyle,\n suffixHTML,\n suffixStyle,\n }\n) => {\n return createElement({\n classList: containerClassList,\n style: containerStyle,\n children: [\n !!prefixHTML && {\n tagName: \"span\",\n style: prefixStyle,\n children: [fragmentFromString(prefixHTML)],\n },\n infoElement,\n \" \",\n !!suffixHTML && {\n tagName: \"span\",\n style: suffixStyle,\n children: [fragmentFromString(suffixHTML)],\n },\n ],\n });\n};\n\nconst renderProductImage = (product, productImageSizing) => {\n return (\n product.imageURL && {\n classList: [\"product-image\"],\n style: {\n backgroundImage: `url(${product.imageURL})`,\n backgroundSize: productImageSizing,\n },\n }\n );\n};\n\nclass ProductCarouselSlide {\n constructor({\n product,\n index,\n width,\n productSlideConfig: {\n productImageStyle,\n productContainerStyle,\n productImageSizing,\n showPrices,\n mainPriceStyle,\n overriddenPriceStyle,\n priceInfoConfig,\n showTitle,\n titleTextStyle,\n titleInfoConfig,\n showDescription,\n descriptionTextStyle,\n descriptionInfoConfig,\n showDiscount,\n discountTextStyle,\n discountInfoConfig,\n shouldAnimatePrice,\n },\n // TODO(cory) Remove the `interactionCueHand` parameter if we standardize on flick-with-nudge.\n interactionCueHand,\n }) {\n this.discount = new ProductDiscount({ product, discountTextStyle });\n this.price = new ProductPrice({\n product,\n overriddenPriceStyle,\n mainPriceStyle,\n shouldAnimatePrice,\n });\n\n const { title, description } = product;\n this.interactionCueHand = interactionCueHand;\n\n // NOTE(Casey): 'showDiscount' was added after some creatives were\n // already using this component, so add a default here to ensure\n // consistent behavior for creatives that were missing this parameter.\n const showDiscountWithDefault =\n showDiscount == null ? this.discount.getElement() != null : showDiscount;\n\n this.productElement = createElement({\n style: productContainerStyle,\n children: [\n {\n style: productImageStyle,\n children: [renderProductImage(product, productImageSizing)],\n },\n showDiscountWithDefault &&\n renderProductInfo(this.discount.getElement(), discountInfoConfig),\n showPrices &&\n renderProductInfo(\n this.price.getElement(),\n Object.assign(priceInfoConfig, {\n containerClassList: [\"product-prices\"],\n })\n ),\n showTitle &&\n renderProductInfo(\n createElement({\n tagName: \"span\",\n children: [title],\n style: titleTextStyle,\n }),\n titleInfoConfig\n ),\n showDescription &&\n renderProductInfo(\n createElement({\n tagName: \"span\",\n children: [description],\n style: descriptionTextStyle,\n }),\n descriptionInfoConfig\n ),\n ],\n });\n\n this.element = createElement({\n classList: [\"product-slide\"],\n style: { transform: `translateX(${index * width}px)` },\n children: [this.productElement],\n });\n }\n\n getElement() {\n return this.element;\n }\n\n activate() {\n this.discount.reset();\n this.price.reset();\n if (this.interactionCueHand != null) {\n appendChildren(this.productElement, [\n this.interactionCueHand.getElement(),\n ]);\n }\n }\n}\n\nclass ProductCarousel {\n constructor({\n products,\n width,\n onDragStart,\n onDragMove,\n onProductClick,\n dragAnywhere,\n onProductSelection,\n interactionCueType,\n interactionCueInterval,\n interactionCueHand = null,\n flickInteractionCueHand,\n attachHandToSlides,\n productSlideConfig,\n }) {\n this.products = products;\n this.width = width;\n this.currentIndex = null;\n this.interactionCueHand = interactionCueHand;\n\n this.productSlides = this.products.map((product, index) => {\n return new ProductCarouselSlide({\n product,\n index,\n width,\n productSlideConfig,\n interactionCueHand: attachHandToSlides ? interactionCueHand : null,\n });\n });\n\n this.dragSelector = new DragSelector1D({\n itemCount: products.length,\n width,\n slidesPerView: 1,\n onDragStart,\n onDragMove,\n onClick: onProductClick,\n dragAnywhere,\n onSelection: onProductSelection,\n children: this.productSlides.map((productSlide) =>\n productSlide.getElement()\n ),\n });\n\n this.element = createElement({\n classList: [\"product-carousel\"],\n children: [this.dragSelector.getElement()],\n });\n\n this.nudgeInteractionCue = new NudgeInteractionCue({\n nudgeType: interactionCueType,\n intervalMS: interactionCueInterval,\n interactionCueHand,\n flickInteractionCueHand,\n nudger: this.dragSelector,\n });\n }\n\n getElement() {\n return this.element;\n }\n\n startInteractionCue() {\n this.nudgeInteractionCue.start();\n }\n\n stopInteractionCue() {\n this.nudgeInteractionCue.stop();\n }\n\n setIndex(index) {\n this.currentIndex = index;\n this.dragSelector.setIndex(index);\n this.productSlides[index].activate();\n }\n}\n\nconst slidesPerConveyorView = 6;\n\nclass ProductConveyorSlide {\n constructor({\n index,\n width,\n product,\n productImageSizing,\n onProductSelection,\n }) {\n this.element = createElement({\n classList: [\"product-slide\"],\n style: {\n width: `${width}px`,\n transform: `translateX(${index * width}px)`,\n // Images to the left are in the front so the hand (positioned to the right of the image) is not\n // under the image to the right.\n zIndex: -index,\n },\n children: [renderProductImage(product, productImageSizing)],\n eventHandlers: {\n click: () => {\n onProductSelection(index);\n },\n },\n });\n }\n\n getElement() {\n return this.element;\n }\n\n setInteractionCueHand(interactionCueHand) {\n if (interactionCueHand == null) return;\n appendChildren(this.element, [interactionCueHand.getElement()]);\n }\n}\n\nclass ProductConveyor {\n constructor({\n products,\n width,\n onDragStart,\n onDragMove,\n onProductSelection,\n interactionCueType,\n interactionCueInterval,\n interactionCueHand = null,\n flickInteractionCueHand,\n activeSlideStyle,\n productImageSizing,\n }) {\n this.products = products;\n this.width = width;\n this.activeSlideStyle = activeSlideStyle;\n this.currentIndex = null;\n this.interactionCueHand = interactionCueHand;\n\n this.slideWidth = width / slidesPerConveyorView;\n this.productSlides = products.map((product, index) => {\n return new ProductConveyorSlide({\n width: this.slideWidth,\n index,\n product,\n productImageSizing,\n onProductSelection,\n });\n });\n\n this.dragSelector = new DragSelector1D({\n itemCount: products.length,\n width,\n slidesPerView: slidesPerConveyorView,\n onDragStart,\n onDragMove,\n onSelection: onProductSelection,\n children: this.productSlides.map((slide) => slide.getElement()),\n });\n\n this.element = createElement({\n classList: [\"product-conveyor\"],\n style: { height: `${this.slideWidth}px` },\n children: [\n this.dragSelector.getElement(),\n {\n classList: [\"center-frame\"],\n style: {\n width: `${this.slideWidth}px`,\n height: `${this.slideWidth}px`,\n ...this.activeSlideStyle,\n },\n },\n ],\n });\n\n this.nudgeInteractionCue = new NudgeInteractionCue({\n nudgeType: interactionCueType,\n intervalMS: interactionCueInterval,\n interactionCueHand,\n flickInteractionCueHand,\n nudger: this.dragSelector,\n });\n }\n\n getElement() {\n return this.element;\n }\n\n setHandForSlide(slideIndex) {\n // NOTE(Casey): We position the hand to the right to avoid interfering with the center frame. The hand\n // won't appear for the last image.\n const slide = this.productSlides[slideIndex + 1];\n if (slide == null) return;\n\n slide.setInteractionCueHand(this.interactionCueHand);\n }\n\n startInteractionCue() {\n this.nudgeInteractionCue.start();\n }\n\n stopInteractionCue() {\n this.nudgeInteractionCue.stop();\n }\n\n setIndex(index) {\n this.currentIndex = index;\n this.dragSelector.setIndex(index);\n this.setHandForSlide(index);\n }\n}\n\nComponent.register(\n \"dynamic-conveyor-carousel\",\n class DynamicConveyorCarousel extends Component {\n constructor(config) {\n super(config);\n\n this.hasDragSelected = false;\n this.currentProductIndex = 0;\n this.products = this.config.useStaticProducts\n ? this.config.products\n : range(0, this.config.productCount)\n .map(() => window.Madlib.getNextProduct())\n .filter((rawProduct) => rawProduct != null)\n .map((rawProduct) => {\n return {\n id: rawProduct.id,\n imageURL: rawProduct.image_url,\n normalPrice: rawProduct.display_price,\n specialPrice: rawProduct.special_display_price,\n title: rawProduct.title,\n description: rawProduct.description,\n };\n });\n\n this.autoTransitionScheduler = new Scheduler({\n intervalMS: this.config.autoScrollDelayMS,\n callback: this._handleAutoTransition.bind(this),\n });\n }\n\n load() {\n const allImageURLs = this.products\n .map(({ imageURL }) => imageURL)\n .concat([this.config.customHandImage])\n .filter((url) => url != null);\n\n return Promise.all(allImageURLs.map((imageURL) => loadImage(imageURL)));\n }\n\n layout(parentNode) {\n super.layout(parentNode);\n\n empty(this.parentNode);\n\n if (this.products.length === 0) return;\n\n this.el = createElement({ classList: [\"dynamic-conveyor-carousel\"] });\n\n this.parentNode.appendChild(this.el);\n\n const boundingClientRect = this.el.getBoundingClientRect();\n const isCarouselInteractive =\n this.config.carouselInteractionCue != null &&\n this.config.carouselInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n const isConveyorInteractive =\n this.config.conveyorInteractionCue != null &&\n this.config.conveyorInteractionCue !== INTERACTION_CUE_TYPE_NONE;\n\n this.interactionCueHand =\n this.config.showInteractionCueHand &&\n (this.config.useAutoScroll ||\n isCarouselInteractive ||\n isConveyorInteractive)\n ? new InteractionCue(\n this.config.customHandImage,\n this.config.interactionCueHandStyle\n )\n : null;\n\n const productImageSizing =\n this.config.productImageSizing === \"fill\"\n ? \"100% 100%\"\n : this.config.productImageSizing;\n\n // TODO(cory) Eliminate `attachHandToSlides` if we standardize flick-with-nudge.\n const attachHandToSlides =\n !this.config.useAutoScroll && !this.config.flickInteractionCueHand;\n\n this.carousel = new ProductCarousel({\n products: this.products,\n width: boundingClientRect.width,\n onDragStart: () => this._handleDragStart(),\n onDragMove: () => this._stopInteractionCues(),\n onProductClick: (e, index) => this._handleProductClick(e, index),\n dragAnywhere: this.config.dragAnywhere,\n onProductSelection: (index) => this._handleProductSelection(index),\n interactionCueType: this.config.carouselInteractionCue,\n interactionCueInterval: this.config.interactionCueInterval,\n interactionCueHand: isCarouselInteractive\n ? this.interactionCueHand\n : null,\n flickInteractionCueHand: this.config.flickInteractionCueHand,\n attachHandToSlides,\n productSlideConfig: {\n productImageStyle: this.config.productImageStyle,\n productContainerStyle: this.config.productContainerStyle,\n productImageSizing,\n shouldAnimatePrice: this.config.shouldAnimatePrice,\n\n // Price\n showPrices: this.config.showPrices,\n mainPriceStyle: this.config.mainPriceStyle,\n overriddenPriceStyle: this.config.overriddenPriceStyle,\n priceInfoConfig: {\n containerStyle: this.config.priceContainerStyle,\n prefixHTML: this.config.pricePrefix,\n prefixStyle: this.config.pricePrefixStyle,\n suffixHTML: this.config.priceSuffix,\n suffixStyle: this.config.priceSuffixStyle,\n },\n\n // Title\n showTitle: this.config.showTitle,\n titleTextStyle: this.config.titleTextStyle,\n titleInfoConfig: {\n containerStyle: this.config.titleStyle,\n prefixHTML: this.config.titlePrefix,\n prefixStyle: this.config.titlePrefixStyle,\n suffixHTML: this.config.titleSuffix,\n suffixStyle: this.config.titleSuffixStyle,\n },\n\n // Description\n showDescription: this.config.showDescription,\n descriptionTextStyle: this.config.descriptionTextStyle,\n descriptionInfoConfig: {\n containerStyle: this.config.descriptionStyle,\n prefixHTML: this.config.descriptionPrefix,\n prefixStyle: this.config.descriptionPrefixStyle,\n suffixHTML: this.config.descriptionSuffix,\n suffixStyle: this.config.descriptionSuffixStyle,\n },\n\n // Discount\n showDiscount: this.config.showDiscount,\n discountTextStyle: this.config.discountTextStyle,\n discountInfoConfig: {\n containerStyle: this.config.discountStyle,\n prefixHTML: this.config.discountPrefix,\n prefixStyle: this.config.discountPrefixStyle,\n suffixHTML: this.config.discountSuffix,\n suffixStyle: this.config.discountSuffixStyle,\n },\n },\n });\n\n this.conveyor = new ProductConveyor({\n productImageSizing,\n products: this.products,\n width: boundingClientRect.width,\n onDragStart: () => this._handleDragStart(),\n onDragMove: () => this._stopInteractionCues(),\n onProductSelection: (index) => this._handleProductSelection(index),\n interactionCueType: this.config.conveyorInteractionCue,\n interactionCueInterval: this.config.interactionCueInterval,\n interactionCueHand:\n isConveyorInteractive &&\n !isCarouselInteractive &&\n !this.config.useAutoScroll\n ? this.interactionCueHand\n : null,\n flickInteractionCueHand: this.config.flickInteractionCueHand,\n activeSlideStyle: this.config.activeConveyorSlideStyle,\n });\n\n this.dotIndicator = new DotIndicator(this.products.length, {\n containerStyle: this.config.dotsContainerStyle,\n dotStyle: this.config.dotStyle,\n activeDotStyle: this.config.activeDotStyle,\n });\n\n const spacingPx =\n this.config.verticalSpacing == null\n ? DEFAULT_VERTICAL_SPACING\n : `${this.config.verticalSpacing}px`;\n const makeSpacer = () => {\n return createElement({\n // This class name is included only to improve the interpretability of the DOM. No CSS is applied\n // to this class.\n classList: [\"liftoff-spacer\"],\n style: { height: spacingPx },\n });\n };\n\n appendChildren(this.el, [\n {\n classList: [\"product-carousel-container\"],\n children: [\n this.carousel.getElement(),\n !attachHandToSlides &&\n this.interactionCueHand &&\n this.interactionCueHand.getElement(),\n ],\n },\n makeSpacer(),\n this.config.showConveyor && this.conveyor.getElement(),\n makeSpacer(),\n this.config.showDots && {\n classList: [\"product-dots\"],\n children: [this.dotIndicator.getElement()],\n },\n this.config.showDots && makeSpacer(),\n ]);\n\n // NOTE(Casey): firstProductIndex is a required parameter, but it was added in later iterations on this\n // component. The null-check is for backwards compatibility.\n const firstProductIndex =\n this.config.firstProductIndex === \"Auto\" ||\n this.config.firstProductIndex == null\n ? Math.floor(this.products.length / 2 - 0.5)\n : // The parameter value is a 1-based index.\n this.config.firstProductIndex - 1;\n\n this._setProductIndex(firstProductIndex);\n }\n\n resize() {}\n\n _startInteractionCues() {\n this.carousel.startInteractionCue();\n this.conveyor.startInteractionCue();\n }\n\n start() {\n if (this.products.length === 0) return;\n\n if (this.config.useAutoScroll) {\n this.autoTransitionScheduler.start();\n } else {\n this._startInteractionCues();\n }\n }\n\n _stopInteractionCues() {\n this.carousel.stopInteractionCue();\n this.conveyor.stopInteractionCue();\n }\n\n _stopAutoTransitions() {\n this.autoTransitionScheduler.stop();\n if (this.interactionCueHand != null && this.config.useAutoScroll) {\n this.interactionCueHand.hide();\n }\n }\n\n stop() {\n if (this.products.length === 0) return;\n\n this._stopAutoTransitions();\n this._stopInteractionCues();\n }\n\n restart() {}\n\n _transitionProductView(indexDelta) {\n const newIndex =\n (this.currentProductIndex + indexDelta + this.products.length) %\n this.products.length;\n\n this._setProductIndex(newIndex);\n }\n\n _handleAutoTransition() {\n if (!this.config.useAutoScroll) return;\n\n if (\n this.interactionCueHand != null &&\n this.currentProductIndex !== this.products.length - 1\n ) {\n this.interactionCueHand.flick({\n onFlickReady: () => this._transitionProductView(1),\n flickDuration: Math.min(this.config.autoScrollDelayMS / 2, 900),\n });\n } else {\n this._transitionProductView(1);\n }\n }\n\n _updateGlobalProductIdParam(productIndex) {\n const product = this.products[productIndex];\n if (product == null) return;\n\n Liftoff.mergeClickParams({ pid: product.id });\n }\n\n _handleDragStart() {\n this.recordInteraction();\n this._stopAutoTransitions();\n\n if (!this.hasDragSelected) {\n this._startInteractionCues();\n }\n }\n\n _handleProductClick(e, index) {\n if (!(0 <= index && index < this.products.length)) return;\n\n const product = this.products[index];\n window.Madlib.handleNavigationClick(e, { pid: product.id });\n }\n\n _handleProductSelection(index) {\n if (!(0 <= index && index < this.products.length)) return;\n\n if (index !== this.currentProductIndex) {\n this.hasDragSelected = true;\n this._stopInteractionCues();\n } else if (!this.hasDragSelected) {\n this._startInteractionCues();\n }\n\n this._setProductIndex(index);\n }\n\n _setProductIndex(index) {\n this.currentProductIndex = index;\n\n this.carousel.setIndex(index);\n this.conveyor.setIndex(index);\n this.dotIndicator.setIndex(index);\n\n this._updateGlobalProductIdParam(index);\n }\n }\n);\n\n\n\n// WEBPACK FOOTER //\n// ./components/dynamic-conveyor-carousel/dynamic-conveyor-carousel.js","class Tween {\n static Tween(start, end, ease, f) {\n f = Math.min(1, Math.max(0, f));\n switch (typeof start) {\n case \"number\":\n return start + (end - start) * ease(f);\n case \"object\":\n const value = {};\n for (const k in start) {\n value[k] = start[k] + (end[k] - start[k]) * ease(f);\n }\n return value;\n }\n }\n\n constructor(config) {\n [\"startValue\", \"endValue\", \"durationMS\", \"easingFn\"].forEach(\n (param) => (this[param] = config[param])\n );\n }\n\n from(startValue) {\n this.startValue = startValue;\n return this;\n }\n\n to(endValue) {\n this.endValue = endValue;\n return this;\n }\n\n in(durationMS) {\n this.durationMS = durationMS;\n return this;\n }\n\n with(easingFn) {\n this.easingFn = easingFn;\n return this;\n }\n\n // Cannot use `performance.now()` here due to lack of browser support.\n start(callbackMap = {}) {\n this.startTS = Date.now();\n this.stopped = false;\n const update = () => {\n if (this.stopped) return;\n const currentValue = this.valueNow();\n if (callbackMap.onUpdate) {\n callbackMap.onUpdate(currentValue);\n }\n if (Date.now() - this.startTS <= this.durationMS) {\n requestAnimationFrame(update);\n } else if (callbackMap.onComplete) {\n callbackMap.onComplete(currentValue);\n }\n };\n requestAnimationFrame(update);\n return this;\n }\n\n stop() {\n this.stopped = true;\n return this;\n }\n\n valueNow() {\n return Tween.Tween(\n this.startValue,\n this.endValue,\n this.easingFn,\n (Date.now() - this.startTS) / this.durationMS\n );\n }\n\n valueAfterMS(elapsed) {\n return Tween.Tween(\n this.startValue,\n this.endValue,\n this.easingFn,\n elapsed / this.durationMS\n );\n }\n\n valueAfterFraction(f) {\n return Tween.Tween(this.startValue, this.endValue, this.easingFn, f);\n }\n}\n\nTween.Easing = {\n Linear: (f) => f,\n EaseInSine: (f) => 1 - Math.cos((f * Math.PI) / 2),\n EaseOutSine: (f) => Math.sin((f * Math.PI) / 2),\n EaseInOutSine: (f) => (1 - Math.cos(f * Math.PI)) / 2,\n EaseInQuad: (f) => Math.pow(f, 2),\n EaseOutQuad: (f) => f * (2 - f),\n EaseInOutQuad: (f) => {\n f *= 2;\n if (f < 1) {\n return Math.pow(f, 2) / 2;\n } else {\n f -= 1;\n return (1 - f * (f - 2)) / 2;\n }\n },\n EaseInCubic: (f) => Math.pow(f, 3),\n EaseOutCubic: (f) => Math.pow(f - 1, 3) + 1,\n EaseInOutCubic: (f) => {\n f *= 2;\n if (f < 1) {\n return Math.pow(f, 3) / 2;\n } else {\n return (Math.pow(f - 2, 3) + 2) / 2;\n }\n },\n};\n\nexport default Tween;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/tween.js","import Scheduler from \"./scheduler\";\n\nconst nudgeTypeToPx = {\n \"nudge-up\": 20,\n \"nudge-down\": -20,\n \"nudge-left\": -20,\n \"nudge-right\": 20,\n};\nconst getNudgeOffsetPx = (nudgeType) => nudgeTypeToPx[nudgeType] || 0;\n\nexport default class NudgeInteractionCue {\n constructor({\n nudgeType,\n intervalMS,\n interactionCueHand = null,\n flickInteractionCueHand,\n nudger,\n horizontalCarousel = true,\n conveyorBorderTransition = false,\n }) {\n this.interactionCueHand = interactionCueHand;\n\n const offset = getNudgeOffsetPx(nudgeType);\n\n this.scheduler =\n offset !== 0\n ? new Scheduler({\n intervalMS,\n callback: () => {\n const flickDuration = Math.min(intervalMS / 2, 900);\n if (interactionCueHand != null && flickInteractionCueHand) {\n interactionCueHand.flick({\n onFlickReady: () => {\n // NOTE(cory) We choose not to wait on the nudge promise so the animations play in parallel.\n nudger.nudge({\n offset,\n durationMS: intervalMS / 2,\n conveyorBorderTransition,\n });\n },\n flickDistance: offset,\n flickRotation: 10,\n flickDuration,\n xOrY: horizontalCarousel ? \"X\" : \"Y\",\n });\n } else {\n // NOTE(cory) Wait for this timeout to sync nudges between carousel and conveyor.\n // Unfortunately, this is coupled to the implementation of flick, and the amount of\n // time it takes to call its `onFlickReady` argument.\n new Promise((resolve) => {\n setTimeout(resolve, flickDuration / 2);\n }).then(() => {\n nudger.nudge({\n offset,\n durationMS: intervalMS / 2,\n conveyorBorderTransition,\n });\n });\n }\n },\n })\n : null;\n }\n\n start() {\n if (this.scheduler != null) {\n this.scheduler.start();\n }\n if (this.interactionCueHand != null) {\n this.interactionCueHand.show();\n }\n }\n\n stop() {\n if (this.scheduler != null) {\n this.scheduler.stop();\n }\n if (this.interactionCueHand != null) {\n this.interactionCueHand.hide();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/nudge_interaction_cue.js","const isDigit = (char) => char >= \"0\" && char <= \"9\";\n\n/**\n * Given an \"example\" currency string, returns a function that takes an integer\n * argument and returns the integer formatted in the same way as the example.\n * E.g.,\n *\n * const formatter = makeCurrencyFormatter(\"$1,234.56\");\n * formatter(9876543210) // => $98,765,432.10\n * formatter(0) // => $0.00\n * formatter(321) // => $3.21\n *\n * Assumes:\n * 1) There are either 0 or 2 decimal places.\n * 2) Every third digit may be separated by a consistent separator.\n * 3) The only characters between the first digit and the last digit are\n * either a digit, the decimal separator, or the group separator.\n * 4) Any characters before the first digit or after the last digit should\n * appear in any properly formatted string.\n *\n * Returns 'null' if the example string cannot be parsed according to the above\n * assumptions.\n */\n\n// eslint-disable-next-line\nexport const makeCurrencyFormatter = (baseStr) => {\n const numericChars = [...baseStr];\n let prefixStr = \"\";\n while (numericChars.length !== 0 && !isDigit(numericChars[0])) {\n prefixStr = `${prefixStr}${numericChars.shift()}`;\n }\n\n let suffixStr = \"\";\n while (\n numericChars.length !== 0 &&\n !isDigit(numericChars[numericChars.length - 1])\n ) {\n suffixStr = `${numericChars.pop()}${suffixStr}`;\n }\n\n let decimalSeparator = numericChars[numericChars.length - 3];\n if (isDigit(decimalSeparator)) {\n decimalSeparator = null;\n }\n\n const groupSeparatorIndex =\n decimalSeparator == null\n ? numericChars.length - 4\n : numericChars.length - 7;\n\n let groupSeparator = numericChars[groupSeparatorIndex];\n if (isDigit(groupSeparator)) {\n groupSeparator = null;\n }\n\n if (numericChars.length === 0) {\n return null;\n }\n\n // Check that the character at each position is of the expected class.\n const decimalPosition =\n decimalSeparator == null ? numericChars.length : numericChars.length - 3;\n\n const shouldBeGroupSeparator = (charIndex) => {\n const charsFromDecimal = decimalPosition - charIndex;\n return (\n groupSeparator != null &&\n charIndex !== 0 &&\n charsFromDecimal > 0 &&\n charsFromDecimal % 4 === 0\n );\n };\n\n const shouldBeDecimalSeparator = (charIndex) => {\n return decimalSeparator != null && charIndex === numericChars.length - 3;\n };\n\n for (let i = 0; i < numericChars.length; i++) {\n const char = numericChars[i];\n const charShouldBeGroupSeparator = shouldBeGroupSeparator(i);\n const charShouldBeDecimalSeparator = shouldBeDecimalSeparator(i);\n if (\n (charShouldBeGroupSeparator && char !== groupSeparator) ||\n (charShouldBeDecimalSeparator && char !== decimalSeparator) ||\n (!charShouldBeGroupSeparator &&\n !charShouldBeDecimalSeparator &&\n !isDigit(char))\n ) {\n return null;\n }\n }\n\n return (intToFormat) => {\n let strToFormat = String(intToFormat);\n if (decimalSeparator != null && strToFormat.length < 3) {\n const zerosNeeded = 3 - strToFormat.length;\n const zeroPadding = \"0\".repeat(zerosNeeded);\n strToFormat = `${zeroPadding}${strToFormat}`;\n }\n\n const formattedDigits = [...strToFormat]\n .reverse()\n .reduce((reversedFormatted, digitChar, digitIndex) => {\n const digitsBeforeDecimalCount =\n decimalSeparator == null ? digitIndex : digitIndex - 2;\n\n if (digitIndex === 2 && decimalSeparator != null) {\n reversedFormatted.push(decimalSeparator);\n } else if (\n digitsBeforeDecimalCount > 0 &&\n (digitsBeforeDecimalCount % 3 === 0) & (groupSeparator != null)\n ) {\n reversedFormatted.push(groupSeparator);\n }\n\n reversedFormatted.push(digitChar);\n return reversedFormatted;\n }, [])\n .reverse()\n .join(\"\");\n\n return `${prefixStr}${formattedDigits}${suffixStr}`;\n };\n};\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/currency.js","import Dragger1D from \"./dragger1d\";\n\nconst {\n Utils: { clamp },\n} = Liftoff;\n\nexport default class DragSelector1D {\n constructor({\n itemCount,\n width,\n height,\n slidesPerView,\n onDragStart,\n onDragMove,\n onClick = () => {},\n dragAnywhere = false,\n onSelection = () => {},\n transitionMS = 500,\n children,\n horizontalCarousel = true,\n carouselSnapsToScreen = true,\n conveyorImagesTransition,\n forConveyor,\n activeSlideStyle,\n }) {\n this.itemCount = itemCount;\n this.width = width;\n this.height = height;\n\n this.slideWidth = width / slidesPerView;\n this.slideHeight = height / slidesPerView;\n\n this.widthOrHeight =\n horizontalCarousel || forConveyor ? this.width : this.height;\n this.slideWidthOrHeight =\n horizontalCarousel || forConveyor ? this.slideWidth : this.slideHeight;\n // explicitly using 'false' for backwards compatibility\n this.minDivisor = carouselSnapsToScreen === false ? 10 : 2;\n this.maxDivisor = carouselSnapsToScreen === false ? 1 : 2;\n this.dragger = new Dragger1D({\n horizontalCarousel,\n carouselSnapsToScreen,\n conveyorImagesTransition,\n activeSlideStyle,\n slideWidth: this.slideWidth,\n slideHeight: this.slideHeight,\n widthOrHeight: this.widthOrHeight,\n itemCount,\n bounds: {\n min: -this.widthOrHeight / this.minDivisor,\n max:\n -this.widthOrHeight / this.maxDivisor +\n this.slideWidthOrHeight * itemCount,\n },\n onDragStart,\n onDragMove,\n onDragEnd: (state) => {\n if (state.hasDragMoved) {\n onSelection(this._getNearestIndex(state));\n }\n },\n onClick: (e, state) => {\n onClick(e, this._getNearestIndex(state));\n },\n dragAnywhere,\n transitionMS,\n children,\n forConveyor,\n });\n }\n\n getElement() {\n return this.dragger.getElement();\n }\n\n getFrameElement() {\n return this.dragger.getFrameElement();\n }\n\n nudge(...args) {\n return this.dragger.nudge(...args);\n }\n\n setIndex(index) {\n const position =\n -this.widthOrHeight / 2 + (index + 0.5) * this.slideWidthOrHeight;\n this.dragger.setBasePosition(position);\n this.dragger.resetPosition(index);\n }\n\n _getNearestIndex(dragState) {\n return clamp(\n Math.floor(\n ((this.widthOrHeight - this.slideWidthOrHeight) / 2 +\n dragState.currentDragPosition) /\n this.slideWidthOrHeight + // Find the left edge of the nearest product view.\n 0.5 + // Align with the center on a scale of 0 to 1.\n 0.3 * Math.sign(dragState.dragDelta)\n // The drag direction (`dragDelta`) shows some user intent.\n // The product view in the forward direction is treated as being closer.\n ),\n 0,\n this.itemCount - 1\n );\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/drag_selector1d.js","import handImage from \"./interaction_cue_hand.png\";\n\nconst {\n DOMUtils: { createElement, runTransitionSequence },\n} = Liftoff;\n\nclass InteractionCue {\n constructor(cueImageURL, style = {}) {\n this.el = createElement({\n classList: [\"liftoff-interaction-cue-hand\", \"interaction-cue-hand-style\"],\n style: style,\n children: [\n createElement({\n style: {\n backgroundImage: `url(${cueImageURL || handImage})`,\n backgroundSize: \"contain\",\n backgroundRepeat: \"no-repeat\",\n pointerEvents: \"none\",\n width: \"100%\",\n height: \"100%\",\n },\n }),\n ],\n });\n }\n\n getElement() {\n return this.el;\n }\n\n hide() {\n this.el.style.display = \"none\";\n }\n\n show() {\n this.el.style.display = \"block\";\n }\n\n /**\n * Triggers a finger \"flick\" animation. The finger moves `flickDistance` px and rotates `flickRotation` deg\n * to the right from its base position; `onFlickReady` is then called; the finger moves back to the left,\n * overshooting its base position by `flickDistance / 2` px and `flickRotation / 2` deg; then the finger\n * moves back to its base position. The entire animation is completed in `flickDuration` ms. If\n * `flickDistance` is negative, the finger flicks in the other direction. `flickGrowth` controls\n * the maximum fractional increase in the size of hand during the \"wind-up\" phase, increasing the\n * impression of the finger being lifted from the screen.\n */\n flick({\n onFlickReady = () => null,\n flickDistance = -50,\n flickRotation = 20,\n flickDuration = 900,\n flickGrowth = 0.1,\n xOrY = \"X\",\n }) {\n return runTransitionSequence(this.el, [\n {\n transition: `transform ${flickDuration / 4}ms`,\n transitionTimingFunction: \"ease-in\",\n transform:\n `translate${xOrY}(${-flickDistance}px) ` +\n `rotate(${Math.sign(flickDistance) * -flickRotation}deg) ` +\n `scale(${1 + flickGrowth})`,\n },\n {\n transform: null,\n },\n onFlickReady,\n {\n transform:\n `translate${xOrY}(${flickDistance / 2}px) ` +\n `rotate(${(Math.sign(flickDistance) * flickRotation) / 2}deg) ` +\n `scale(${1 + 0.5 * flickGrowth})`,\n transitionTimingFunction: \"ease-out\",\n },\n {\n transform: null,\n transitionTimingFunction: \"linear\",\n },\n {\n transition: null,\n transform: null,\n },\n ]);\n }\n}\n\nexport default InteractionCue;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/interaction_cue.js","/* eslint-disable-next-line */\nconst handImageData =\n \"data:image/png;base64,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\";\n\nexport default handImageData;\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/interaction_cue_hand.png.js","// NOTE(cory) `Scheduler` runs a function on an interval, which can be started, stopped, and restarted\n// at any time. Starting a scheduler when it's already running has no effect.\n\nexport default class Scheduler {\n /**\n * When `leading === true`, the callback is executed on the leading edge of the interval, as well as on\n * the trailing edge.\n */\n constructor({ intervalMS, callback, leading = false }) {\n this.intervalMS = intervalMS;\n this.callback = callback;\n this.leading = leading;\n\n this.isActive = false;\n this.intervalID = null;\n }\n\n start() {\n if (this.isActive) return;\n\n if (this.leading) {\n this.callback();\n }\n\n this.isActive = true;\n this.intervalID = setInterval(() => {\n if (this.isActive) this.callback();\n }, this.intervalMS);\n }\n\n stop() {\n this.isActive = false;\n if (this.intervalID != null) {\n clearInterval(this.intervalID);\n this.intervalID = null;\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./src/js/lib/scheduler.js"],"sourceRoot":""}