{"version":3,"sources":["canvas.js"],"names":["lerp","start","end","amt","Particle","_classCallCheck","this","x","y","Canvas","mediaQuery","window","matchMedia","motion","matches","_this","addEventListener","width","canvas","parentNode","offsetWidth","height","offsetHeight","CanvasMouse","target","_this2","_possibleConstructorReturn","_getPrototypeOf","call","document","querySelector","c","getContext","img","Image","imgSize","count","mX","mY","delay","isHover","isIDLE","visible","opacity","src","onload","init","classList","add","i","p","particles","push","draw","onMouseMove","onWindowScroll","_get","prototype","_this3","noiseX","noise","simplex2","Date","now","noiseY","globalCompositeOperation","nextP","requestAnimationFrame","_this4","pos","getBoundingClientRect","top","clearRect","innerHeight","bottom","setTimeout","scrollTo","scrollX","scrollY","timer","_this5","clearTimeout","e","CanvasScroll","version","_this6","parent","setSize","gapX","posX","posY","angle","offsetX","offsetY","style","concat","onWindowResize","_this7","forEach","progress","index","gapY","cX","cY","save","translate","rotate","Math","PI","_this8","percent","_this9"],"mappings":"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","file":"canvas.min.js","sourcesContent":["/* eslint-disable no-unused-vars */\n/* eslint-disable no-param-reassign */\n/* eslint-disable no-new */\n/* eslint-disable no-undef */\n\nfunction lerp(start, end, amt) {\n return (1 - amt) * start + amt * end;\n}\n\nclass Particle {\n constructor() {\n this.x = 0;\n this.y = 0;\n }\n}\n\nclass Canvas {\n constructor() {\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n this.motion = !mediaQuery.matches;\n }\n\n onWindowResize() {\n window.addEventListener('resize', () => {\n if (this.motion) {\n this.width = this.canvas.parentNode.offsetWidth;\n this.height = this.canvas.parentNode.offsetHeight;\n\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n }\n });\n }\n}\n\nclass CanvasMouse extends Canvas {\n constructor(target) {\n super();\n this.canvas = document.querySelector(target);\n this.c = this.canvas.getContext('2d'); // context\n\n if (this.motion) {\n this.width = this.canvas.parentNode.offsetWidth;\n this.height = this.canvas.parentNode.offsetHeight;\n this.img = new Image();\n this.imgSize = this.width > 768 ? 100 : 80;\n\n this.count = this.width > 768 ? 45 : 20;\n this.particles = [];\n\n this.mX = 0;\n this.mY = 0;\n this.delay = this.width > 768 ? 0.65 : 0.45;\n this.isHover = false;\n this.isIDLE = false;\n this.visible = true;\n this.opacity = 1;\n\n this.img.src = './assets/images/canvas/canvas-logo.png';\n this.img.onload = () => {\n this.init();\n };\n } else {\n this.canvas.parentNode.classList.add('no-motion');\n }\n }\n\n init() {\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n\n for (let i = 0; i < this.count; i += 1) {\n const p = new Particle();\n p.x = this.width / 2 - this.imgSize / 2;\n p.y = this.height / 2 - this.imgSize / 2;\n\n this.particles.push(p);\n }\n\n this.draw();\n this.onMouseMove();\n this.onWindowScroll();\n super.onWindowResize();\n }\n\n draw() {\n if (this.visible) {\n this.c.clearRect(0, 0, this.width, this.height);\n\n\n if (!this.isIDLE && this.opacity <= 1) {\n this.opacity += 0.1;\n }\n\n if (this.isIDLE && this.opacity > 0) {\n this.opacity -= 0.1;\n }\n\n this.c.globalAlpha = this.opacity;\n\n let x;\n let y;\n\n if (this.isHover) {\n x = this.mX;\n y = this.mY;\n } else {\n const speed = 0.0004;\n const noiseX = (noise.simplex2(0, Date.now() * speed) + 1) / 2;\n const noiseY = (noise.simplex2(1, Date.now() * speed) + 1) / 2;\n x = noiseX * this.width;\n y = noiseY * this.height;\n }\n\n this.particles.forEach((p, index) => {\n const nextP = this.particles[index + 1] || this.particles[0];\n\n p.x = x;\n p.y = y;\n\n this.c.globalCompositeOperation = 'destination-over';\n this.c.drawImage(this.img, p.x, p.y, this.imgSize, this.imgSize);\n\n x = lerp(nextP.x, p.x, this.delay);\n y = lerp(nextP.y, p.y, this.delay);\n });\n }\n\n requestAnimationFrame(() => this.draw());\n }\n\n onWindowScroll() {\n window.addEventListener('scroll', () => {\n const parent = this.canvas;\n const pos = parent.getBoundingClientRect();\n\n if (pos.top < window.innerHeight && pos.bottom >= 0) {\n this.visible = true;\n } else {\n this.visible = false;\n }\n });\n\n setTimeout(() => {\n window.scrollTo(window.scrollX, window.scrollY - 1);\n window.scrollTo(window.scrollX, window.scrollY + 1);\n }, 120);\n }\n\n onMouseMove() {\n let timer;\n\n this.canvas.addEventListener('mouseenter', () => {\n this.isHover = true;\n this.isIDLE = false;\n\n clearTimeout(timer);\n });\n\n this.canvas.addEventListener('mouseleave', () => {\n this.isIDLE = true;\n\n timer = setTimeout(() => {\n this.isHover = false;\n this.isIDLE = false;\n }, 600);\n });\n\n this.canvas.addEventListener('mousemove', (e) => {\n this.mX = (e.offsetX) - (this.imgSize / 2);\n this.mY = (e.offsetY) - (this.imgSize / 2);\n this.isHover = true;\n this.isIDLE = false;\n });\n }\n}\n\nclass CanvasScroll extends Canvas {\n constructor(target, version) {\n super();\n this.canvas = document.querySelector(target);\n this.c = this.canvas.getContext('2d'); // context\n this.particles = [];\n this.progress = 0;\n this.visible = true;\n this.version = version;\n\n if (this.motion) {\n this.setSize();\n this.img = new Image();\n this.img.src = './assets/images/canvas/canvas-logo-white.svg';\n this.img.onload = () => {\n this.init();\n };\n } else {\n this.canvas.parentNode.classList.add('no-motion');\n }\n }\n\n\n setSize() {\n this.width = this.canvas.parentNode.offsetWidth;\n this.height = this.canvas.parentNode.offsetWidth;\n this.imgSize = this.width > 768 ? this.width / 3 : this.width / 3.5;\n\n this.count = this.width > 768 ? 40 : 20;\n this.gapX = this.width > 768 ? 12 : 8;\n this.gapY = this.width > 768 ? 0.65 : 0.45;\n\n this.posX = this.width - this.imgSize * 1.2;\n this.posY = this.height - this.imgSize;\n\n this.angle = 45;\n\n this.canvas.width = this.width;\n this.canvas.height = this.width;\n\n if (this.version === 2) {\n this.count = this.width > 768 ? 35 : 15;\n this.posX = this.width * 0.06 - this.imgSize;\n this.posY = this.height * 0.64 - this.imgSize;\n }\n\n if (this.version === 3) {\n this.count = this.width > 768 ? 35 : 15;\n this.posX = this.width - this.imgSize * 1.1;\n this.posX = this.width > 768 ? this.width - this.imgSize * 1.1 : this.width - this.imgSize * 1.6;\n this.posY = this.height - this.imgSize * 1.2;\n this.posY = this.width > 768 ? this.height - this.imgSize * 1.2 : this.height - this.imgSize * 1.6;\n }\n\n\n this.canvas.parentNode.style.height = `${this.canvas.parentNode.offsetWidth}px`;\n }\n\n init() {\n for (let i = 0; i < this.count; i += 1) {\n const p = new Particle();\n this.particles.push(p);\n }\n\n this.draw();\n this.onWindowResize();\n this.onWindowScroll();\n }\n\n draw() {\n if (this.visible) {\n this.c.clearRect(0, 0, this.width, this.height);\n\n this.particles.forEach((p, i) => {\n const index = i * this.progress;\n let x = this.posX - index * this.gapX;\n let y = this.posY - index * this.gapY;\n\n if (this.version === 3) {\n x = this.posX + index * this.gapX;\n y = this.posY + index * this.gapY;\n }\n\n\n const cX = x + (this.imgSize / 2);\n const cY = y + (this.imgSize / 2);\n\n p.x = cX - this.width;\n p.y = cY - this.height;\n\n if (this.version === 2) {\n p.x = cX - this.width / 3.75;\n p.y = cY - this.height / 2;\n }\n\n this.c.save();\n this.c.translate(cX, cY);\n\n if (this.version === 1) {\n this.c.rotate(this.angle + (index * 0.8 * Math.PI / 180));\n }\n\n if (this.version === 2) {\n this.c.rotate(this.angle * 1.5 + (index * -1 * Math.PI / 45));\n }\n\n if (this.version === 3) {\n this.c.rotate(this.angle * -1.5 + (index * -0.8 * Math.PI / 45));\n }\n\n this.c.drawImage(this.img, p.x, p.y, this.imgSize, this.imgSize);\n this.c.restore();\n });\n }\n requestAnimationFrame(() => this.draw());\n }\n\n onWindowScroll() {\n window.addEventListener('scroll', () => {\n const parent = this.canvas.parentNode.parentNode.parentNode.querySelector('.row');\n const pos = parent.getBoundingClientRect();\n\n if (pos.top < window.innerHeight && pos.bottom >= 0) {\n this.visible = true;\n const percent = (parent.offsetHeight - pos.top) / 1000;\n\n if (this.version === 1 && percent <= 2) {\n this.progress = percent;\n }\n\n if (this.version === 2 && percent <= 2) {\n this.progress = percent * 0.5 + 0.6;\n }\n\n if (this.version === 3 && percent <= 2) {\n this.progress = percent * 0.35 + 0.6;\n }\n } else {\n this.visible = false;\n }\n });\n }\n\n onWindowResize() {\n window.addEventListener('resize', () => {\n this.setSize();\n });\n }\n}"]}