{"mappings":"AAIA,IAAIA,gBACAC,gBAAiB,EACjBC,wBAA0B,EAC9B,MAAMC,gBAAkB,GAClBC,kBAAoB,IACpBC,aAAe,EAErB,IAAIC,uBAAyB,KAEzBC,cAAgB,KAChBC,UAAY,EAEhB,SAASC,QACPT,gBAAkBU,SAASC,cAAc,oBAEzCJ,cAAgB,IAAIK,KACpBC,OAAOC,sBAAsBC,QAE7Bf,gBAAgBgB,iBAAiB,YAAaC,aAC9CjB,gBAAgBgB,iBAAiB,aAAcE,cAC/ClB,gBAAgBgB,iBAAiB,aAAcG,aACjD,CAEA,SAASF,YAAYG,GACnBd,uBAAyBc,EAAEC,QAAUrB,gBAAgBsB,WACvD,CAEA,SAASJ,aAAaE,GACpBd,uBAAyBc,EAAEC,QAAUrB,gBAAgBsB,WACvD,CAEA,SAASH,aAAaC,GACpBd,uBAAyB,IAC3B,CAEA,SAASS,SACP,MAAMQ,EAAM,IAAIX,KAChBJ,WAAae,EAAMhB,eAAiB,IAEN,MAA1BD,uBACEN,gBAAgBsB,YAAc,KAEhCE,kBAGFC,mBAGFlB,cAAgBgB,EAChBV,OAAOC,sBAAsBC,OAC/B,CAEA,SAASU,mBACP,MAAMC,EAAW1B,gBAAgB2B,WAG7BD,EAAW1B,gBAAgBsB,YAAcjB,cACxCL,gBAAgB4B,cAEnB3B,gBAAiB,GAIfyB,EAAWrB,cAAgB,IAC7BJ,gBAAiB,GAKnB4B,eADa5B,eAAiB,GAAI,GACbE,gBACvB,CAEA,SAASqB,kBACHlB,wBAA0B,KAC5BuB,cAAcC,MACX1B,kBACD,EACAE,uBAAyB,MAIzBA,wBAA0B,KAC5BuB,cAAcC,KACZ,EACA1B,mBACCE,uBAAyB,KAAQ,KAGxC,CAEA,SAASwB,KAAKC,EAAGC,EAAGC,GAClB,OAAQ,EAAIA,GAAKF,EAAIE,EAAID,CAC3B,CAEA,SAASH,cAAcK,GAErB,IAAIC,EADanC,gBAAgB2B,WACCO,EAAQ1B,UAAYN,wBAClDkC,EAAiBC,KAAKC,MAAMH,GAChCjC,wBAA0BiC,EAAmBC,EAC7CpC,gBAAgBuC,SAASH,EAAgB,EAC3C,CAEAvB,OAAOG,iBAAiB,OAAQP","sources":["src/assets/index/index.js"],"sourcesContent":["////////////////////////////////\n// Showcase section scrolling //\n////////////////////////////////\n\nlet showcaseElement;\nlet scrollingRight = true;\nlet positionCumulativeError = 0;\nconst autoScrollSpeed = 20; // px/sec\nconst manualScrollSpeed = 1000;\nconst bounceMargin = 5; // px\n\nlet mouseRelativePositionX = null\n\nlet lastFrameDate = null;\nlet deltaTime = 0.0; // seconds\n\nfunction start() {\n showcaseElement = document.querySelector(\"section.showcase\");\n \n lastFrameDate = new Date();\n window.requestAnimationFrame(update);\n\n showcaseElement.addEventListener(\"mousemove\", onMouseMove);\n showcaseElement.addEventListener(\"mouseenter\", onMouseEnter);\n showcaseElement.addEventListener(\"mouseleave\", onMouseLeave);\n}\n\nfunction onMouseMove(e) {\n mouseRelativePositionX = e.clientX / showcaseElement.clientWidth\n}\n\nfunction onMouseEnter(e) {\n mouseRelativePositionX = e.clientX / showcaseElement.clientWidth\n}\n\nfunction onMouseLeave(e) {\n mouseRelativePositionX = null\n}\n\nfunction update() {\n const now = new Date();\n deltaTime = (now - lastFrameDate) / 1000; // ms to seconds\n\n if (mouseRelativePositionX != null) {\n if (showcaseElement.clientWidth > 950 /* breakpoint mobile */) {\n // desktop only\n animateCursorIn();\n }\n } else {\n animateCursorOut();\n }\n\n lastFrameDate = now;\n window.requestAnimationFrame(update);\n}\n\nfunction animateCursorOut() {\n const position = showcaseElement.scrollLeft;\n\n // bounce right\n if (position + showcaseElement.clientWidth + bounceMargin\n >= showcaseElement.scrollWidth\n ) {\n scrollingRight = false;\n }\n\n // bounce left\n if (position - bounceMargin <= 0) {\n scrollingRight = true;\n }\n\n // scroll\n const sign = scrollingRight ? 1 : -1;\n scrollAtSpeed(sign * autoScrollSpeed);\n}\n\nfunction animateCursorIn() {\n if (mouseRelativePositionX <= 0.25) {\n scrollAtSpeed(lerp(\n -manualScrollSpeed,\n 0,\n mouseRelativePositionX / 0.25\n ))\n }\n\n if (mouseRelativePositionX >= 0.75) {\n scrollAtSpeed(lerp(\n 0,\n manualScrollSpeed,\n (mouseRelativePositionX - 0.75) / 0.25\n ))\n }\n}\n\nfunction lerp(a, b, t) {\n return (1 - t) * a + t * b;\n}\n\nfunction scrollAtSpeed(speed) {\n const position = showcaseElement.scrollLeft;\n let newPositionFloat = position + speed * deltaTime + positionCumulativeError;\n let newPositionInt = Math.floor(newPositionFloat);\n positionCumulativeError = newPositionFloat - newPositionInt;\n showcaseElement.scrollTo(newPositionInt, 0);\n}\n\nwindow.addEventListener(\"load\", start);\n"],"names":["showcaseElement","scrollingRight","positionCumulativeError","autoScrollSpeed","manualScrollSpeed","bounceMargin","mouseRelativePositionX","lastFrameDate","deltaTime","start","document","querySelector","Date","window","requestAnimationFrame","update","addEventListener","onMouseMove","onMouseEnter","onMouseLeave","e","clientX","clientWidth","now","animateCursorIn","animateCursorOut","position","scrollLeft","scrollWidth","scrollAtSpeed","lerp","a","b","t","speed","newPositionFloat","newPositionInt","Math","floor","scrollTo"],"version":3,"file":"index.9a73a56c.js.map"}