{"version":3,"file":"main.b392ffc8.js","sources":["../src/scripts/pictures.js","../src/scripts/utils.js","../src/scripts/tumblr.js","../src/scripts/constants.js","../src/scripts/photos.js","../src/scripts/doodles.js","../src/scripts/arts.js","../src/scripts/main.js"],"sourcesContent":["class Pictures {\n constructor(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n this.inverted = false;\n\n this.pictures = [];\n this.speed = 1;\n\n this.cells = [];\n\n this.init();\n\n this.dummyCanvas = document.createElement('canvas');\n this.dummyCanvas.classList.add('hidden');\n this.dummyCanvas.width = this.size.width * 2;\n this.dummyCanvas.height = this.size.height * 2;\n this.dummyContext = this.dummyCanvas.getContext('2d');\n }\n\n createCells() {\n const xmin = this.viewport.x\n ? Math.floor((this.viewport.x * this.speed) / this.grid.width) - 1\n : 0;\n const ymin = this.viewport.y\n ? Math.floor((this.viewport.y * this.speed) / this.grid.height) - 1\n : 0;\n\n const xbase = Math.ceil(this.viewport.width / this.grid.width) + 3;\n const ybase = Math.ceil(this.viewport.width / this.grid.width) + 3;\n\n this.cells = [];\n let count = 0;\n [...Array(xbase).keys()].forEach(row => {\n [...Array(ybase).keys()].forEach(col => {\n const x = (xmin + row) * this.grid.width;\n const y = (ymin + col) * this.grid.height;\n\n const photo = this.pictures.findIndex(ph => ph.x0 === x && ph.y0 === y);\n\n this.cells.push({\n x,\n y,\n index: photo === -1 ? this.pictures.length + count : photo,\n });\n\n if (photo === -1) {\n count += 1;\n }\n });\n });\n\n return count;\n }\n\n invert() {\n this.inverted = !this.inverted;\n this.render();\n }\n\n changeViewport(vp) {\n this.viewport = vp;\n this.load();\n }\n\n resize() {\n this.init();\n this.load();\n }\n\n init() {\n this.size = {\n width: this.canvas.clientWidth,\n height: this.canvas.clientHeight,\n };\n this.viewport = {\n x: -this.size.width * 0.01,\n y: -this.size.width * 0.01,\n width: this.size.width,\n height: this.size.height,\n };\n\n this.resizeCanvas();\n this.resizeGrid();\n }\n\n resizeCanvas() {\n this.canvas.setAttribute('width', this.size.width);\n this.canvas.setAttribute('height', this.size.height);\n }\n}\n\nexport default Pictures;\n","export const shuffleArray = array => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j], array[i]];\n }\n return array;\n};\n\nexport const getRandom = (min, scale) => min + Math.random() * scale;\n\nexport const getClient = event => ({\n x: event.targetTouches ? event.targetTouches[0].clientX : event.clientX,\n y: event.targetTouches ? event.targetTouches[0].clientY : event.clientY,\n});\n\nexport const debounce = (func, context, delay = 0) => {\n let timeout;\n\n return (...args) => {\n if (timeout) clearTimeout(timeout);\n\n timeout = setTimeout(\n () => requestAnimationFrame(func.bind(context, ...args)),\n delay\n );\n };\n};\n\nexport const invertColors = imageData => {\n const data = new Uint8ClampedArray(imageData.data);\n const { length } = data;\n\n for (let i = 0; i < length; i += 4) {\n if (data[i + 3]) {\n data[i] = data[i] ^ 255;\n data[i + 1] = data[i + 1] ^ 255;\n data[i + 2] = data[i + 2] ^ 255;\n }\n }\n\n return new ImageData(data, imageData.width, imageData.height);\n};\n\nexport const desaturateColors = imageData => {\n const data = new Uint8ClampedArray(imageData.data);\n const { length } = data;\n const value = -200 / 255;\n\n for (let i = 0; i < length; i += 4) {\n if (data[i + 3]) {\n const r = data[i];\n const g = data[i + 1];\n const b = data[i + 2];\n const gray = r * 0.2126 + g * 0.7152 + b * 0.0722;\n\n data[i] += (r - gray) * value;\n data[i + 1] += (g - gray) * value;\n data[i + 2] += (b - gray) * value;\n }\n }\n\n return new ImageData(data, imageData.width, imageData.height);\n};\n","import { shuffleArray, getRandom } from './utils';\n\nconst postUrl = 'https://api.tumblr.com/v2/blog/';\n\nconst keys = [\n 'qERU7FQgk2qe5cVA76WWbyWeUpvC4PqaWehCj990ARTmQpjChE',\n 'A4b9s6Xg6W3XIVq2olGqnEVM5Ec6WklTVb49dVBSOEXuR3YiO5',\n 'CPY40kpXP2hmTeGTTJK3tOlUn8LQyyhwkLLMHyuJQPJYUnEldg',\n 'F8vgA5I9SFdJDAzsa1giPiXROoqraC5RMSAD96I4XWMrgQLA0O',\n 'FzM9aY5HsBiofdF4ptpxUeyRqjRMYUGaNMMwTC15yzVdjQWSlT',\n];\nconst apiKey = keys[new Date().getMinutes() % keys.length];\n\nconst fetchBlog = async (name, offset = 0) => {\n const data = await fetch(\n `${postUrl}${name}/posts/photo?api_key=${apiKey}&offset=${offset}`\n );\n const { response } = await data.json();\n\n return response && response.posts ? response.posts : [];\n};\n\nexport const getBlogPosts = async (blogName, count, posts = []) => {\n let offset = Math.floor(getRandom(0, 200));\n let length = posts.length;\n\n while (length < count) {\n const blogPosts = await fetchBlog(blogName, offset);\n\n blogPosts\n .filter(({ photos }) => photos && photos.length)\n .forEach(({ photos }) => {\n const photo = photos[0];\n posts.push(\n photo.alt_sizes.length > 1 ? photo.alt_sizes[1] : photo.original_size\n );\n });\n\n if (posts.length === length) {\n return [];\n }\n length = posts.length;\n offset += 20;\n }\n\n if (length >= count) {\n return shuffleArray(posts);\n }\n};\n","import { shuffleArray } from './utils';\n\nconst blogs = shuffleArray([\n 'miuccias',\n 'formschon',\n 'justinboyer',\n 'jennifer-is-me',\n 'revolttv',\n 'justdropithere',\n 'diaryinthesnow',\n 'ilverde',\n 'photographicpictures',\n 'delinquentgentleman',\n 'trend-spotting',\n 'fakemargiela',\n 'fakemargiela',\n 'form-space-and-order',\n 'modernstyleposts',\n 'only1copy',\n 'release010',\n 'erisblackclothing',\n 'infinite-movement',\n 'leflambeur',\n 'midnight-charm',\n 'athingcalledbliss',\n 'parkerandloulou',\n 'ibbyfashion',\n 'wherethespiritmeetstheboneposts',\n 'nellatanadelleone',\n 'trustyourblood.com',\n 'atmuse',\n 'rowdyism',\n 'reclusiveundgrnd',\n 'surflocos',\n 'crystalizedcontrol',\n 'elisjolie',\n]);\n\nconst doodlesCount = 45;\nconst doodleIndexes = shuffleArray([...Array(doodlesCount).keys()]);\nconst doodlesSpeed = 0.75;\nconst doodleMaxSize = 800;\n\nconst artsCount = 19;\nconst artIndexes = shuffleArray([...Array(artsCount).keys()]);\nconst artsSpeed = 1.2;\n\nexport default {\n blogs,\n\n doodlesCount,\n doodleIndexes,\n doodlesSpeed,\n doodleMaxSize,\n\n artsCount,\n artIndexes,\n artsSpeed,\n};\n","import Pictures from './pictures';\nimport {\n debounce,\n getRandom,\n desaturateColors,\n invertColors,\n getClient,\n} from './utils';\nimport { getBlogPosts } from './tumblr';\nimport constants from './constants';\n\nclass Photos extends Pictures {\n constructor(canvas, callback) {\n super(canvas);\n\n this.callback = callback;\n\n this.onStartDrag = this.onStartDrag.bind(this);\n this.onDrag = debounce(this.onDrag, this);\n this.onScroll = debounce(this.onScroll, this);\n this.onStopDrag = this.onStopDrag.bind(this);\n\n this.canvas.addEventListener('mousedown', this.onStartDrag);\n this.canvas.addEventListener('touchstart', this.onStartDrag);\n\n this.canvas.addEventListener('mousemove', this.onDrag);\n this.canvas.addEventListener('touchmove', this.onDrag);\n\n this.canvas.addEventListener('mouseup', this.onStopDrag);\n this.canvas.addEventListener('mouseleave', this.onStopDrag);\n this.canvas.addEventListener('touchend', this.onStopDrag);\n\n this.canvas.addEventListener('mousewheel', this.onScroll, false);\n\n this.dragging = false;\n this.currentPos = null;\n\n this.blogIndex = 0;\n this.freePhotos = [];\n }\n\n async load() {\n const count = this.createCells();\n\n if (!this.loading) {\n this.loading = true;\n\n const posts = await getBlogPosts(\n constants.blogs[this.blogIndex],\n count,\n this.freePhotos\n );\n\n this.blogIndex =\n this.blogIndex < constants.blogs.length - 1 ? this.blogIndex + 1 : 0;\n\n if (count && posts.length === 0) {\n this.loading = false;\n this.load();\n return;\n }\n\n this.freePhotos = posts;\n this.freePhotos.splice(0, count).forEach(photo => {\n this.pictures.push({\n originalWidth: photo.width,\n originalHeight: photo.height,\n url: photo.url,\n init: false,\n });\n });\n\n this.loading = false;\n }\n\n this.position();\n this.render();\n }\n\n position() {\n const width = this.grid.width * 0.5;\n const height = this.grid.height * 0.5;\n\n this.cells.forEach(({ x, y, index }) => {\n if (!this.pictures[index] || this.pictures[index].init) {\n return;\n }\n\n this.pictures[index].init = true;\n this.pictures[index].x0 = x;\n this.pictures[index].y0 = y;\n\n this.pictures[index].x = x + getRandom(-width * 0.5, width);\n this.pictures[index].y = y + getRandom(-height * 0.5, height);\n\n this.resizePhoto(this.pictures[index]);\n });\n }\n\n render() {\n this.context.clearRect(0, 0, this.size.width, this.size.height);\n\n this.cells.forEach(({ index }) => {\n const photo = this.pictures[index];\n if (!photo) {\n return;\n }\n\n const { image, loaded } = photo;\n const x = photo.x - this.viewport.x * this.speed;\n const y = photo.y - this.viewport.y * this.speed;\n\n if (\n (photo.x + photo.width < this.viewport.x ||\n photo.x > this.viewport.x + this.viewport.width) &&\n (photo.y + photo.height < this.viewport.y ||\n photo.y > this.viewport.y + this.viewport.height)\n ) {\n return;\n }\n\n this.context.fillRect(x, y, photo.width, photo.height);\n\n if (image) {\n if (this.inverted) {\n this.context.putImageData(photo.inverted, x, y);\n } else {\n this.context.putImageData(photo.desaturated, x, y);\n }\n } else if (!loaded) {\n photo.loaded = true;\n\n const img = new Image();\n img.setAttribute('crossOrigin', '');\n img.src = `${photo.url}?${new Date().getTime()}`;\n img.onload = () => {\n photo.image = img;\n this.dummyContext.drawImage(img, 0, 0, photo.width, photo.height);\n\n const imageData = this.dummyContext.getImageData(\n 0,\n 0,\n photo.width,\n photo.height\n );\n\n this.dummyContext.clearRect(0, 0, photo.width, photo.height);\n photo.inverted = invertColors(imageData);\n photo.desaturated = desaturateColors(imageData);\n\n const x = photo.x - this.viewport.x * this.speed;\n const y = photo.y - this.viewport.y * this.speed;\n\n if (this.inverted) {\n this.context.putImageData(photo.inverted, x, y);\n } else {\n this.context.putImageData(photo.desaturated, x, y);\n }\n };\n }\n });\n }\n\n onStartDrag(event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.dragging = true;\n this.currentPos = getClient(event);\n }\n\n onDrag(event) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!this.dragging) {\n return;\n }\n\n const mousePos = getClient(event);\n const viewport = {\n x: this.viewport.x - mousePos.x + this.currentPos.x,\n y: this.viewport.y - mousePos.y + this.currentPos.y,\n width: this.viewport.width,\n height: this.viewport.height,\n };\n\n this.currentPos = { ...mousePos };\n this.callback(viewport);\n }\n\n onScroll(event) {\n event.preventDefault();\n event.stopPropagation();\n\n const viewport = {\n x: this.viewport.x + event.deltaX,\n y: this.viewport.y + event.deltaY,\n width: this.viewport.width,\n height: this.viewport.height,\n };\n\n this.callback(viewport);\n\n clearTimeout(this.isScrolling);\n this.isScrolling = setTimeout(() => {\n this.callback(this.viewport);\n }, 100);\n }\n\n onStopDrag() {\n this.dragging = false;\n this.currentPos = null;\n }\n\n resizeCanvas() {\n super.resizeCanvas();\n this.context.fillStyle = 'rgba(80, 80, 80, 0.2)';\n }\n\n resizeGrid() {\n const { width, height } = this.size;\n const screenAspectRatio = height / width;\n\n let widthCount = 0;\n let heightCount = 0;\n\n if (width > height) {\n widthCount = this.getGridSize(width);\n heightCount = Math.max(Math.floor(widthCount * screenAspectRatio), 2);\n } else {\n heightCount = this.getGridSize(height);\n widthCount = Math.max(Math.floor(heightCount / screenAspectRatio), 2);\n }\n\n this.grid = {\n width: width / widthCount,\n height: height / heightCount,\n };\n }\n\n getGridSize(screenSize) {\n if (screenSize > 2800) {\n return 7;\n }\n if (screenSize > 1920) {\n return 6;\n }\n if (screenSize > 1440) {\n return 5;\n }\n if (screenSize > 1024) {\n return 4;\n }\n return 3;\n }\n\n resizePhoto(photo) {\n const coeff = getRandom(0.7, 0.3);\n const maxWidth = this.grid.width * coeff;\n const maxHeight = this.grid.height * coeff;\n\n const { originalWidth, originalHeight } = photo;\n\n if (originalWidth > originalHeight) {\n photo.width = maxWidth;\n photo.height = (originalHeight * maxWidth) / originalWidth;\n } else {\n photo.height = maxHeight;\n photo.width = (originalWidth * maxHeight) / originalHeight;\n }\n }\n}\n\nexport default Photos;\n","import Pictures from './pictures';\nimport { getRandom, invertColors } from './utils';\nimport constants from './constants';\n\nclass Doodles extends Pictures {\n constructor(canvas) {\n super(canvas);\n this.speed = constants.doodlesSpeed;\n\n this.indexes = constants.doodleIndexes;\n this.index = 0;\n }\n\n load() {\n const count = this.createCells();\n\n [...Array(count).keys()].forEach(index => {\n this.index =\n this.index + 1 === constants.doodlesCount ? 0 : this.index + 1;\n this.pictures.push({\n index,\n url: `/doodles/doodle-${this.indexes[this.index] + 1}.png`,\n });\n });\n\n this.position();\n this.render();\n }\n\n position() {\n const width = this.grid.width * 0.16;\n const height = this.grid.width * 0.16;\n\n this.cells.forEach(({ x, y, index }) => {\n if (!this.pictures[index] || this.pictures[index].init) {\n return;\n }\n\n this.pictures[index].init = true;\n this.pictures[index].x0 = x;\n this.pictures[index].y0 = y;\n\n this.pictures[index].x = x + getRandom(-width, width * 2);\n this.pictures[index].y = y + getRandom(-height, height * 2);\n });\n }\n\n render() {\n this.context.clearRect(0, 0, this.size.width, this.size.height);\n\n this.cells.forEach(({ index }) => {\n const doodle = this.pictures[index];\n if (!doodle) {\n return;\n }\n\n const { image, loaded } = doodle;\n const x = doodle.x - this.viewport.x * this.speed;\n const y = doodle.y - this.viewport.y * this.speed;\n\n if (\n doodle.loaded &&\n (x + doodle.width < 0 || x > this.viewport.width) &&\n (y + doodle.height < 0 || y > this.viewport.height)\n ) {\n return;\n }\n\n if (image) {\n if (this.inverted) {\n this.context.putImageData(doodle.inverted, x, y);\n } else {\n this.context.drawImage(image, x, y, doodle.width, doodle.height);\n }\n } else if (!loaded) {\n doodle.loaded = true;\n\n const img = new Image();\n img.src = `${doodle.url}`;\n img.onload = () => {\n doodle.image = img;\n this.resizeDoodle(doodle, img.width, img.height);\n\n this.dummyContext.drawImage(img, 0, 0, doodle.width, doodle.height);\n doodle.inverted = invertColors(\n this.dummyContext.getImageData(0, 0, doodle.width, doodle.height)\n );\n this.dummyContext.clearRect(0, 0, doodle.width, doodle.height);\n\n const x = doodle.x - this.viewport.x * this.speed;\n const y = doodle.y - this.viewport.y * this.speed;\n\n if (this.inverted) {\n this.context.putImageData(doodle.inverted, x, y);\n } else {\n this.context.drawImage(img, x, y, doodle.width, doodle.height);\n }\n };\n }\n });\n }\n\n resizeGrid() {\n const { width, height } = this.size;\n\n let widthCount = 0;\n let heightCount = 0;\n\n if (width > height) {\n widthCount = this.getGridSize(width);\n heightCount = 1;\n } else {\n heightCount = this.getGridSize(height);\n widthCount = 1;\n }\n\n this.grid = {\n width: width / widthCount,\n height: height / heightCount,\n };\n }\n\n getGridSize(screenSize) {\n if (screenSize > 1920) {\n return 3;\n }\n if (screenSize > 768) {\n return 2;\n }\n return 1;\n }\n\n resizeDoodle(doodle, width, height) {\n doodle.height = Math.min(height, constants.doodleMaxSize);\n doodle.width = (width * doodle.height) / height;\n\n if (doodle.width > this.grid.width) {\n doodle.width = this.grid.width;\n doodle.height = (height * doodle.width) / width;\n }\n if (doodle.height > this.grid.height) {\n doodle.height = this.grid.height;\n doodle.width = (width * doodle.height) / height;\n }\n }\n}\n\nexport default Doodles;\n","import Pictures from './pictures';\nimport { getRandom, invertColors } from './utils';\nimport constants from './constants';\n\nclass Arts extends Pictures {\n constructor(canvas) {\n super(canvas);\n this.speed = constants.artsSpeed;\n\n this.indexes = constants.artIndexes;\n this.index = 0;\n }\n\n load() {\n const count = this.createCells();\n\n [...Array(count).keys()].forEach(index => {\n this.index = this.index + 1 === constants.artsCount ? 0 : this.index + 1;\n this.pictures.push({\n index,\n url: `/arts/${this.indexes[this.index] + 1}.svg`,\n });\n });\n\n this.position();\n this.render();\n }\n\n position() {\n const width = this.grid.width * 0.5;\n const height = this.grid.height * 0.5;\n\n this.cells.forEach(({ x, y, index }) => {\n if (!this.pictures[index] || this.pictures[index].init) {\n return;\n }\n\n this.pictures[index].init = true;\n this.pictures[index].resize = getRandom(0.8, 1);\n this.pictures[index].x0 = x;\n this.pictures[index].y0 = y;\n\n this.pictures[index].x = x + getRandom(-width, width * 2);\n this.pictures[index].y = y + getRandom(-height, height * 2);\n });\n }\n\n render() {\n this.context.clearRect(0, 0, this.size.width, this.size.height);\n\n this.cells.forEach(({ index }) => {\n const art = this.pictures[index];\n if (!art) {\n return;\n }\n\n const { image, loaded } = art;\n const x = art.x - this.viewport.x * this.speed;\n const y = art.y - this.viewport.y * this.speed;\n\n if (\n art.loaded &&\n (x + art.width < 0 || x > this.viewport.width) &&\n (y + art.height < 0 || y > this.viewport.height)\n ) {\n return;\n }\n\n if (image) {\n if (this.inverted) {\n this.context.putImageData(art.inverted, x, y);\n } else {\n this.context.drawImage(image, x, y, art.width, art.height);\n }\n } else if (!loaded) {\n art.loaded = true;\n\n const img = new Image();\n img.src = `${art.url}`;\n img.onload = () => {\n art.image = img;\n this.resizeArt(art, img.width, img.height);\n\n this.dummyContext.drawImage(img, 0, 0, art.width, art.height);\n art.inverted = invertColors(\n this.dummyContext.getImageData(0, 0, art.width, art.height)\n );\n this.dummyContext.clearRect(0, 0, art.width, art.height);\n\n const x = art.x - this.viewport.x * this.speed;\n const y = art.y - this.viewport.y * this.speed;\n\n if (this.inverted) {\n this.context.putImageData(art.inverted, x, y);\n } else {\n this.context.drawImage(img, x, y, art.width, art.height);\n }\n };\n }\n });\n }\n\n resizeGrid() {\n const { width, height } = this.size;\n const widthCount = this.getGridSize(width);\n const heightCount = this.getGridSize(height);\n\n this.grid = {\n width: width / widthCount,\n height: height / heightCount,\n };\n }\n\n getGridSize(screenSize) {\n if (screenSize > 1920) {\n return 3;\n }\n if (screenSize > 768) {\n return 2;\n }\n return 1;\n }\n\n resizeArt(art, width, height) {\n art.width = width * art.resize;\n art.height = height * art.resize;\n\n const coeff = 1.2;\n\n if (art.width > this.grid.width * coeff) {\n art.width = this.grid.width * coeff;\n art.height = (height * art.width) / width;\n }\n if (art.height > this.grid.height * coeff) {\n art.height = this.grid.height * coeff;\n art.width = (width * art.height) / height;\n }\n }\n}\n\nexport default Arts;\n","import 'regenerator-runtime/runtime';\nimport Photos from './photos';\nimport Doodles from './doodles';\nimport Arts from './arts';\n\nlet photos = null;\nlet doodles = null;\nlet arts = null;\n\nwindow.addEventListener('resize', () => {\n onResize();\n});\nwindow.addEventListener('load', () => {\n const main = document.querySelector('main');\n const magicButton = document.querySelector('button.invert');\n\n magicButton.addEventListener('click', () => {\n main.classList.toggle('inverted');\n photos.invert();\n doodles.invert();\n arts.invert();\n });\n\n const info = document.querySelector('.info');\n const whyButton = document.querySelector('button.why');\n const closeButton = document.querySelector('button.close');\n\n whyButton.addEventListener('click', () => {\n info.classList.add('visible');\n });\n closeButton.addEventListener('click', () => {\n info.classList.remove('visible');\n });\n\n init();\n photos.load();\n doodles.load();\n arts.load();\n});\n\nconst onResize = () => {\n photos.resize();\n doodles.resize();\n arts.resize();\n};\n\nconst onViewPortChanged = viewport => {\n photos.changeViewport(viewport);\n doodles.changeViewport(viewport);\n arts.changeViewport(viewport);\n};\n\nconst init = () => {\n photos = new Photos(document.querySelector('canvas.pics'), onViewPortChanged);\n doodles = new Doodles(document.querySelector('canvas.doodles'));\n arts = new Arts(document.querySelector('canvas.arts'));\n};\n"],"names":["Pictures","constructor","canvas","context","getContext","inverted","pictures","speed","cells","init","dummyCanvas","document","createElement","classList","add","width","this","size","height","dummyContext","createCells","xmin","viewport","x","Math","floor","grid","ymin","y","xbase","ceil","ybase","count","Array","keys","forEach","row","col","photo","findIndex","ph","x0","y0","push","index","length","invert","render","changeViewport","vp","load","resize","clientWidth","clientHeight","resizeCanvas","resizeGrid","setAttribute","shuffleArray","array","i","j","random","getRandom","min","scale","getClient","event","targetTouches","clientX","clientY","debounce","func","delay","timeout","args","clearTimeout","setTimeout","requestAnimationFrame","bind","invertColors","imageData","data","Uint8ClampedArray","ImageData","desaturateColors","r","g","b","gray","apiKey","Date","getMinutes","fetchBlog","async","name","offset","fetch","response","json","posts","getBlogPosts","blogName","filter","photos","alt_sizes","original_size","blogs","doodlesCount","doodleIndexes","doodlesSpeed","doodleMaxSize","artsCount","artIndexes","artsSpeed","Photos","callback","onStartDrag","onDrag","onScroll","onStopDrag","addEventListener","dragging","currentPos","blogIndex","freePhotos","loading","constants","splice","originalWidth","originalHeight","url","position","resizePhoto","clearRect","image","loaded","fillRect","putImageData","desaturated","img","Image","src","getTime","onload","drawImage","getImageData","preventDefault","stopPropagation","mousePos","deltaX","deltaY","isScrolling","fillStyle","screenAspectRatio","widthCount","heightCount","getGridSize","max","screenSize","coeff","maxWidth","maxHeight","Doodles","indexes","doodle","resizeDoodle","Arts","art","resizeArt","doodles","arts","window","onResize","main","querySelector","toggle","info","whyButton","closeButton","remove","onViewPortChanged"],"mappings":"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"}