{"version":3,"sources":["../src/atropos.js"],"names":["$","el","sel","querySelector","removeUndefinedProps","obj","result","Object","keys","forEach","key","originalParams","rotateEl","scaleEl","innerEl","elBoundingClientRect","eventsElBoundingClientRect","shadowEl","highlightEl","isScrolling","clientXStart","clientYStart","queueFrameId","_originalParams","eventsEl","self","__atropos__","params","_extends","alwaysActive","activeOffset","shadowOffset","shadowScale","duration","rotate","rotateTouch","rotateXMax","rotateYMax","rotateXInvert","rotateYInvert","stretchX","stretchY","stretchZ","commonOrigin","shadow","highlight","onEnter","onLeave","onRotate","destroyed","isActive","queue","purgeQueue","requestAnimationFrame","data","element","prop","value","style","splice","length","created","$setDuration","push","$setEasing","$setTransform","$setOpacity","$on","event","handler","props","addEventListener","$off","removeEventListener","setChildrenOffset","_ref","_ref$rotateXPercentag","rotateXPercentage","_ref$rotateYPercentag","rotateYPercentage","opacityOnly","easeOut","querySelectorAll","$$","childEl","elementOpacity","dataset","atroposOpacity","split","map","v","parseFloat","getOpacity","childElOffset","atroposOffset","Number","isNaN","min","max","rotatePercentage","Math","abs","setElements","clientX","clientY","isMultiple","getBoundingClientRect","rect","left","width","top","height","transformOrigin","rotateX","rotateY","_elBoundingClientRect","_eventsElBoundingClie","parentTop","parentLeft","parentWidth","parentHeight","centerX","centerY","coordX","coordY","activate","classList","add","onPointerEnter","e","undefined","type","pointerType","preventDefault","onTouchMove","cancelable","onPointerMove","diffX","diffY","touchAngle","atan2","PI","onPointerLeave","remove","onDocumentClick","clickTarget","target","contains","destroy","cancelAnimationFrame","document","assign","createElement","appendChild","createHighlight"],"mappings":"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","file":"atropos.min.js","sourcesContent":["/* eslint-disable no-restricted-globals */\nconst $ = (el, sel) => el.querySelector(sel);\nconst $$ = (el, sel) => el.querySelectorAll(sel);\n\nconst removeUndefinedProps = (obj = {}) => {\n const result = {};\n Object.keys(obj).forEach((key) => {\n if (typeof obj[key] !== 'undefined') result[key] = obj[key];\n });\n return result;\n};\n\nfunction Atropos(originalParams = {}) {\n let { el, eventsEl } = originalParams;\n\n const self = {\n __atropos__: true,\n params: {\n alwaysActive: false,\n activeOffset: 50,\n shadowOffset: 50,\n shadowScale: 1,\n duration: 300,\n rotate: true,\n rotateTouch: true,\n rotateXMax: 15,\n rotateYMax: 15,\n rotateXInvert: false,\n rotateYInvert: false,\n stretchX: 0,\n stretchY: 0,\n stretchZ: 0,\n commonOrigin: true,\n shadow: true,\n highlight: true,\n onEnter: null,\n onLeave: null,\n onRotate: null,\n ...removeUndefinedProps(originalParams || {}),\n },\n destroyed: false,\n isActive: false,\n };\n\n const { params } = self;\n\n let rotateEl;\n let scaleEl;\n let innerEl;\n\n let elBoundingClientRect;\n let eventsElBoundingClientRect;\n\n let shadowEl;\n let highlightEl;\n\n let isScrolling;\n let clientXStart;\n let clientYStart;\n\n const queue = [];\n let queueFrameId;\n const purgeQueue = () => {\n queueFrameId = requestAnimationFrame(() => {\n queue.forEach((data) => {\n if (typeof data === 'function') {\n data();\n } else {\n const { element, prop, value } = data;\n element.style[prop] = value;\n }\n });\n queue.splice(0, queue.length);\n purgeQueue();\n });\n };\n purgeQueue();\n\n const $setDuration = (element, value) => {\n queue.push({ element, prop: 'transitionDuration', value });\n };\n const $setEasing = (element, value) => {\n queue.push({ element, prop: 'transitionTimingFunction', value });\n };\n const $setTransform = (element, value) => {\n queue.push({ element, prop: 'transform', value });\n };\n const $setOpacity = (element, value) => {\n queue.push({ element, prop: 'opacity', value });\n };\n const $setOrigin = (element, value) => {\n queue.push({ element, prop: 'transformOrigin', value });\n };\n const $on = (element, event, handler, props) => element.addEventListener(event, handler, props);\n const $off = (element, event, handler, props) =>\n element.removeEventListener(event, handler, props);\n\n const createShadow = () => {\n let created;\n shadowEl = $(el, '.atropos-shadow');\n if (!shadowEl) {\n shadowEl = document.createElement('span');\n shadowEl.classList.add('atropos-shadow');\n created = true;\n }\n $setTransform(\n shadowEl,\n `translate3d(0,0,-${params.shadowOffset}px) scale(${params.shadowScale})`,\n );\n if (created) {\n rotateEl.appendChild(shadowEl);\n }\n };\n const createHighlight = () => {\n let created;\n highlightEl = $(el, '.atropos-highlight');\n if (!highlightEl) {\n highlightEl = document.createElement('span');\n highlightEl.classList.add('atropos-highlight');\n created = true;\n }\n\n $setTransform(highlightEl, `translate3d(0,0,0)`);\n if (created) {\n innerEl.appendChild(highlightEl);\n }\n };\n\n const setChildrenOffset = ({\n rotateXPercentage = 0,\n rotateYPercentage = 0,\n duration,\n opacityOnly,\n easeOut,\n }) => {\n const getOpacity = (element) => {\n if (element.dataset.atroposOpacity && typeof element.dataset.atroposOpacity === 'string') {\n return element.dataset.atroposOpacity.split(';').map((v) => parseFloat(v));\n }\n return undefined;\n };\n $$(el, '[data-atropos-offset], [data-atropos-opacity]').forEach((childEl) => {\n $setDuration(childEl, duration);\n $setEasing(childEl, easeOut ? 'ease-out' : '');\n const elementOpacity = getOpacity(childEl);\n if (rotateXPercentage === 0 && rotateYPercentage === 0) {\n if (!opacityOnly) $setTransform(childEl, `translate3d(0, 0, 0)`);\n if (elementOpacity) $setOpacity(childEl, elementOpacity[0]);\n } else {\n const childElOffset = parseFloat(childEl.dataset.atroposOffset) / 100;\n if (!Number.isNaN(childElOffset) && !opacityOnly) {\n $setTransform(\n childEl,\n `translate3d(${-rotateYPercentage * -childElOffset}%, ${\n rotateXPercentage * -childElOffset\n }%, 0)`,\n );\n }\n if (elementOpacity) {\n const [min, max] = elementOpacity;\n const rotatePercentage = Math.max(\n Math.abs(rotateXPercentage),\n Math.abs(rotateYPercentage),\n );\n $setOpacity(childEl, min + ((max - min) * rotatePercentage) / 100);\n }\n }\n });\n };\n\n const setElements = (clientX, clientY) => {\n const isMultiple = el !== eventsEl;\n if (!elBoundingClientRect) {\n elBoundingClientRect = el.getBoundingClientRect();\n }\n if (isMultiple && !eventsElBoundingClientRect) {\n eventsElBoundingClientRect = eventsEl.getBoundingClientRect();\n }\n if (typeof clientX === 'undefined' && typeof clientY === 'undefined') {\n const rect = isMultiple ? eventsElBoundingClientRect : elBoundingClientRect;\n clientX = rect.left + rect.width / 2;\n clientY = rect.top + rect.height / 2;\n }\n\n let rotateX = 0;\n let rotateY = 0;\n const { top, left, width, height } = elBoundingClientRect;\n let transformOrigin;\n if (!isMultiple) {\n const centerX = width / 2;\n const centerY = height / 2;\n\n const coordX = clientX - left;\n const coordY = clientY - top;\n\n rotateY = ((params.rotateYMax * (coordX - centerX)) / (width / 2)) * -1;\n rotateX = (params.rotateXMax * (coordY - centerY)) / (height / 2);\n } else {\n const {\n top: parentTop,\n left: parentLeft,\n width: parentWidth,\n height: parentHeight,\n } = eventsElBoundingClientRect;\n const offsetLeft = left - parentLeft;\n const offsetTop = top - parentTop;\n\n const centerX = width / 2 + offsetLeft;\n const centerY = height / 2 + offsetTop;\n\n const coordX = clientX - parentLeft;\n const coordY = clientY - parentTop;\n\n rotateY = ((params.rotateYMax * (coordX - centerX)) / (parentWidth - width / 2)) * -1;\n rotateX = (params.rotateXMax * (coordY - centerY)) / (parentHeight - height / 2);\n transformOrigin = `${clientX - left}px ${clientY - top}px`;\n }\n\n rotateX = Math.min(Math.max(-rotateX, -params.rotateXMax), params.rotateXMax);\n if (params.rotateXInvert) rotateX = -rotateX;\n rotateY = Math.min(Math.max(-rotateY, -params.rotateYMax), params.rotateYMax);\n if (params.rotateYInvert) rotateY = -rotateY;\n\n const rotateXPercentage = (rotateX / params.rotateXMax) * 100;\n const rotateYPercentage = (rotateY / params.rotateYMax) * 100;\n\n const stretchX =\n (isMultiple ? (rotateYPercentage / 100) * params.stretchX : 0) *\n (params.rotateYInvert ? -1 : 1);\n const stretchY =\n (isMultiple ? (rotateXPercentage / 100) * params.stretchY : 0) *\n (params.rotateXInvert ? -1 : 1);\n const stretchZ = isMultiple\n ? (Math.max(Math.abs(rotateXPercentage), Math.abs(rotateYPercentage)) / 100) * params.stretchZ\n : 0;\n $setTransform(\n rotateEl,\n `translate3d(${stretchX}%, ${-stretchY}%, ${-stretchZ}px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`,\n );\n if (transformOrigin && params.commonOrigin) {\n $setOrigin(rotateEl, transformOrigin);\n }\n\n if (highlightEl) {\n $setDuration(highlightEl, `${params.duration}ms`);\n $setEasing(highlightEl, 'ease-out');\n $setTransform(\n highlightEl,\n `translate3d(${-rotateYPercentage * 0.25}%, ${rotateXPercentage * 0.25}%, 0)`,\n );\n $setOpacity(\n highlightEl,\n Math.max(Math.abs(rotateXPercentage), Math.abs(rotateYPercentage)) / 100,\n );\n }\n\n setChildrenOffset({\n rotateXPercentage,\n rotateYPercentage,\n duration: `${params.duration}ms`,\n easeOut: true,\n });\n\n if (typeof params.onRotate === 'function') params.onRotate(rotateX, rotateY);\n };\n\n const activate = () => {\n queue.push(() => el.classList.add('atropos-active'));\n $setDuration(rotateEl, `${params.duration}ms`);\n $setEasing(rotateEl, 'ease-out');\n $setTransform(scaleEl, `translate3d(0,0, ${params.activeOffset}px)`);\n $setDuration(scaleEl, `${params.duration}ms`);\n $setEasing(scaleEl, 'ease-out');\n if (shadowEl) {\n $setDuration(shadowEl, `${params.duration}ms`);\n $setEasing(shadowEl, 'ease-out');\n }\n\n self.isActive = true;\n };\n\n const onPointerEnter = (e) => {\n isScrolling = undefined;\n if (e.type === 'pointerdown' && e.pointerType === 'mouse') return;\n if (e.type === 'pointerenter' && e.pointerType !== 'mouse') return;\n if (e.type === 'pointerdown') {\n e.preventDefault();\n }\n clientXStart = e.clientX;\n clientYStart = e.clientY;\n\n if (params.alwaysActive) {\n elBoundingClientRect = undefined;\n eventsElBoundingClientRect = undefined;\n return;\n }\n activate();\n if (typeof params.onEnter === 'function') params.onEnter();\n };\n\n const onTouchMove = (e) => {\n if (isScrolling === false && e.cancelable) {\n e.preventDefault();\n }\n };\n\n const onPointerMove = (e) => {\n if (!params.rotate || !self.isActive) return;\n if (e.pointerType !== 'mouse') {\n if (!params.rotateTouch) return;\n e.preventDefault();\n }\n const { clientX, clientY } = e;\n\n const diffX = clientX - clientXStart;\n const diffY = clientY - clientYStart;\n if (\n typeof params.rotateTouch === 'string' &&\n (diffX !== 0 || diffY !== 0) &&\n typeof isScrolling === 'undefined'\n ) {\n if (diffX * diffX + diffY * diffY >= 25) {\n const touchAngle = (Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180) / Math.PI;\n isScrolling = params.rotateTouch === 'scroll-y' ? touchAngle > 45 : 90 - touchAngle > 45;\n }\n if (isScrolling === false) {\n el.classList.add('atropos-rotate-touch');\n if (e.cancelable) {\n e.preventDefault();\n }\n }\n }\n if (e.pointerType !== 'mouse' && isScrolling) {\n return;\n }\n setElements(clientX, clientY);\n };\n\n const onPointerLeave = (e) => {\n elBoundingClientRect = undefined;\n eventsElBoundingClientRect = undefined;\n if (!self.isActive) return;\n if (e && e.type === 'pointerup' && e.pointerType === 'mouse') return;\n if (e && e.type === 'pointerleave' && e.pointerType !== 'mouse') return;\n if (typeof params.rotateTouch === 'string' && isScrolling) {\n el.classList.remove('atropos-rotate-touch');\n }\n\n if (params.alwaysActive) {\n setElements();\n if (typeof params.onRotate === 'function') params.onRotate(0, 0);\n if (typeof params.onLeave === 'function') params.onLeave();\n return;\n }\n\n queue.push(() => el.classList.remove('atropos-active'));\n $setDuration(scaleEl, `${params.duration}ms`);\n $setEasing(scaleEl, '');\n $setTransform(scaleEl, `translate3d(0,0, ${0}px)`);\n if (shadowEl) {\n $setDuration(shadowEl, `${params.duration}ms`);\n $setEasing(shadowEl, '');\n }\n if (highlightEl) {\n $setDuration(highlightEl, `${params.duration}ms`);\n $setEasing(highlightEl, '');\n $setTransform(highlightEl, `translate3d(0, 0, 0)`);\n $setOpacity(highlightEl, 0);\n }\n $setDuration(rotateEl, `${params.duration}ms`);\n $setEasing(rotateEl, '');\n $setTransform(rotateEl, `translate3d(0,0,0) rotateX(0deg) rotateY(0deg)`);\n\n setChildrenOffset({ duration: `${params.duration}ms` });\n\n self.isActive = false;\n if (typeof params.onRotate === 'function') params.onRotate(0, 0);\n if (typeof params.onLeave === 'function') params.onLeave();\n };\n\n const onDocumentClick = (e) => {\n const clickTarget = e.target;\n if (!eventsEl.contains(clickTarget) && clickTarget !== eventsEl && self.isActive) {\n onPointerLeave();\n }\n };\n\n const initDOM = () => {\n if (typeof el === 'string') {\n el = $(document, el);\n }\n if (!el) return;\n\n // eslint-disable-next-line\n if (el.__atropos__) return;\n\n if (typeof eventsEl !== 'undefined') {\n if (typeof eventsEl === 'string') {\n eventsEl = $(document, eventsEl);\n }\n } else {\n eventsEl = el;\n }\n\n Object.assign(self, {\n el,\n });\n\n rotateEl = $(el, '.atropos-rotate');\n scaleEl = $(el, '.atropos-scale');\n innerEl = $(el, '.atropos-inner');\n\n // eslint-disable-next-line\n el.__atropos__ = self;\n };\n\n const init = () => {\n initDOM();\n if (!el || !eventsEl) return;\n if (params.shadow) {\n createShadow();\n }\n if (params.highlight) {\n createHighlight();\n }\n if (params.rotateTouch) {\n if (typeof params.rotateTouch === 'string') {\n el.classList.add(`atropos-rotate-touch-${params.rotateTouch}`);\n } else {\n el.classList.add('atropos-rotate-touch');\n }\n }\n if ($(el, '[data-atropos-opacity]')) {\n setChildrenOffset({ opacityOnly: true });\n }\n $on(document, 'click', onDocumentClick);\n $on(eventsEl, 'pointerdown', onPointerEnter);\n $on(eventsEl, 'pointerenter', onPointerEnter);\n $on(eventsEl, 'pointermove', onPointerMove);\n $on(eventsEl, 'touchmove', onTouchMove);\n $on(eventsEl, 'pointerleave', onPointerLeave);\n $on(eventsEl, 'pointerup', onPointerLeave);\n $on(eventsEl, 'lostpointercapture', onPointerLeave);\n\n if (params.alwaysActive) {\n activate();\n setElements();\n }\n };\n\n const destroy = () => {\n self.destroyed = true;\n cancelAnimationFrame(queueFrameId);\n $off(document, 'click', onDocumentClick);\n $off(eventsEl, 'pointerdown', onPointerEnter);\n $off(eventsEl, 'pointerenter', onPointerEnter);\n $off(eventsEl, 'pointermove', onPointerMove);\n $off(eventsEl, 'touchmove', onTouchMove);\n $off(eventsEl, 'pointerleave', onPointerLeave);\n $off(eventsEl, 'pointerup', onPointerLeave);\n $off(eventsEl, 'lostpointercapture', onPointerLeave);\n // eslint-disable-next-line\n delete el.__atropos__;\n };\n\n self.destroy = destroy;\n\n init();\n\n // eslint-disable-next-line\n return self;\n}\nexport { Atropos };\nexport default Atropos;\n"]}