{"version":3,"file":"main-4fa940f10db02e5fc228.esm.js","mappings":"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","sources":["webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-server-libs/get-element-tag.js","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-server-libs/src/get-element-tag.js","webpack://dh-beforeafter-v2/webpack/bootstrap","webpack://dh-beforeafter-v2/./src/components/before-after.module.css?6382","webpack://dh-beforeafter-v2/./node_modules/@nrk/dh-basis-common/dist/index.esm.js","webpack://dh-beforeafter-v2/./src/components/before-after.js","webpack://dh-beforeafter-v2/./src/components/scratch-before-after.module.css?88d8","webpack://dh-beforeafter-v2/./src/components/scratch-before-after.js","webpack://dh-beforeafter-v2/./src/lib/utils.js","webpack://dh-beforeafter-v2/./src/client.module.css?98d6","webpack://dh-beforeafter-v2/./src/client.js"],"sourcesContent":["module.exports = require('./src/get-element-tag')\n","/**\n * Creates a valid custom element name that is versioned (major)\n */\nfunction getElementTag(name, version) {\n const formattedVersion = version ? `-v${version.split('.')[0]}` : ''\n return name + formattedVersion\n}\n\nmodule.exports.getElementTag = getElementTag\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// extracted by mini-css-extract-plugin\nexport default {\"before-after\":\"dhbaf__before-after--ZaWM_\",\"beforeAfter\":\"dhbaf__before-after--ZaWM_\",\"container\":\"dhbaf__container--kSQZg\",\"before\":\"dhbaf__before--gDnqX\",\"slider-button\":\"dhbaf__slider-button--GmpcZ\",\"sliderButton\":\"dhbaf__slider-button--GmpcZ\",\"pulse\":\"dhbaf__pulse--ZcjN4\"};","import _defineProperty from '@babel/runtime/helpers/defineProperty';\n\n/* eslint-disable compat/compat */\nfunction getDefaultRoot() {\n /*\n Use document if supported\n IntersectionObserver will otherwise default to top level document,\n and IntersectionObserver will not work as expected in an iframe.\n https://github.com/w3c/IntersectionObserver/issues/372\n */\n\n /*\n Safari does not throw error on root: document, but does not trigger events as expected\n returning null for now until better feature detection is possible\n */\n return null;\n\n /*\n try {\n // eslint-disable-next-line no-new\n new IntersectionObserver(() => {}, { root: document })\n return document\n } catch (e) {\n return null\n }\n */\n}\n\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nvar defaultConfig = {\n rootMargin: '0px 0px 0px 0px',\n threshold: [0, 0.5, 1],\n root: getDefaultRoot()\n};\nclass ElementIntersectionObserver {\n constructor(elements, onChange, config) {\n _defineProperty(this, \"intersections\", void 0);\n _defineProperty(this, \"elements\", void 0);\n this.elements = elements.slice(0);\n this.intersections = elements.map(target => ({\n target,\n isIntersecting: false,\n ratio: null\n }));\n this.intersectionObserver = new IntersectionObserver(entries => {\n var intersections = this.intersections.slice(0);\n entries.forEach(entry => {\n var idx = elements.indexOf(entry.target);\n intersections.splice(idx, 1, {\n target: entry.target,\n isIntersecting: entry.isIntersecting,\n ratio: entry.intersectionRatio\n });\n });\n this.intersections = intersections;\n onChange(this.intersections);\n }, _objectSpread(_objectSpread({}, defaultConfig), config));\n elements.forEach(elm => this.intersectionObserver.observe(elm));\n }\n disconnect() {\n // Unregister trigger elements\n this.elements.forEach(elm => this.intersectionObserver.unobserve(elm));\n\n // Disconnect intersection observer\n this.intersectionObserver.disconnect();\n }\n}\n\nfunction toggleAttribute(el, name, boolValue) {\n if (!el) {\n return;\n }\n var nextValue;\n if (typeof boolValue !== 'undefined') {\n nextValue = !!boolValue;\n } else {\n nextValue = el.hasAttribute(name);\n }\n if (nextValue) {\n el.setAttribute(name, '');\n } else {\n el.removeAttribute(name);\n }\n}\nfunction setAttribute(el, name, nextValue) {\n if (!el) {\n return;\n }\n if (nextValue) {\n el.setAttribute(name, nextValue);\n } else {\n el.removeAttribute(name);\n }\n}\nvar closest = (() => {\n var proto = typeof window === 'undefined' ? {} : window.Element.prototype;\n var match = proto.matches || proto.msMatchesSelector || proto.webkitMatchesSelector;\n if (proto.closest) {\n return (el, css) => el.closest(css);\n } else {\n return (el, css) => {\n for (; el; el = el.parentElement) if (match.call(el, css)) return el;\n return null;\n };\n }\n})();\nfunction addStyle(nodeName, css) {\n var key = \"style-\".concat(nodeName.toLowerCase());\n var min = css.replace(/\\/\\*[^!][^*]*\\*\\//g, '').replace(/\\s*(^|[:;,{}]|$)\\s*/g, '$1');\n document.getElementById(key) || document.head.insertAdjacentHTML('afterbegin', \"\"));\n}\nfunction toArray(nodeList) {\n return [].slice.call(nodeList);\n}\nfunction dispatchEvent(element, name) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var ignore = \"prevent_recursive_dispatch_maximum_callstack\".concat(name);\n var event;\n if (element[ignore]) return true;\n // We are already processing this event, so skip sending a new one\n else element[ignore] = true; // Add name to dispatching ignore\n\n if (typeof window.CustomEvent === 'function') {\n event = new window.CustomEvent(name, {\n bubbles: true,\n cancelable: true,\n detail\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(name, true, true, detail);\n }\n // IE reports incorrect event.defaultPrevented\n // but correct return value on element.dispatchEvent\n var result = element.dispatchEvent(event);\n element[ignore] = null; // Remove name from dispatching ignore\n\n return result; // Follow W3C standard for return value\n}\n\nfunction easeOutQuint(t) {\n return 1 + --t * t * t * t * t;\n}\nclass VerticalScroll {\n constructor(container) {\n _defineProperty(this, \"container\", void 0);\n this.container = container;\n }\n cancel() {\n this._cancelled = true;\n }\n to(top) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var from = this.container.scrollTop;\n var distance = top - from;\n var startTime = null;\n var loop = currentTime => {\n if (this._cancelled) {\n return;\n }\n if (!startTime) {\n startTime = currentTime - 1;\n }\n var timeElapsed = currentTime - startTime;\n if (timeElapsed < duration) {\n this.container.scrollTop = from + distance * easeOutQuint(timeElapsed / duration);\n window.requestAnimationFrame(loop);\n } else {\n this.container.scrollTop = top;\n callback && callback();\n }\n };\n\n // eslint-disable-next-line compat/compat\n window.requestAnimationFrame(loop);\n }\n}\nclass HorizontalScroll {\n constructor(container) {\n _defineProperty(this, \"container\", void 0);\n this.container = container;\n }\n cancel() {\n this._cancelled = true;\n }\n to(left) {\n var duration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000;\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var from = this.container.scrollLeft;\n var distance = left - from;\n var startTime = null;\n var loop = currentTime => {\n if (this._cancelled) {\n return;\n }\n if (!startTime) {\n startTime = currentTime - 1;\n }\n var timeElapsed = currentTime - startTime;\n if (timeElapsed < duration) {\n this.container.scrollLeft = from + distance * easeOutQuint(timeElapsed / duration);\n window.requestAnimationFrame(loop);\n } else {\n this.container.scrollLeft = left;\n callback && callback();\n }\n };\n\n // eslint-disable-next-line compat/compat\n window.requestAnimationFrame(loop);\n }\n}\n\nfunction testReducedMotion() {\n if (typeof window !== 'undefined') {\n return !!window.matchMedia && window.matchMedia('(prefers-reduced-motion)').matches;\n }\n return false;\n}\n\nvar MAX_SAFE_INTEGER = 9007199254740991;\nfunction withinRange(current) {\n var start = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var stop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : MAX_SAFE_INTEGER;\n return current >= start && current <= stop;\n}\nfunction withinStops(currentTime, stops, targetStop) {\n var nrOfStops = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;\n var uniqueStops = stops.filter(unique);\n var targetTime = stops[targetStop];\n var prevTime = uniqueStops[uniqueStops.indexOf(targetTime) - nrOfStops];\n var nextTime = uniqueStops[uniqueStops.indexOf(targetTime) + nrOfStops];\n return withinRange(currentTime, prevTime, nextTime);\n}\nfunction unique(value, index, self) {\n return self.indexOf(value) === index;\n}\n\n/*\n * 'loading=\"lazy\"' is defined in terms of IntersectionObserver and the initial root.\n * As a result images with 'loading=\"lazy\"' inside a scroll container will not load\n * until they at least have one pixel visible in the viewport.\n *\n * This will hopefully fixed in a future version of the spec:\n * https://github.com/w3c/IntersectionObserver/issues/431\n *\n * scroll-container-lazy-load observes images and a scroll container.\n * Once images are close to intersecting it will change 'loading=\"lazy\"' to 'loading=\"eager\"'.\n * */\nfunction loadImage(image) {\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n}\nfunction connectScrollContainerLazyLoad(container, images) {\n var containerIntersecting = false;\n var deferredImages = [];\n\n // eslint-disable-next-line compat/compat\n var containerObserver = new IntersectionObserver(entries => {\n containerIntersecting = entries === null || entries === void 0 ? void 0 : entries[0].isIntersecting;\n if (containerIntersecting) {\n deferredImages.forEach(image => loadImage(image));\n deferredImages = [];\n }\n }, {\n root: getDefaultRoot(),\n threshold: [0.0]\n });\n containerObserver.observe(container);\n\n // eslint-disable-next-line compat/compat\n var imageObserver = new IntersectionObserver(entries => {\n for (var entry of entries) {\n if (entry.isIntersecting) {\n var image = entry.target;\n imageObserver.unobserve(image);\n if (containerIntersecting) {\n loadImage(image);\n } else {\n /* Defer loading of if the container is not intersecting the viewport */\n deferredImages.push(image);\n }\n }\n }\n }, {\n root: container,\n rootMargin: '300px',\n threshold: 0.0\n });\n for (var image of images) {\n imageObserver.observe(image);\n }\n return () => {\n containerObserver.disconnect();\n imageObserver.disconnect();\n };\n}\n\nfunction debounce(fn, delay) {\n var timeout;\n return function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n };\n}\n\nexport { ElementIntersectionObserver, HorizontalScroll, VerticalScroll, addStyle, closest, connectScrollContainerLazyLoad, debounce, dispatchEvent, setAttribute, testReducedMotion, toArray, toggleAttribute, withinRange, withinStops };\n//# sourceMappingURL=index.esm.js.map\n","import s from './before-after.module.css'\nimport { closest, toArray } from '@nrk/dh-basis-common'\n\nfunction clamp(value) {\n return Math.max(Math.min(value, 100), 0)\n}\n\nexport default class BeforeAfter extends HTMLElement {\n _value = 50\n connectedCallback() {\n this.input.addEventListener('change', this._handleChange)\n this.input.addEventListener('input', this._handleChange)\n if (this._isTouchDevice()) {\n this.input.addEventListener('touchstart', this._handleTouch)\n this.input.addEventListener('touchmove', this._handleTouch)\n this.input.addEventListener('touchend', this._handleTouch)\n }\n this._updateValue()\n\n if (this._isFullWidth() || this._isFeatureCover()) {\n const images = toArray(this.querySelectorAll('img'))\n images.forEach((image) => {\n image.setAttribute('sizes', '100vw')\n })\n }\n }\n\n disconnectedCallback() {\n this.input.removeEventListener('change', this._handleChange)\n this.input.removeEventListener('input', this._handleChange)\n if (this._isTouchDevice()) {\n this.input.addEventListener('touchstart', this._handleTouch)\n this.input.addEventListener('touchmove', this._handleTouch)\n this.input.addEventListener('touchend', this._handleTouch)\n }\n }\n\n _isTouchDevice() {\n return typeof document !== 'undefined' && 'ontouchstart' in document.documentElement\n }\n\n _isFullWidth() {\n const remoterendered = closest(this, '.remoterenderedcontent-reference')\n return remoterendered && remoterendered.classList.contains('fc')\n }\n\n _isFeatureCover() {\n const cover = closest(this, '.article-feature__cover')\n return !!cover\n }\n\n _updateValue() {\n this.input.value = `${this._value}`\n this.beforeElement.style.width = `${this._value}%`\n this.button.style.left = `${this._value}%`\n }\n\n _handleChange = (e) => {\n this._value = e.target.value\n this._updateValue()\n }\n\n _handleTouch = (e) => {\n const touch = e.changedTouches[0]\n const rect = this.getBoundingClientRect()\n const percent = (100 * (touch.clientX - rect.left)) / rect.width\n this._value = clamp(percent)\n this._updateValue()\n }\n\n get input() {\n return this.querySelector('input')\n }\n\n get beforeElement() {\n return this.querySelector(`.${s.before}`)\n }\n\n get button() {\n return this.querySelector(`.${s.sliderButton}`)\n }\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"scratch-before-after\":\"dhbaf__scratch-before-after--C2ete\",\"scratchBeforeAfter\":\"dhbaf__scratch-before-after--C2ete\",\"scratch-container\":\"dhbaf__scratch-container--SdAne\",\"scratchContainer\":\"dhbaf__scratch-container--SdAne\",\"visible-canvas\":\"dhbaf__visible-canvas--h1pHk\",\"visibleCanvas\":\"dhbaf__visible-canvas--h1pHk\",\"mask-canvas\":\"dhbaf__mask-canvas--eIn9P\",\"maskCanvas\":\"dhbaf__mask-canvas--eIn9P\",\"before\":\"dhbaf__before--lZkPO\",\"after\":\"dhbaf__after--k1Rmr\",\"hint\":\"dhbaf__hint--x1doH\"};","import { closest, toArray } from '@nrk/dh-basis-common'\nimport { debounce } from '../lib/utils'\nimport styles from './scratch-before-after.module.css'\n\nexport default class ScratchBeforeAfter extends HTMLElement {\n static get observedAttributes() {\n return ['lock']\n }\n\n pattern\n _revealed = false\n\n connectedCallback() {\n const debouncedUpdateCanvasWidth = debounce(this._updateCanvasWidth, { delay: 500 })\n\n if (this._isFullWidth() || this._isFeatureCover()) {\n const images = toArray(this.querySelectorAll('img'))\n images.forEach((image) => {\n image.setAttribute('sizes', '100vw')\n })\n }\n\n if ('PointerEvent' in window) {\n document.body.addEventListener('pointerdown', this._handlePointerDown)\n this.toggleButton.addEventListener('pointerdown', (e) => e.stopImmediatePropagation())\n this.scratchButton.addEventListener('pointerdown', (e) => e.stopImmediatePropagation())\n } else if ('ontouchstart' in document.documentElement) {\n document.body.addEventListener('touchstart', this._handlePointerDown)\n document.body.addEventListener('touchmove', this._preventScrollInOldTouchDevices, {\n passive: false,\n })\n this.toggleButton.addEventListener('touchstart', (e) => e.stopImmediatePropagation())\n this.scratchButton.addEventListener('touchstart', (e) => e.stopImmediatePropagation())\n } else {\n document.body.addEventListener('mousedown', this._handlePointerDown)\n this.toggleButton.addEventListener('mousedown', (e) => e.stopImmediatePropagation())\n this.scratchButton.addEventListener('mousedown', (e) => e.stopImmediatePropagation())\n }\n debouncedUpdateCanvasWidth()\n\n window.addEventListener('resize', debouncedUpdateCanvasWidth)\n this.querySelectorAll('img').forEach((img) =>\n img.addEventListener('load', debouncedUpdateCanvasWidth),\n )\n\n this.toggleButton.addEventListener('click', this._toggleLock)\n this.scratchButton.addEventListener('click', this._completeScratch)\n this.hintText.addEventListener('click', this._toggleLock)\n }\n\n disconnectedCallback() {\n this.scratchContainer.removeEventListener('pointerdown', this._handlePointerDown)\n this.toggleButton.removeEventListener('click', this._toggleLock)\n this.scratchButton.removeEventListener('click', this._completeScratch)\n this.hintText.removeEventListener('click', this._toggleLock)\n }\n\n attributeChangedCallback(name) {\n switch (name) {\n case 'lock':\n this._upadateLock()\n }\n }\n\n _preventScrollInOldTouchDevices = (e) => {\n if (!('PointerEvent' in window) && this.mode === 'paint') {\n e.preventDefault()\n }\n }\n\n _upadateLock() {\n if (this.lock) {\n this.scratchContainer.style.setProperty('touch-action', 'none')\n } else {\n this.scratchContainer.style.setProperty('touch-action', 'pan-y')\n }\n }\n\n _updateCanvasWidth = async () => {\n const canvas = this.visibleCanvas\n const images = this.images\n if (\n images.some((image) => !image.complete) ||\n canvas.offsetWidth === this._currentCanvasWidth\n ) {\n return\n }\n\n const dpr = window.devicePixelRatio\n canvas.width = canvas.offsetWidth * dpr\n canvas.height = canvas.offsetHeight * dpr\n this.visibleContext = canvas.getContext('2d')\n\n const img = this.revealElement.querySelector('img')\n const intrinsicSize = await getIntrinsicSize(img)\n this.visibleContext.drawImage(\n img,\n 0,\n 0,\n intrinsicSize.width,\n intrinsicSize.height,\n 0,\n 0,\n canvas.width,\n canvas.height,\n )\n\n this.pattern = this.visibleContext.createPattern(this.visibleCanvas, 'no-repeat')\n this.visibleContext.clearRect(0, 0, this.visibleCanvas.width, this.visibleCanvas.height)\n if (this._supportsMaskImage()) {\n const maskCanvas = this.maskCanvas\n maskCanvas.width = maskCanvas.offsetWidth\n maskCanvas.height = maskCanvas.offsetHeight\n this.maskContext = maskCanvas.getContext('2d')\n\n this.revealElement.style.webkitMaskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.maskImage = `url(${this.maskCanvas.toDataURL()})`\n }\n\n this._currentCanvasWidth = canvas.offsetWidth\n }\n\n _isFullWidth() {\n const remoterendered = closest(this, '.remoterenderedcontent-reference')\n return remoterendered && remoterendered.classList.contains('fc')\n }\n\n _isFeatureCover() {\n const cover = closest(this, '.article-feature__cover')\n return !!cover\n }\n\n _supportsMaskImage() {\n // eslint-disable-next-line compat/compat\n return (\n window?.CSS?.supports?.('mask-image: url(\"\")') ||\n window?.CSS?.supports?.('-webkit-mask-image: url(\"\")')\n )\n }\n\n _handlePointerDown = (e) => {\n const container = closest(e.target, `.${styles.scratchContainer}`)\n if (!container || !this.contains(container) || e.button === 2) {\n return\n }\n e.preventDefault()\n this.showHint = false\n this.toggleButton.style.pointerEvents = 'none'\n\n if ('PointerEvent' in window) {\n document.body.addEventListener('pointermove', this._handlePointerMove)\n document.body.addEventListener('pointerup', this._handlePointerUp)\n document.body.addEventListener('pointercancel', this._handlePointerCancel)\n } else if ('ontouchstart' in document.documentElement) {\n document.body.addEventListener('touchmove', this._handlePointerMove, { passive: false })\n document.body.addEventListener('touchend', this._handlePointerUp)\n document.body.addEventListener('touchcancel', this._handlePointerCancel)\n } else {\n document.body.addEventListener('mousemove', this._handlePointerMove)\n document.body.addEventListener('mouseup', this._handlePointerUp)\n }\n\n if (this._supportsMaskImage()) {\n this.visibleCanvas.style.transition = ''\n this.visibleCanvas.style.opacity = 1\n this.visibleContext.clearRect(0, 0, this.visibleCanvas.width, this.visibleCanvas.height)\n }\n\n this._handlePointerMove(e)\n this._handlePointerMove(e)\n }\n\n _handlePointerMove = (e) => {\n e.preventDefault()\n e.stopImmediatePropagation()\n const container = closest(e.target, `.${styles.scratchContainer}`)\n let offsetX\n let offsetY\n if (!container) {\n offsetX = -1\n offsetY = -1\n } else if ('PointerEvent' in window) {\n offsetX = e.offsetX\n offsetY = e.offsetY\n } else if ('ontouchstart' in document.documentElement) {\n offsetX = e.targetTouches[0].pageX - container.offsetLeft\n offsetY = e.targetTouches[0].pageY - container.offsetTop\n } else {\n offsetX = e.offsetX\n offsetY = e.offsetY\n }\n const dpr = window.devicePixelRatio\n this._drawLine(this.visibleContext, this.prevPos, { offsetX, offsetY }, this.pattern, dpr)\n this._drawLine(this.maskContext, this.prevPos, { offsetX, offsetY }, 'white', 1)\n this.prevPos = { offsetX, offsetY }\n }\n\n _drawLine(ctx, prevPos, nextPos, fill, dpr) {\n const innerWidth = Math.min(1200, window.innerWidth)\n const lineWidth = 40 + 0.04 * innerWidth\n const { width, height } = ctx.canvas\n\n ctx.save()\n ctx.strokeStyle = fill\n ctx.lineWidth = lineWidth * dpr\n ctx.lineCap = 'round'\n\n if (\n prevPos &&\n nextPos &&\n prevPos.offsetX > 0 &&\n prevPos.offsetX < width &&\n prevPos.offsetY > 0 &&\n prevPos.offsetY < height &&\n nextPos.offsetX > 0 &&\n nextPos.offsetX < width &&\n nextPos.offsetY > 0 &&\n nextPos.offsetY < height\n ) {\n ctx.beginPath()\n ctx.moveTo(prevPos.offsetX * dpr, prevPos.offsetY * dpr)\n ctx.lineTo(nextPos.offsetX * dpr, nextPos.offsetY * dpr)\n ctx.stroke()\n }\n ctx.restore()\n }\n\n _handlePointerOut = () => {\n delete this.prevPos\n }\n\n _handlePointerCancel = (e) => {\n this.showHint = true\n setTimeout(() => {\n this.showHint = false\n }, 10000)\n this._handlePointerUp(e)\n }\n\n _handlePointerUp = () => {\n delete this.prevPos\n\n if ('PointerEvent' in window) {\n document.body.removeEventListener('pointermove', this._handlePointerMove)\n document.body.removeEventListener('pointerup', this._handlePointerUp)\n document.body.removeEventListener('pointercancel', this._handlePointerCancel)\n } else if ('ontouchstart' in document.documentElement) {\n document.body.removeEventListener('touchmove', this._handlePointerMove, false)\n document.body.removeEventListener('touchend', this._handlePointerUp)\n document.body.removeEventListener('touchcancel', this._handlePointerCancel)\n } else {\n document.body.removeEventListener('mousemove', this._handlePointerMove)\n document.body.removeEventListener('mouseup', this._handlePointerUp)\n }\n\n if (this._supportsMaskImage()) {\n // Replace canvas with masked image\n this.revealElement.style.webkitMaskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.maskImage = `url(${this.maskCanvas.toDataURL()})`\n this.visibleCanvas.style.transition = 'opacity 350ms ease-in-out 200ms'\n this.visibleCanvas.style.opacity = 0\n this.revealElement.style.opacity = 1\n }\n this.toggleButton.style.pointerEvents = 'auto'\n this._checkRevealed()\n }\n\n _checkRevealed() {\n if (this._revealed) {\n return\n }\n const maskCanvas = this.maskCanvas\n const imageData = this.maskContext.getImageData(0, 0, maskCanvas.width, maskCanvas.height)\n\n let total = 0\n let pixels = imageData.data.length / 4\n for (let i = 0; i < pixels; i++) {\n total += imageData.data[i * 4 + 3] // alpha\n }\n const average = total / pixels\n if (average > 128) {\n this._revealed = true\n this.beforeElement.setAttribute('aria-hidden', 'true')\n this.revealElement.setAttribute('aria-hidden', 'false')\n }\n }\n\n _toggleLock = () => {\n this.showHint = false\n this.lock = !this.lock\n }\n\n _completeScratch = () => {\n console.log('Completing scratch')\n this.maskContext.save()\n this.maskContext.fillStyle = 'white'\n console.log(this.maskCanvas.width, this.maskCanvas.height)\n this.maskContext.fillRect(0, 0, this.maskCanvas.width, this.maskCanvas.height)\n this.maskContext.restore()\n this.revealElement.style.webkitMaskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.maskImage = `url(${this.maskCanvas.toDataURL()})`\n this.revealElement.style.opacity = 1\n this._checkRevealed()\n this.scratchButton.setAttribute('disabled', '')\n\n this.afterImage.focus()\n }\n\n get hintText() {\n return this.querySelector(`.${styles.hint} p`)\n }\n\n get toggleButton() {\n return this.querySelector('button[value=\"lock\"]')\n }\n\n get scratchButton() {\n return this.querySelector('button[value=\"scratch\"]')\n }\n\n get images() {\n /* eslint-disable compat/compat */\n return Array.from(this.querySelectorAll('img'))\n }\n\n get scratchContainer() {\n return this.querySelector(`.${styles.scratchContainer}`)\n }\n\n get visibleCanvas() {\n return this.querySelector(`.${styles.visibleCanvas}`)\n }\n\n get maskCanvas() {\n return this.querySelector(`.${styles.maskCanvas}`)\n }\n\n get beforeElement() {\n return this.querySelector(`.${styles.before}`)\n }\n\n get revealElement() {\n return this.querySelector(`.${styles.after}`)\n }\n\n get afterImage() {\n return this.querySelector(`.${styles.after} img`)\n }\n\n get lock() {\n return this.hasAttribute('lock')\n }\n\n set lock(val) {\n const lock = JSON.parse(val)\n if (lock) {\n this.setAttribute('lock', '')\n } else {\n this.removeAttribute('lock')\n }\n }\n\n set showHint(val) {\n if (val) {\n this.setAttribute('show-hint', '')\n } else {\n this.removeAttribute('show-hint')\n }\n }\n\n get showHint() {\n return this.hasAttribute('show-hint')\n }\n}\n\n/*\n * Can not get image intrinsic values directly from naturalWidth and naturalHeight due to\n * https://bugs.chromium.org/p/chromium/issues/detail?id=760612&q=naturalWidth&can=2\n *\n *\n * */\nfunction getIntrinsicSize(img) {\n // eslint-disable-next-line compat/compat\n return new Promise((resolve, reject) => {\n const image = new Image()\n image.onload = () => {\n resolve({ width: image.width, height: image.height })\n }\n image.onerror = reject\n image.src = img.currentSrc || img.src\n })\n}\n","export function debounce(callback, options) {\n let timeoutID\n let lastExec = 0\n\n function wrapper(...args) {\n var self = this\n var elapsed = Number(new Date()) - lastExec\n\n function exec() {\n lastExec = Number(new Date())\n callback.apply(self, args)\n }\n\n function clear() {\n timeoutID = undefined\n }\n\n if (options.debounceMode && !timeoutID) {\n exec()\n }\n if (timeoutID) {\n clearTimeout(timeoutID)\n }\n\n if (options.debounceMode === undefined && elapsed > options.delay) {\n exec()\n } else if (options.noTrailing !== true) {\n timeoutID = setTimeout(\n options.debounceMode ? clear : exec,\n options.debounceMode === undefined ? options.delay - elapsed : options.delay,\n )\n }\n }\n return wrapper\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"root\":\"dhbaf__root--tuh_u\"};","import { getElementTag } from '@nrk/dh-server-libs/get-element-tag'\nimport BeforeAfter from './components/before-after'\nimport ScratchBeforeAfter from './components/scratch-before-after'\nimport './client.module.css'\nimport './components/before-after.module.css'\nimport './components/scratch-before-after.module.css'\n\nconst tag = getElementTag(__APP_NAME__, __APP_VERSION__)\n\nfunction safeDefine(elementName, constructor) {\n if (typeof customElements.get(elementName) === 'undefined') {\n customElements.define(elementName, constructor)\n }\n}\n\nclass AppElement extends HTMLElement {\n connectedCallback() {\n safeDefine('dh-before-after', BeforeAfter)\n safeDefine('dh-scratch-before-after', ScratchBeforeAfter)\n }\n}\n\nif (!customElements.get(tag)) {\n customElements.define(tag, AppElement)\n}\n"],"names":["module","exports","getElementTag","name","version","split","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","proto","match","closest","window","Element","prototype","matches","msMatchesSelector","webkitMatchesSelector","el","css","parentElement","call","toArray","nodeList","slice","BeforeAfter","HTMLElement","constructor","args","_value","_handleChange","e","this","target","value","_updateValue","_handleTouch","touch","changedTouches","rect","getBoundingClientRect","percent","clientX","left","width","Math","max","min","connectedCallback","input","addEventListener","_isTouchDevice","_isFullWidth","_isFeatureCover","querySelectorAll","forEach","image","setAttribute","disconnectedCallback","removeEventListener","document","documentElement","remoterendered","classList","contains","beforeElement","style","button","querySelector","s","ScratchBeforeAfter","pattern","_revealed","_preventScrollInOldTouchDevices","mode","preventDefault","_updateCanvasWidth","async","canvas","visibleCanvas","images","some","complete","offsetWidth","_currentCanvasWidth","dpr","devicePixelRatio","height","offsetHeight","visibleContext","getContext","img","revealElement","intrinsicSize","Promise","resolve","reject","Image","onload","onerror","src","currentSrc","getIntrinsicSize","drawImage","createPattern","clearRect","_supportsMaskImage","maskCanvas","maskContext","webkitMaskImage","toDataURL","maskImage","_handlePointerDown","container","styles","showHint","toggleButton","pointerEvents","body","_handlePointerMove","_handlePointerUp","_handlePointerCancel","passive","transition","opacity","stopImmediatePropagation","offsetX","offsetY","targetTouches","pageX","offsetLeft","pageY","offsetTop","_drawLine","prevPos","_handlePointerOut","setTimeout","_checkRevealed","_toggleLock","lock","_completeScratch","console","log","save","fillStyle","fillRect","restore","scratchButton","afterImage","focus","observedAttributes","debouncedUpdateCanvasWidth","callback","options","timeoutID","lastExec","self","elapsed","Number","Date","exec","apply","debounceMode","clearTimeout","delay","noTrailing","debounce","hintText","scratchContainer","attributeChangedCallback","_upadateLock","setProperty","_window","_window2","CSS","supports","ctx","nextPos","fill","lineWidth","innerWidth","strokeStyle","lineCap","beginPath","moveTo","lineTo","stroke","imageData","getImageData","total","pixels","data","length","i","Array","from","hasAttribute","val","JSON","parse","removeAttribute","tag","__APP_NAME__","__APP_VERSION__","safeDefine","elementName","customElements","get","define","AppElement"],"sourceRoot":""}