diff --git a/static/js/main.8fb5beac.chunk.js.map b/static/js/main.8fb5beac.chunk.js.map
index d65e096..6690dad 100644
--- a/static/js/main.8fb5beac.chunk.js.map
+++ b/static/js/main.8fb5beac.chunk.js.map
@@ -1 +1 @@
-{"version":3,"sources":["frames lazy /^/.//.*/.png$/ groupOptions: {} namespace object","hashtags lazy /^/.//.*/.png$/ groupOptions: {} namespace object","locales lazy /^/.//.*/.ftl$/ groupOptions: {} namespace object","FrameChooser.js","Localized.js","HashtagChooser.js","Editor.js","HeaderImage.svg","purpleBG.png","empty_1x1.png","l10n.js","App.js","reportWebVitals.js","index.js"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","keys","Object","module","exports","FrameChooser","onChange","useState","frames","setFrames","choosenFrame","setChoosenFrame","useEffect","a","all","frame_filename","name","src","new_frames","default","loadFrames","handleImageChoosing","useCallback","event","target","dataset","className","frame","frame_src_path","isChoosen","alt","data-src","onClick","Localized","props","elems","br","Fragment","children","withLocalization","Inner","l10n","React","useContext","FluentContext","createElement","getString","args","fallback","clamp","value","min","max","Math","Editor","backgroundURL","backgroundRatio","frameURL","hashtagURL","editorRef","useRef","backgroundImageRef","hammer_got_init","set_hammer_got_init","hammertime","set_hammertime","hamster","set_hamster","x","set_x","y","set_y","add_x","set_add_x","add_y","set_add_y","scale","set_scale","photoWidth","setPhotoWidth","photoHeight","setPhotoHeight","editorWidth","setEditorWidth","editorHeight","setEditorHeight","rangeMinX","set_rangeMinX","rangeMinY","set_rangeMinY","rangeMaxX","set_rangeMaxX","rangeMaxY","set_rangeMaxY","current","new_editorWidth","offsetWidth","new_editorHeight","offsetHeight","new_photoWidth","new_photoHeight","imageWidth","imageHeight","imageScale","containerWidth","containerHeight","updateRange","handleMove","prev_x","prev_y","new_x","deltaX","new_y","deltaY","isFinal","handleScale","delta","preventDefault","new_scale","element","addEventListener","Hammer","direction","Hamster","on","wheel","off","unwheel","ref","data-x","data-y","data-scale","style","width","height","transform","locales","de","en","_supportedLocales_","fetchMessages","locale","path","fetch","response","text","messages","FluentResource","createMessagesGenerator","currentLocales","fetched","reduce","obj","cur","assign","generateBundles","bundle","FluentBundle","addResource","f","AppLocalizationProvider","userLocales","onLocaleChange","ReactLocalization","getDefaultBundles","bundles","setBundles","negotiateLanguages","defaultLocale","loadBundles","frameSize","AppLocalized","setFrameURL","setHashtagURL","originalPhoto","setOriginalPhoto","originalPhotoRation","setOriginalPhotoRation","orientation","set_orientation","set_width","set_height","cords","setCords","handleFrameURL","newFrameURL","handleHashtagURL","newHashtagURL","handleCordsChange","handleReadFile","file","reader","FileReader","onload","reader_event","img","Image","callback","view","DataView","result","getUint16","length","byteLength","offset","marker","getUint32","little","tags","i","readAsArrayBuffer","slice","getOrientation","new_orientation","original_ration","readAsDataURL","handleImage","files_event","files","onDrop","acceptedFiles","handleDownload","canvas","document","ctx","getContext","alpha","translate","rotate","PI","width_scaled","height_scaled","drawImage","pngUrl","toDataURL","mergeImages","purpleBG","b64","data","body","appendChild","download","href","click","remove","trigger_download","useDropzone","accept","maxFiles","noKeyboard","isDragActive","getRootProps","HeaderImage","tabIndex","outline","type","display","empty_1x1","navigator","languages","setUserLocales","currentLocale","setCurrentLocale","handleLanguageChange","handleCurrentLocalesChange","entries","data-locale","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.8fb5beac.chunk.js","sourcesContent":["var map = {\n\t\"./ProfileFrame Blue Bars.png\": [\n\t\t49,\n\t\t6\n\t],\n\t\"./ProfileFrame Green Bars.png\": [\n\t\t50,\n\t\t7\n\t],\n\t\"./ProfileFrame Mixed Bars.png\": [\n\t\t51,\n\t\t8\n\t],\n\t\"./ProfileFrame Purple.png\": [\n\t\t52,\n\t\t9\n\t],\n\t\"./ProfileFrame Red Bars.png\": [\n\t\t53,\n\t\t10\n\t],\n\t\"./ProfileFrame White Bars.png\": [\n\t\t54,\n\t\t11\n\t],\n\t\"./ProfileFrame Yellow Bars.png\": [\n\t\t55,\n\t\t12\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 41;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./DeineWahl.png\": [\n\t\t56,\n\t\t13\n\t],\n\t\"./Europa.png\": [\n\t\t57,\n\t\t14\n\t],\n\t\"./JetztBistDuDran.png\": [\n\t\t58,\n\t\t15\n\t],\n\t\"./Volt.png\": [\n\t\t59,\n\t\t16\n\t],\n\t\"./Volt21.png\": [\n\t\t60,\n\t\t17\n\t],\n\t\"./VoltEuropa.png\": [\n\t\t61,\n\t\t18\n\t],\n\t\"./VoltRLP.png\": [\n\t\t62,\n\t\t19\n\t],\n\t\"./VoteVolt.png\": [\n\t\t63,\n\t\t20\n\t],\n\t\"./paneuropäisch.png\": [\n\t\t64,\n\t\t21\n\t],\n\t\"./pragmatisch.png\": [\n\t\t65,\n\t\t22\n\t],\n\t\"./progressiv.png\": [\n\t\t66,\n\t\t23\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 42;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./de.ftl\": [\n\t\t67,\n\t\t3\n\t],\n\t\"./en.ftl\": [\n\t\t68,\n\t\t4\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 47;\nmodule.exports = webpackAsyncContext;","import { useState, useEffect, useCallback } from 'react'\n\nfunction FrameChooser({onChange}) {\n const [frames, setFrames] = useState([])\n const [choosenFrame, setChoosenFrame] = useState(null)\n\n useEffect(() => {\n async function loadFrames(){\n Promise.all(\n [\n 'ProfileFrame Purple',\n 'ProfileFrame Mixed Bars',\n 'ProfileFrame Yellow Bars',\n 'ProfileFrame Red Bars',\n 'ProfileFrame Blue Bars',\n 'ProfileFrame Green Bars',\n 'ProfileFrame White Bars',\n ]\n .map(async frame_filename => {\n return {\n name: frame_filename,\n src: await import(`./frames/${frame_filename}.png`),\n }\n })\n )\n .then(new_frames => {\n setFrames(new_frames)\n setChoosenFrame(new_frames[0].src.default)\n })\n }\n loadFrames()\n }, [])\n\n const handleImageChoosing = useCallback(event => {\n setChoosenFrame(event.target.dataset.src)\n }, [setChoosenFrame])\n\n useEffect(() => {\n onChange(choosenFrame)\n }, [onChange, choosenFrame])\n\n return (\n
\n {\n frames.map(frame => {\n const frame_src_path = frame.src.default\n const isChoosen = choosenFrame === frame_src_path\n return
\n })\n } \n
\n )\n}\n\nexport default FrameChooser\n","import React from 'react'\nimport {\n Localized as LocalizedOriginal,\n // withLocalization,\n} from '@fluent/react'\n\nimport { FluentContext } from '../node_modules/@fluent/react/esm/context.js'\n\nconst Localized = props => (\n ,\n ...props.elems,\n }}\n >\n {props.children} \n \n)\n\n// A custom withLocalization to have an empty fallback.\n// It is nearly identical to the original.\nfunction withLocalization(Inner) {\n function WithLocalization(props) {\n const l10n = React.useContext(FluentContext)\n\n const getString = (id, args, fallback) => l10n.getString(id, args, fallback || ' ')\n\n return React.createElement(Inner, { getString, ...props })\n }\n return WithLocalization\n}\n\nexport {\n withLocalization,\n Localized,\n Localized as default,\n}\n\n/*\n\nimport { Localized, withLocalization } from '../Localized/'\n\n \nexport default withLocalization(componentName)\n\n\nimport Localized from '../Localized/'\n \n\nimport { withLocalization } from '@fluent/react'\nexport default withLocalization(componentName)\n\n*/\n","import { useState, useEffect, useCallback } from 'react'\nimport { withLocalization } from './Localized.js'\n\nfunction HashtagChooser({ onChange, getString }) {\n const [frames, setFrames] = useState([])\n const [choosenFrame, setChoosenFrame] = useState(null)\n\n useEffect(() => {\n async function loadFrames() {\n Promise.all(\n [\n '',\n 'VoteVolt',\n 'DeineWahl',\n 'JetztBistDuDran',\n 'VoltEuropa',\n 'VoltRLP',\n 'Volt21',\n 'Volt',\n 'paneuropäisch',\n 'pragmatisch',\n 'progressiv',\n 'Europa',\n ]\n .map(async frame_filename => {\n return {\n name: frame_filename,\n src: frame_filename === '' ? '' : await import(`./hashtags/${frame_filename}.png`),\n }\n })\n )\n .then(new_frames => {\n setFrames(new_frames)\n setChoosenFrame(new_frames[0].src.default)\n })\n }\n loadFrames()\n }, [])\n\n const handleImageChoosing = useCallback(event => {\n setChoosenFrame(event.target.dataset.src)\n }, [setChoosenFrame])\n\n useEffect(() => {\n onChange(choosenFrame)\n }, [onChange, choosenFrame])\n\n return (\n \n {\n frames.map(frame => {\n const frame_src_path = frame.src.default\n const isChoosen = choosenFrame === frame_src_path\n return \n {frame.name === '' ? getString('button_no_hashtag') : '#'+frame.name}\n \n })\n }\n
\n )\n}\n\nexport default withLocalization(HashtagChooser)\n","import { useEffect, useRef, useState, useCallback } from 'react'\n\nimport Hammer from 'hammerjs'\nimport Hamster from 'hamsterjs'\n\nfunction updateRange(imageWidth, imageHeight, imageScale, containerWidth, containerHeight) {\n\n const rangeX = Math.max(0, (imageWidth * imageScale) - containerWidth)\n const rangeY = Math.max(0, (imageHeight * imageScale) - containerHeight)\n\n const rangeMaxX = (rangeX / 2)\n const rangeMinX = 0 - rangeMaxX\n\n const rangeMaxY = (rangeY / 2)\n const rangeMinY = 0 - rangeMaxY\n\n return {\n rangeMaxX,\n rangeMinX,\n rangeMaxY,\n rangeMinY,\n }\n}\n\nfunction clamp(value, min, max) {\n return Math.min(Math.max(min, value), max)\n}\n\n\n\nlet minScale = 1;\nlet maxScale = 8;\n\n\n\nfunction Editor({ onChange, backgroundURL, backgroundRatio, frameURL, hashtagURL }) {\n const editorRef = useRef(null)\n const backgroundImageRef = useRef(null)\n\n const [hammer_got_init, set_hammer_got_init] = useState(false)\n\n const [hammertime, set_hammertime] = useState(null)\n const [hamster, set_hamster] = useState(null)\n\n const [x, set_x] = useState(0)\n const [y, set_y] = useState(0)\n const [add_x, set_add_x] = useState(0)\n const [add_y, set_add_y] = useState(0)\n const [scale, set_scale] = useState(1)\n // const [add_scale, set_add_scale] = useState(0)\n\n const [photoWidth, setPhotoWidth] = useState(300)\n const [photoHeight, setPhotoHeight] = useState(300)\n const [editorWidth, setEditorWidth] = useState(300)\n const [editorHeight, setEditorHeight] = useState(300)\n\n const [rangeMinX, set_rangeMinX] = useState(0)\n const [rangeMinY, set_rangeMinY] = useState(0)\n const [rangeMaxX, set_rangeMaxX] = useState(0)\n const [rangeMaxY, set_rangeMaxY] = useState(0)\n\n useEffect(() => {\n if (!!onChange) {\n onChange({ x, y, scale})\n }\n }, [onChange, x, y, scale])\n\n useEffect(() => {\n if (!!editorRef && !!editorRef.current) {\n const new_editorWidth = editorRef.current.offsetWidth\n const new_editorHeight = editorRef.current.offsetHeight\n setEditorHeight(new_editorHeight)\n setEditorWidth(new_editorWidth)\n\n let new_photoWidth = 1\n let new_photoHeight = 1\n if (backgroundRatio < 1) {\n new_photoWidth = 1 / backgroundRatio\n } else if (backgroundRatio > 1) {\n new_photoHeight = 1 * backgroundRatio\n }\n\n setPhotoWidth(new_photoWidth)\n setPhotoHeight(new_photoHeight)\n }\n }, [backgroundRatio])\n\n useEffect(() => {\n const {\n rangeMinX,\n rangeMinY,\n rangeMaxX,\n rangeMaxY,\n } = updateRange(photoWidth * editorWidth, photoHeight * editorHeight, scale, editorWidth, editorHeight)\n\n set_rangeMinX(rangeMinX)\n set_rangeMinY(rangeMinY)\n set_rangeMaxX(rangeMaxX)\n set_rangeMaxY(rangeMaxY)\n }, [\n photoWidth,\n photoHeight,\n editorWidth,\n editorHeight,\n scale,\n ])\n\n useEffect(() => {\n set_x(0)\n set_y(0)\n set_add_x(0)\n set_add_y(0)\n set_scale(1)\n }, [backgroundURL])\n\n const handleMove = useCallback(event => {\n const prev_x = event.target.dataset.x * 1\n const prev_y = event.target.dataset.y * 1\n\n const new_x = clamp(prev_x + event.deltaX, rangeMinX, rangeMaxX)\n const new_y = clamp(prev_y + event.deltaY, rangeMinY, rangeMaxY)\n\n if (event.isFinal) {\n set_x(new_x || 0)\n set_y(new_y || 0)\n set_add_x(0)\n set_add_y(0)\n }else{\n set_add_x(new_x - prev_x || 0)\n set_add_y(new_y - prev_y || 0)\n }\n }, [\n rangeMinX,\n rangeMinY,\n rangeMaxX,\n rangeMaxY,\n ])\n\n const handleScale = useCallback((event, delta, deltaX, deltaY) => {\n event.preventDefault()\n\n const prev_scale = event.target.dataset.scale * 1\n const new_scale = clamp(prev_scale + delta / 200, minScale, maxScale)\n set_scale(new_scale || 1)\n\n const prev_x = event.target.dataset.x * 1\n const prev_y = event.target.dataset.y * 1\n set_x(clamp(prev_x, rangeMinX, rangeMaxX) || 0)\n set_y(clamp(prev_y, rangeMinY, rangeMaxY) || 0)\n }, [\n rangeMinX,\n rangeMinY,\n rangeMaxX,\n rangeMaxY,\n ])\n\n useEffect(() => {\n if (!hammer_got_init && !!editorRef && !!editorRef.current) {\n const element = editorRef.current\n\n element.addEventListener('mousedown', event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n element.addEventListener(\"touchstart\", event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n element.addEventListener(\"touchend\", event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n element.addEventListener(\"touchmove\", event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n\n set_hammertime(new Hammer(element, {\n direction: 'DIRECTION_ALL',\n }))\n\n set_hamster(Hamster(element))\n\n set_hammer_got_init(true)\n }\n }, [editorRef, hammer_got_init])\n\n useEffect(() => {\n if (!!hammertime && !!hamster && hammer_got_init && !!editorRef && !!editorRef.current) {\n hammertime.on('pan', handleMove)\n hamster.wheel(handleScale)\n\n return function () {\n hammertime.off('pan', handleMove)\n hamster.unwheel()\n }\n }\n }, [editorRef, handleMove, handleScale, hammer_got_init, hammertime, hamster])\n\n return (\n \n )\n}\n\nexport default Editor\n","export default __webpack_public_path__ + \"static/media/HeaderImage.1f39a672.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABDgAAAQ4AgMAAACRfoQcAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJUExURVIud1Iud1Eudgy0J+8AAAADdFJOU//+/Q3dsqEAAATsSURBVHgB7dAxAQAABAAwQtI/ipMCvi3CgiMV6NChQ4cOHTp06NChQ4cOHTp06NChAx06dOjQoUOHDh06dOjQoUOHDh06dOhAhw4dOnTo0KFDhw4dOnTo0KFDhw4dOtChQ4cOHTp06NChQ4cOHTp06NChQ4cOdOjQoUOHDh06dOjQoUOHDh06dOjQoQMdOnTo0KFDhw4dOnTo0KFDhw4dOnToQIcOHTp06NChQ4cOHTp06NChQ4cOHejQoUOHDh06dOjQoUOHDh06dOjQoUMHOnTo0KFDhw4dOnTo0KFDhw4dOnTo0IEOHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06NChQIcOHTp06NChQ4cOHTp06NChQ4cOHejQoUOHDh06dOjQoUOHDh06dOjQoUMHOnTo0KFDhw4dOnTo0KFDhw4dOnTo0IEOHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06ECHDh06dOjQoUOHDh06dOjQoUOHDh060KFDhw4dOnTo0KFDhw4dOnTo0KFDhw506NChQ4cOHTp06NChQ4cOHTp06NChAx06dOjQoUOHDh06dOjQoUOHDh06dOhAhw4dOnTo0KFDhw4dOnTo0KFDhw4dOtChQ4cOHTp06NChQ4cOHTp06NChQ4cOBTp06NChQ4cOHTp06NChQ4cOHTp06ECHDh06dOjQoUOHDh06dOjQoUOHDh060KFDhw4dOnTo0KFDhw4dOnTo0KFDhw506NChQ4cOHTp06NChQ4cOHTp06NChAx06dOjQoUOHDh06dOjQoUOHDh06dOhAhw4dOnTo0KFDhw4dOnTo0KFDhw4dOtChQ4cOHTp06NChQ4cOHTp06NChQwc6dOjQoUOHDh06dOjQoUOHDh06dOjQgQ4dOnTo0KFDhw4dOnTo0KFDhw4dOnSgQ4cOHTp06NChQ4cOHTp06NChQ4cOHTx06NChQ4cOdOjQoUOHDh06dOjQoUOHDh06dOjQoQMdOnTo0KFDhw4dOnTo0KFDhw4dOnToQIcOHTp06NChQ4cOHTp06NChQ4cOHTrQoUOHDh06dOjQoUOHDh06dOjQoUOHDnTo0KFDhw4dOnTo0KFDhw4dOnTo0KEDHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06NCBDh06dOjQoUOHDh06dOjQoUOHDh06dKBDhw4dOnTo0KFDhw4dOnTo0KFDhw4d6NChQ4cOHTp06NChQ4cOHTp06NChQ4cCHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06NCBDh06dOjQoUOHDh06dOjQoUOHDh06dKBDhw4dOnTo0KFDhw4dOnTo0KFDhw4dxeoB30xd38yzCvgAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAALSURBVHgBY2BgAAAAAwABjPg5OgAAAABJRU5ErkJggg==\"","import React, { useEffect, useState } from 'react'\n\n// https://projectfluent.org/play/\n\n// import {LocalizationProvider,Localized} from '@fluent/react' // '@fluent/react/compat'\nimport { ReactLocalization, LocalizationProvider } from '@fluent/react'\nimport { FluentBundle, FluentResource } from '@fluent/bundle'\nimport { negotiateLanguages } from '@fluent/langneg'\n\n\nexport const locales = {\n de: 'Deutsch',\n en: 'English',\n}\n\nconst _supportedLocales_ = Object.keys(locales)\nconst _defaultLocale_ = 'en'\n\n\nasync function fetchMessages(locale) {\n const path = await import('./locales/' + locale + '.ftl')\n\n const response = await fetch(path.default)\n const messages = await response.text()\n\n return { [locale]: new FluentResource(messages) }\n}\n\nfunction getDefaultBundles() {\n const bundle = new FluentBundle('')\n bundle.addResource(new FluentResource(''))\n return new ReactLocalization([bundle])\n}\n\nasync function createMessagesGenerator(currentLocales) {\n const fetched = await Promise.all(\n currentLocales.map(fetchMessages)\n )\n const messages = fetched.reduce(\n (obj, cur) => Object.assign(obj, cur)\n )\n\n return function* generateBundles() {\n for (const locale of currentLocales) {\n const bundle = new FluentBundle(locale)\n bundle.addResource(messages[locale])\n yield bundle\n }\n }\n}\n\nexport function AppLocalizationProvider({ userLocales, children, onLocaleChange }){\n const [bundles, setBundles] = useState(getDefaultBundles())\n\n useEffect(() => {\n async function loadBundles() {\n const currentLocales = negotiateLanguages(\n userLocales,\n _supportedLocales_,\n { defaultLocale: _defaultLocale_ }\n )\n \n if (!!onLocaleChange) {\n onLocaleChange(currentLocales)\n }\n\n const generateBundles = await createMessagesGenerator(currentLocales)\n setBundles( new ReactLocalization(generateBundles()) )\n }\n loadBundles()\n }, [userLocales, onLocaleChange])\n\n if (!bundles) {\n // Show a loader.\n return Loading texts…
\n }\n\n return \n {children}\n \n}\n\n","import { useState, useCallback } from 'react'\nimport './App.css'\nimport { useDropzone } from 'react-dropzone'\nimport mergeImages from 'merge-images'\nimport FrameChooser from './FrameChooser.js'\nimport HashtagChooser from './HashtagChooser.js'\nimport Editor from './Editor.js'\nimport HeaderImage from './HeaderImage.svg'\nimport purpleBG from './purpleBG.png'\nimport empty_1x1 from './empty_1x1.png'\n\nimport 'intl-pluralrules'\nimport { AppLocalizationProvider, locales } from './l10n.js'\nimport { withLocalization, Localized } from './Localized.js'\n\n\nconst frameSize = 1080\n\nfunction getOrientation(file, callback) {\n // Source: http://stackoverflow.com/a/32490603\n // (With some modifications: I just made the code fit the style-guide.)\n const reader = new FileReader()\n\n reader.onload = function (event) {\n const view = new DataView(event.target.result)\n\n if (view.getUint16(0, false) !== 0xFFD8) {\n return callback(-2)\n }\n\n const length = view.byteLength\n let offset = 2\n\n while (offset < length) {\n const marker = view.getUint16(offset, false)\n offset += 2\n\n if (marker === 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return callback(-1)\n }\n const little = view.getUint16(offset += 6, false) === 0x4949\n offset += view.getUint32(offset + 4, little)\n const tags = view.getUint16(offset, little)\n offset += 2\n\n for (var i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) === 0x0112) {\n return callback(view.getUint16(offset + (i * 12) + 8, little))\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break\n } else {\n offset += view.getUint16(offset, false)\n }\n }\n return callback(-1)\n }\n\n reader.readAsArrayBuffer(file.slice(0, 64 * 1024))\n}\n\nfunction trigger_download(name, data){\n const a = document.createElement('a')\n document.body.appendChild(a)\n // a.target = '_blank'\n a.download = name\n a.href = data\n a.click()\n a.remove()\n}\n\nfunction App({ getString }) { \n const [frameURL, setFrameURL] = useState(null)\n const [hashtagURL, setHashtagURL] = useState(null)\n const [originalPhoto, setOriginalPhoto] = useState(null)\n const [originalPhotoRation, setOriginalPhotoRation] = useState(1)\n const [orientation, set_orientation] = useState(null)\n\n\n // const [combinedImage, set_combinedImage] = useState(null)\n\n const [width, set_width] = useState(0)\n const [height, set_height] = useState(0)\n\n const [cords, setCords] = useState({x:0, y:0, scale:1})\n\n const handleFrameURL = useCallback(newFrameURL => {\n setFrameURL(newFrameURL)\n }, [setFrameURL])\n\n const handleHashtagURL = useCallback(newHashtagURL => {\n setHashtagURL(newHashtagURL)\n }, [setHashtagURL])\n\n const handleCordsChange = useCallback(({x, y, scale}) => {\n setCords({ x, y, scale })\n }, [])\n\n const handleReadFile = useCallback(file => {\n if (!(!!file)) {\n return;\n }\n\n const reader = new FileReader()\n reader.onload = reader_event => {\n const img = new Image()\n img.onload = function () {\n let width, height;\n if (img.width < img.height) {\n height = (img.height / img.width) * frameSize\n width = frameSize\n } else {\n height = frameSize\n width = (img.width / img.height) * frameSize\n }\n\n getOrientation(file, new_orientation => {\n let original_ration = 1\n // use the correct image orientation\n switch (new_orientation) {\n // Source: https://stackoverflow.com/a/30242954/2387277\n // Source: https://stackoverflow.com/questions/19463126/how-to-draw-photo-with-correct-orientation-in-canvas-after-capture-photo-by-usin\n case 2:\n // horizontal flip\n original_ration = height / width\n break\n case 3:\n // 180° rotate left\n original_ration = height / width\n break\n case 4:\n // vertical flip\n original_ration = height / width\n break\n case 5:\n // vertical flip + 90 rotate right\n original_ration = width / height\n break\n case 6:\n // 90° rotate right\n original_ration = width / height\n break\n case 7:\n // horizontal flip + 90 rotate right\n original_ration = width / height\n break\n case 8:\n // 90° rotate left\n original_ration = width / height\n break\n default:\n original_ration = height / width\n break\n }\n\n set_width(width)\n set_height(height)\n setOriginalPhoto(reader_event.target.result)\n set_orientation(new_orientation)\n setOriginalPhotoRation(original_ration)\n })\n }\n img.src = reader_event.target.result\n }\n reader.readAsDataURL(file)\n }, [])\n\n const handleImage = useCallback(files_event => {\n handleReadFile(files_event.target.files[0])\n }, [handleReadFile])\n\n const onDrop = useCallback(acceptedFiles => {\n handleReadFile(acceptedFiles[0])\n }, [handleReadFile])\n\n const handleDownload = useCallback(() => {\n const img = new Image()\n img.onload = function () {\n const canvas = document.createElement('canvas')\n canvas.width = frameSize\n canvas.height = frameSize\n\n const ctx = canvas.getContext('2d', { alpha: true })\n\n // use the correct image orientation\n switch (orientation) {\n // Source: https://stackoverflow.com/a/30242954/2387277\n // Source: https://stackoverflow.com/questions/19463126/how-to-draw-photo-with-correct-orientation-in-canvas-after-capture-photo-by-usin\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0)\n ctx.scale(-1, 1)\n break\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height)\n ctx.rotate(Math.PI)\n break\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height)\n ctx.scale(1, -1)\n break\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI)\n ctx.scale(1, -1)\n break\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI)\n ctx.translate(0, -canvas.height)\n break\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI)\n ctx.translate(canvas.width, -canvas.height)\n ctx.scale(-1, 1)\n break\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI)\n ctx.translate(-canvas.width, 0)\n break\n default:\n break\n }\n\n\n const width_scaled = width * cords.scale\n const height_scaled = height * cords.scale\n\n ctx.drawImage(\n img,\n cords.x * 3.5 + (frameSize - width_scaled) * 0.5,\n cords.y * 3.5 + (frameSize - height_scaled) * 0.5,\n width_scaled,\n height_scaled,\n )\n // ctx.drawImage(\n // img,\n // ((frameSize - width_scaled) * 0.5),\n // ((frameSize - height_scaled) * 0.5),\n // width_scaled,\n // height_scaled,\n // )\n\n const pngUrl = canvas.toDataURL()\n\n mergeImages([\n purpleBG,\n ...(pngUrl ? [pngUrl] : []),\n ...(frameURL ? [frameURL] : []),\n ...(hashtagURL ? [hashtagURL] : []),\n ])\n .then(b64 => {\n // set_combinedImage(b64)\n trigger_download('volt-profile-picture.png', b64)\n })\n\n }\n img.src = originalPhoto\n }, [\n originalPhoto,\n cords.x,\n cords.y,\n cords.scale,\n orientation,\n frameURL,\n hashtagURL,\n height,\n width,\n ])\n\n const { isDragActive, getRootProps } = useDropzone({\n onDrop,\n accept: 'image/*',\n maxFiles: 1,\n noKeyboard: true,\n })\n\n\n return (\n \n
\n\n
\n \n
\n\n
\n
\n \n
\n\n
\n {!!originalPhoto ? : null}\n {!!originalPhoto ? getString('button_change_photo') : getString('button_load_photo') } \n \n \n\n {true || !!originalPhoto ? (<>\n
\n
\n
\n
\n >) : null}\n\n {!!originalPhoto && !!frameURL && !!handleHashtagURL ? (<>\n
\n {/*\n
Edit your Photo: \n
Your can reposition the image and scale it. Use pinch-to-zoom or scroll to scale.
\n */}\n\n
\n\n
\n >) : null}\n\n
\n
\n )\n}\nconst AppLocalized = withLocalization(App)\n\n\nfunction AppWrapper() {\n const [userLocales, setUserLocales] = useState(navigator.languages)\n const [currentLocale, setCurrentLocale] = useState(null)\n\n const handleLanguageChange = useCallback(event => {\n setUserLocales([event.target.dataset.locale])\n }, [setUserLocales])\n\n const handleCurrentLocalesChange = useCallback(currentLocales => {\n setCurrentLocale(currentLocales.length > 0 ? currentLocales[0] : '')\n }, [setCurrentLocale])\n\n return \n <>\n \n\n \n {\n Object.entries(locales)\n .map(([locale, name]) => {\n return \n {name}\n \n })\n }\n
\n >\n \n}\nexport default withLocalization(AppWrapper)\n\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}
\ No newline at end of file
+{"version":3,"sources":["frames lazy /^/.//.*/.png$/ groupOptions: {} namespace object","hashtags lazy /^/.//.*/.png$/ groupOptions: {} namespace object","locales lazy /^/.//.*/.ftl$/ groupOptions: {} namespace object","FrameChooser.js","Localized.js","HashtagChooser.js","Editor.js","HeaderImage.svg","purpleBG.png","empty_1x1.png","l10n.js","App.js","reportWebVitals.js","index.js"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","keys","Object","module","exports","FrameChooser","onChange","useState","frames","setFrames","choosenFrame","setChoosenFrame","useEffect","a","all","frame_filename","name","src","new_frames","default","loadFrames","handleImageChoosing","useCallback","event","target","dataset","className","frame","frame_src_path","isChoosen","alt","data-src","onClick","Localized","props","elems","br","Fragment","children","withLocalization","Inner","l10n","React","useContext","FluentContext","createElement","getString","args","fallback","clamp","value","min","max","Math","Editor","backgroundURL","backgroundRatio","frameURL","hashtagURL","editorRef","useRef","backgroundImageRef","hammer_got_init","set_hammer_got_init","hammertime","set_hammertime","hamster","set_hamster","x","set_x","y","set_y","add_x","set_add_x","add_y","set_add_y","scale","set_scale","photoWidth","setPhotoWidth","photoHeight","setPhotoHeight","editorWidth","setEditorWidth","editorHeight","setEditorHeight","rangeMinX","set_rangeMinX","rangeMinY","set_rangeMinY","rangeMaxX","set_rangeMaxX","rangeMaxY","set_rangeMaxY","current","new_editorWidth","offsetWidth","new_editorHeight","offsetHeight","new_photoWidth","new_photoHeight","imageWidth","imageHeight","imageScale","containerWidth","containerHeight","updateRange","handleMove","prev_x","prev_y","new_x","deltaX","new_y","deltaY","isFinal","handleScale","delta","preventDefault","new_scale","element","addEventListener","Hammer","direction","Hamster","on","wheel","off","unwheel","ref","data-x","data-y","data-scale","style","width","height","transform","locales","de","en","_supportedLocales_","fetchMessages","locale","path","fetch","response","text","messages","FluentResource","createMessagesGenerator","currentLocales","fetched","reduce","obj","cur","assign","generateBundles","bundle","FluentBundle","addResource","f","AppLocalizationProvider","userLocales","onLocaleChange","ReactLocalization","getDefaultBundles","bundles","setBundles","negotiateLanguages","defaultLocale","loadBundles","frameSize","AppLocalized","setFrameURL","setHashtagURL","originalPhoto","setOriginalPhoto","originalPhotoRation","setOriginalPhotoRation","orientation","set_orientation","set_width","set_height","cords","setCords","handleFrameURL","newFrameURL","handleHashtagURL","newHashtagURL","handleCordsChange","handleReadFile","file","reader","FileReader","onload","reader_event","img","Image","callback","view","DataView","result","getUint16","length","byteLength","offset","marker","getUint32","little","tags","i","readAsArrayBuffer","slice","getOrientation","new_orientation","original_ration","readAsDataURL","handleImage","files_event","files","onDrop","acceptedFiles","handleDownload","canvas","document","ctx","getContext","alpha","translate","rotate","PI","width_scaled","height_scaled","drawImage","pngUrl","toDataURL","mergeImages","purpleBG","b64","data","body","appendChild","download","href","click","remove","trigger_download","useDropzone","accept","maxFiles","noKeyboard","isDragActive","getRootProps","HeaderImage","tabIndex","outline","type","display","empty_1x1","navigator","languages","setUserLocales","currentLocale","setCurrentLocale","handleLanguageChange","handleCurrentLocalesChange","entries","data-locale","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.8fb5beac.chunk.js","sourcesContent":["var map = {\n\t\"./ProfileFrame Blue Bars.png\": [\n\t\t49,\n\t\t6\n\t],\n\t\"./ProfileFrame Green Bars.png\": [\n\t\t50,\n\t\t7\n\t],\n\t\"./ProfileFrame Mixed Bars.png\": [\n\t\t51,\n\t\t8\n\t],\n\t\"./ProfileFrame Purple.png\": [\n\t\t52,\n\t\t9\n\t],\n\t\"./ProfileFrame Red Bars.png\": [\n\t\t53,\n\t\t10\n\t],\n\t\"./ProfileFrame White Bars.png\": [\n\t\t54,\n\t\t11\n\t],\n\t\"./ProfileFrame Yellow Bars.png\": [\n\t\t55,\n\t\t12\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 41;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./DeineWahl.png\": [\n\t\t56,\n\t\t13\n\t],\n\t\"./Europa.png\": [\n\t\t57,\n\t\t14\n\t],\n\t\"./JetztBistDuDran.png\": [\n\t\t58,\n\t\t15\n\t],\n\t\"./Volt.png\": [\n\t\t59,\n\t\t16\n\t],\n\t\"./Volt21.png\": [\n\t\t60,\n\t\t17\n\t],\n\t\"./VoltEuropa.png\": [\n\t\t61,\n\t\t18\n\t],\n\t\"./VoltRLP.png\": [\n\t\t62,\n\t\t19\n\t],\n\t\"./VoteVolt.png\": [\n\t\t63,\n\t\t20\n\t],\n\t\"./paneuropäisch.png\": [\n\t\t64,\n\t\t21\n\t],\n\t\"./pragmatisch.png\": [\n\t\t65,\n\t\t22\n\t],\n\t\"./progressiv.png\": [\n\t\t66,\n\t\t23\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 42;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./de.ftl\": [\n\t\t67,\n\t\t3\n\t],\n\t\"./en.ftl\": [\n\t\t68,\n\t\t4\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(function() {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = function webpackAsyncContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackAsyncContext.id = 47;\nmodule.exports = webpackAsyncContext;","import { useState, useEffect, useCallback } from 'react'\n\nfunction FrameChooser({onChange}) {\n const [frames, setFrames] = useState([])\n const [choosenFrame, setChoosenFrame] = useState(null)\n\n useEffect(() => {\n async function loadFrames(){\n Promise.all(\n [\n 'ProfileFrame Purple',\n 'ProfileFrame Mixed Bars',\n 'ProfileFrame Yellow Bars',\n 'ProfileFrame Red Bars',\n 'ProfileFrame Blue Bars',\n 'ProfileFrame Green Bars',\n 'ProfileFrame White Bars',\n ]\n .map(async frame_filename => {\n return {\n name: frame_filename,\n src: await import(`./frames/${frame_filename}.png`),\n }\n })\n )\n .then(new_frames => {\n setFrames(new_frames)\n setChoosenFrame(new_frames[0].src.default)\n })\n }\n loadFrames()\n }, [])\n\n const handleImageChoosing = useCallback(event => {\n setChoosenFrame(event.target.dataset.src)\n }, [setChoosenFrame])\n\n useEffect(() => {\n onChange(choosenFrame)\n }, [onChange, choosenFrame])\n\n return (\n \n {\n frames.map(frame => {\n const frame_src_path = frame.src.default\n const isChoosen = choosenFrame === frame_src_path\n return
\n })\n } \n
\n )\n}\n\nexport default FrameChooser\n","import React from 'react'\nimport {\n Localized as LocalizedOriginal,\n // withLocalization,\n} from '@fluent/react'\n\nimport { FluentContext } from '../node_modules/@fluent/react/esm/context.js'\n\nconst Localized = props => (\n ,\n ...props.elems,\n }}\n >\n {props.children} \n \n)\n\n// A custom withLocalization to have an empty fallback.\n// It is nearly identical to the original.\nfunction withLocalization(Inner) {\n function WithLocalization(props) {\n const l10n = React.useContext(FluentContext)\n\n const getString = (id, args, fallback) => l10n.getString(id, args, fallback || ' ')\n\n return React.createElement(Inner, { getString, ...props })\n }\n return WithLocalization\n}\n\nexport {\n withLocalization,\n Localized,\n Localized as default,\n}\n\n/*\n\nimport { Localized, withLocalization } from '../Localized/'\n\n \nexport default withLocalization(componentName)\n\n\nimport Localized from '../Localized/'\n \n\nimport { withLocalization } from '@fluent/react'\nexport default withLocalization(componentName)\n\n*/\n","import { useState, useEffect, useCallback } from 'react'\nimport { withLocalization } from './Localized.js'\n\nfunction HashtagChooser({ onChange, getString }) {\n const [frames, setFrames] = useState([])\n const [choosenFrame, setChoosenFrame] = useState(null)\n\n useEffect(() => {\n async function loadFrames() {\n Promise.all(\n [\n '',\n 'VoteVolt',\n 'DeineWahl',\n 'JetztBistDuDran',\n 'VoltEuropa',\n 'VoltRLP',\n 'Volt21',\n 'Volt',\n 'paneuropäisch',\n 'pragmatisch',\n 'progressiv',\n 'Europa',\n ]\n .map(async frame_filename => {\n return {\n name: frame_filename,\n src: frame_filename === '' ? '' : await import(`./hashtags/${frame_filename}.png`),\n }\n })\n )\n .then(new_frames => {\n setFrames(new_frames)\n setChoosenFrame(new_frames[0].src.default)\n })\n }\n loadFrames()\n }, [])\n\n const handleImageChoosing = useCallback(event => {\n setChoosenFrame(event.target.dataset.src)\n }, [setChoosenFrame])\n\n useEffect(() => {\n onChange(choosenFrame)\n }, [onChange, choosenFrame])\n\n return (\n \n {\n frames.map(frame => {\n const frame_src_path = frame.src.default\n const isChoosen = choosenFrame === frame_src_path\n return \n {frame.name === '' ? getString('button_no_hashtag') : '#'+frame.name}\n \n })\n }\n
\n )\n}\n\nexport default withLocalization(HashtagChooser)\n","import { useEffect, useRef, useState, useCallback } from 'react'\n\nimport Hammer from 'hammerjs'\nimport Hamster from 'hamsterjs'\n\nfunction updateRange(imageWidth, imageHeight, imageScale, containerWidth, containerHeight) {\n\n const rangeX = Math.max(0, (imageWidth * imageScale) - containerWidth)\n const rangeY = Math.max(0, (imageHeight * imageScale) - containerHeight)\n\n const rangeMaxX = (rangeX / 2)\n const rangeMinX = 0 - rangeMaxX\n\n const rangeMaxY = (rangeY / 2)\n const rangeMinY = 0 - rangeMaxY\n\n return {\n rangeMaxX,\n rangeMinX,\n rangeMaxY,\n rangeMinY,\n }\n}\n\nfunction clamp(value, min, max) {\n return Math.min(Math.max(min, value), max)\n}\n\n\n\nlet minScale = 1;\nlet maxScale = 8;\n\n\n\nfunction Editor({ onChange, backgroundURL, backgroundRatio, frameURL, hashtagURL }) {\n const editorRef = useRef(null)\n const backgroundImageRef = useRef(null)\n\n const [hammer_got_init, set_hammer_got_init] = useState(false)\n\n const [hammertime, set_hammertime] = useState(null)\n const [hamster, set_hamster] = useState(null)\n\n const [x, set_x] = useState(0)\n const [y, set_y] = useState(0)\n const [add_x, set_add_x] = useState(0)\n const [add_y, set_add_y] = useState(0)\n const [scale, set_scale] = useState(1)\n // const [add_scale, set_add_scale] = useState(0)\n\n const [photoWidth, setPhotoWidth] = useState(300)\n const [photoHeight, setPhotoHeight] = useState(300)\n const [editorWidth, setEditorWidth] = useState(300)\n const [editorHeight, setEditorHeight] = useState(300)\n\n const [rangeMinX, set_rangeMinX] = useState(0)\n const [rangeMinY, set_rangeMinY] = useState(0)\n const [rangeMaxX, set_rangeMaxX] = useState(0)\n const [rangeMaxY, set_rangeMaxY] = useState(0)\n\n useEffect(() => {\n if (!!onChange) {\n onChange({ x, y, scale})\n }\n }, [onChange, x, y, scale])\n\n useEffect(() => {\n if (!!editorRef && !!editorRef.current) {\n const new_editorWidth = editorRef.current.offsetWidth\n const new_editorHeight = editorRef.current.offsetHeight\n setEditorHeight(new_editorHeight)\n setEditorWidth(new_editorWidth)\n\n let new_photoWidth = 1\n let new_photoHeight = 1\n if (backgroundRatio < 1) {\n new_photoWidth = 1 / backgroundRatio\n } else if (backgroundRatio > 1) {\n new_photoHeight = 1 * backgroundRatio\n }\n\n setPhotoWidth(new_photoWidth)\n setPhotoHeight(new_photoHeight)\n }\n }, [backgroundRatio])\n\n useEffect(() => {\n const {\n rangeMinX,\n rangeMinY,\n rangeMaxX,\n rangeMaxY,\n } = updateRange(photoWidth * editorWidth, photoHeight * editorHeight, scale, editorWidth, editorHeight)\n\n set_rangeMinX(rangeMinX)\n set_rangeMinY(rangeMinY)\n set_rangeMaxX(rangeMaxX)\n set_rangeMaxY(rangeMaxY)\n }, [\n photoWidth,\n photoHeight,\n editorWidth,\n editorHeight,\n scale,\n ])\n\n useEffect(() => {\n set_x(0)\n set_y(0)\n set_add_x(0)\n set_add_y(0)\n set_scale(1)\n }, [backgroundURL])\n\n const handleMove = useCallback(event => {\n const prev_x = event.target.dataset.x * 1\n const prev_y = event.target.dataset.y * 1\n\n const new_x = clamp(prev_x + event.deltaX, rangeMinX, rangeMaxX)\n const new_y = clamp(prev_y + event.deltaY, rangeMinY, rangeMaxY)\n\n if (event.isFinal) {\n set_x(new_x || 0)\n set_y(new_y || 0)\n set_add_x(0)\n set_add_y(0)\n }else{\n set_add_x(new_x - prev_x || 0)\n set_add_y(new_y - prev_y || 0)\n }\n }, [\n rangeMinX,\n rangeMinY,\n rangeMaxX,\n rangeMaxY,\n ])\n\n const handleScale = useCallback((event, delta, deltaX, deltaY) => {\n event.preventDefault()\n\n const prev_scale = event.target.dataset.scale * 1\n const new_scale = clamp(prev_scale + delta / 200, minScale, maxScale)\n set_scale(new_scale || 1)\n\n const prev_x = event.target.dataset.x * 1\n const prev_y = event.target.dataset.y * 1\n set_x(clamp(prev_x, rangeMinX, rangeMaxX) || 0)\n set_y(clamp(prev_y, rangeMinY, rangeMaxY) || 0)\n }, [\n rangeMinX,\n rangeMinY,\n rangeMaxX,\n rangeMaxY,\n ])\n\n useEffect(() => {\n if (!hammer_got_init && !!editorRef && !!editorRef.current) {\n const element = editorRef.current\n\n element.addEventListener('mousedown', event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n element.addEventListener(\"touchstart\", event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n element.addEventListener(\"touchend\", event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n element.addEventListener(\"touchmove\", event => {\n event.preventDefault()\n // event.stopPropagation()\n }, false)\n\n set_hammertime(new Hammer(element, {\n direction: 'DIRECTION_ALL',\n }))\n\n set_hamster(Hamster(element))\n\n set_hammer_got_init(true)\n }\n }, [editorRef, hammer_got_init])\n\n useEffect(() => {\n if (!!hammertime && !!hamster && hammer_got_init && !!editorRef && !!editorRef.current) {\n hammertime.on('pan', handleMove)\n hamster.wheel(handleScale)\n\n return function () {\n hammertime.off('pan', handleMove)\n hamster.unwheel()\n }\n }\n }, [editorRef, handleMove, handleScale, hammer_got_init, hammertime, hamster])\n\n return (\n \n )\n}\n\nexport default Editor\n","export default __webpack_public_path__ + \"static/media/HeaderImage.1f39a672.svg\";","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABDgAAAQ4AgMAAACRfoQcAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAJUExURVIud1Iud1Eudgy0J+8AAAADdFJOU//+/Q3dsqEAAATsSURBVHgB7dAxAQAABAAwQtI/ipMCvi3CgiMV6NChQ4cOHTp06NChQ4cOHTp06NChAx06dOjQoUOHDh06dOjQoUOHDh06dOhAhw4dOnTo0KFDhw4dOnTo0KFDhw4dOtChQ4cOHTp06NChQ4cOHTp06NChQ4cOdOjQoUOHDh06dOjQoUOHDh06dOjQoQMdOnTo0KFDhw4dOnTo0KFDhw4dOnToQIcOHTp06NChQ4cOHTp06NChQ4cOHejQoUOHDh06dOjQoUOHDh06dOjQoUMHOnTo0KFDhw4dOnTo0KFDhw4dOnTo0IEOHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06NChQIcOHTp06NChQ4cOHTp06NChQ4cOHejQoUOHDh06dOjQoUOHDh06dOjQoUMHOnTo0KFDhw4dOnTo0KFDhw4dOnTo0IEOHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06ECHDh06dOjQoUOHDh06dOjQoUOHDh060KFDhw4dOnTo0KFDhw4dOnTo0KFDhw506NChQ4cOHTp06NChQ4cOHTp06NChAx06dOjQoUOHDh06dOjQoUOHDh06dOhAhw4dOnTo0KFDhw4dOnTo0KFDhw4dOtChQ4cOHTp06NChQ4cOHTp06NChQ4cOBTp06NChQ4cOHTp06NChQ4cOHTp06ECHDh06dOjQoUOHDh06dOjQoUOHDh060KFDhw4dOnTo0KFDhw4dOnTo0KFDhw506NChQ4cOHTp06NChQ4cOHTp06NChAx06dOjQoUOHDh06dOjQoUOHDh06dOhAhw4dOnTo0KFDhw4dOnTo0KFDhw4dOtChQ4cOHTp06NChQ4cOHTp06NChQwc6dOjQoUOHDh06dOjQoUOHDh06dOjQgQ4dOnTo0KFDhw4dOnTo0KFDhw4dOnSgQ4cOHTp06NChQ4cOHTp06NChQ4cOHTx06NChQ4cOdOjQoUOHDh06dOjQoUOHDh06dOjQoQMdOnTo0KFDhw4dOnTo0KFDhw4dOnToQIcOHTp06NChQ4cOHTp06NChQ4cOHTrQoUOHDh06dOjQoUOHDh06dOjQoUOHDnTo0KFDhw4dOnTo0KFDhw4dOnTo0KEDHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06NCBDh06dOjQoUOHDh06dOjQoUOHDh06dKBDhw4dOnTo0KFDhw4dOnTo0KFDhw4d6NChQ4cOHTp06NChQ4cOHTp06NChQ4cCHTp06NChQ4cOHTp06NChQ4cOHTp0oEOHDh06dOjQoUOHDh06dOjQoUOHDh3o0KFDhw4dOnTo0KFDhw4dOnTo0KFDBzp06NChQ4cOHTp06NChQ4cOHTp06NCBDh06dOjQoUOHDh06dOjQoUOHDh06dKBDhw4dOnTo0KFDhw4dOnTo0KFDhw4dxeoB30xd38yzCvgAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAALSURBVHgBY2BgAAAAAwABjPg5OgAAAABJRU5ErkJggg==\"","import React, { useEffect, useState } from 'react'\n\n// https://projectfluent.org/play/\n\n// import {LocalizationProvider,Localized} from '@fluent/react' // '@fluent/react/compat'\nimport { ReactLocalization, LocalizationProvider } from '@fluent/react'\nimport { FluentBundle, FluentResource } from '@fluent/bundle'\nimport { negotiateLanguages } from '@fluent/langneg'\n\n\nexport const locales = {\n de: 'Deutsch',\n en: 'English',\n}\n\nconst _supportedLocales_ = Object.keys(locales)\nconst _defaultLocale_ = 'en'\n\n\nasync function fetchMessages(locale) {\n const path = await import('./locales/' + locale + '.ftl')\n\n const response = await fetch(path.default)\n const messages = await response.text()\n\n return { [locale]: new FluentResource(messages) }\n}\n\nfunction getDefaultBundles() {\n const bundle = new FluentBundle('')\n bundle.addResource(new FluentResource(''))\n return new ReactLocalization([bundle])\n}\n\nasync function createMessagesGenerator(currentLocales) {\n const fetched = await Promise.all(\n currentLocales.map(fetchMessages)\n )\n const messages = fetched.reduce(\n (obj, cur) => Object.assign(obj, cur)\n )\n\n return function* generateBundles() {\n for (const locale of currentLocales) {\n const bundle = new FluentBundle(locale)\n bundle.addResource(messages[locale])\n yield bundle\n }\n }\n}\n\nexport function AppLocalizationProvider({ userLocales, children, onLocaleChange }){\n const [bundles, setBundles] = useState(getDefaultBundles())\n\n useEffect(() => {\n async function loadBundles() {\n const currentLocales = negotiateLanguages(\n userLocales,\n _supportedLocales_,\n { defaultLocale: _defaultLocale_ }\n )\n \n if (!!onLocaleChange) {\n onLocaleChange(currentLocales)\n }\n\n const generateBundles = await createMessagesGenerator(currentLocales)\n setBundles( new ReactLocalization(generateBundles()) )\n }\n loadBundles()\n }, [userLocales, onLocaleChange])\n\n if (!bundles) {\n // Show a loader.\n return Loading texts…
\n }\n\n return \n {children}\n \n}\n\n","import { useState, useCallback } from 'react'\nimport './App.css'\nimport { useDropzone } from 'react-dropzone'\nimport mergeImages from 'merge-images'\nimport FrameChooser from './FrameChooser.js'\nimport HashtagChooser from './HashtagChooser.js'\nimport Editor from './Editor.js'\nimport HeaderImage from './HeaderImage.svg'\nimport purpleBG from './purpleBG.png'\nimport empty_1x1 from './empty_1x1.png'\n\nimport 'intl-pluralrules'\nimport { AppLocalizationProvider, locales } from './l10n.js'\nimport { withLocalization, Localized } from './Localized.js'\n\n\nconst frameSize = 1080\n\nfunction getOrientation(file, callback) {\n // Source: http://stackoverflow.com/a/32490603\n // (With some modifications: I just made the code fit the style-guide.)\n const reader = new FileReader()\n\n reader.onload = function (event) {\n const view = new DataView(event.target.result)\n\n if (view.getUint16(0, false) !== 0xFFD8) {\n return callback(-2)\n }\n\n const length = view.byteLength\n let offset = 2\n\n while (offset < length) {\n const marker = view.getUint16(offset, false)\n offset += 2\n\n if (marker === 0xFFE1) {\n if (view.getUint32(offset += 2, false) !== 0x45786966) {\n return callback(-1)\n }\n const little = view.getUint16(offset += 6, false) === 0x4949\n offset += view.getUint32(offset + 4, little)\n const tags = view.getUint16(offset, little)\n offset += 2\n\n for (var i = 0; i < tags; i++) {\n if (view.getUint16(offset + (i * 12), little) === 0x0112) {\n return callback(view.getUint16(offset + (i * 12) + 8, little))\n }\n }\n } else if ((marker & 0xFF00) !== 0xFF00) {\n break\n } else {\n offset += view.getUint16(offset, false)\n }\n }\n return callback(-1)\n }\n\n reader.readAsArrayBuffer(file.slice(0, 64 * 1024))\n}\n\nfunction trigger_download(name, data){\n const a = document.createElement('a')\n document.body.appendChild(a)\n // a.target = '_blank'\n a.download = name\n a.href = data\n a.click()\n a.remove()\n}\n\nfunction App({ getString }) { \n const [frameURL, setFrameURL] = useState(null)\n const [hashtagURL, setHashtagURL] = useState(null)\n const [originalPhoto, setOriginalPhoto] = useState(null)\n const [originalPhotoRation, setOriginalPhotoRation] = useState(1)\n const [orientation, set_orientation] = useState(null)\n\n\n // const [combinedImage, set_combinedImage] = useState(null)\n\n const [width, set_width] = useState(0)\n const [height, set_height] = useState(0)\n\n const [cords, setCords] = useState({x:0, y:0, scale:1})\n\n const handleFrameURL = useCallback(newFrameURL => {\n setFrameURL(newFrameURL)\n }, [setFrameURL])\n\n const handleHashtagURL = useCallback(newHashtagURL => {\n setHashtagURL(newHashtagURL)\n }, [setHashtagURL])\n\n const handleCordsChange = useCallback(({x, y, scale}) => {\n setCords({ x, y, scale })\n }, [])\n\n const handleReadFile = useCallback(file => {\n if (!(!!file)) {\n return;\n }\n\n const reader = new FileReader()\n reader.onload = reader_event => {\n const img = new Image()\n img.onload = function () {\n let width, height;\n if (img.width < img.height) {\n height = (img.height / img.width) * frameSize\n width = frameSize\n } else {\n height = frameSize\n width = (img.width / img.height) * frameSize\n }\n\n getOrientation(file, new_orientation => {\n let original_ration = 1\n // use the correct image orientation\n switch (new_orientation) {\n // Source: https://stackoverflow.com/a/30242954/2387277\n // Source: https://stackoverflow.com/questions/19463126/how-to-draw-photo-with-correct-orientation-in-canvas-after-capture-photo-by-usin\n case 2:\n // horizontal flip\n original_ration = height / width\n break\n case 3:\n // 180° rotate left\n original_ration = height / width\n break\n case 4:\n // vertical flip\n original_ration = height / width\n break\n case 5:\n // vertical flip + 90 rotate right\n original_ration = width / height\n break\n case 6:\n // 90° rotate right\n original_ration = width / height\n break\n case 7:\n // horizontal flip + 90 rotate right\n original_ration = width / height\n break\n case 8:\n // 90° rotate left\n original_ration = width / height\n break\n default:\n original_ration = height / width\n break\n }\n\n set_width(width)\n set_height(height)\n setOriginalPhoto(reader_event.target.result)\n set_orientation(new_orientation)\n setOriginalPhotoRation(original_ration)\n })\n }\n img.src = reader_event.target.result\n }\n reader.readAsDataURL(file)\n }, [])\n\n const handleImage = useCallback(files_event => {\n handleReadFile(files_event.target.files[0])\n }, [handleReadFile])\n\n const onDrop = useCallback(acceptedFiles => {\n handleReadFile(acceptedFiles[0])\n }, [handleReadFile])\n\n const handleDownload = useCallback(() => {\n const img = new Image()\n img.onload = function () {\n const canvas = document.createElement('canvas')\n canvas.width = frameSize\n canvas.height = frameSize\n\n const ctx = canvas.getContext('2d', { alpha: true })\n\n // use the correct image orientation\n switch (orientation) {\n // Source: https://stackoverflow.com/a/30242954/2387277\n // Source: https://stackoverflow.com/questions/19463126/how-to-draw-photo-with-correct-orientation-in-canvas-after-capture-photo-by-usin\n case 2:\n // horizontal flip\n ctx.translate(canvas.width, 0)\n ctx.scale(-1, 1)\n break\n case 3:\n // 180° rotate left\n ctx.translate(canvas.width, canvas.height)\n ctx.rotate(Math.PI)\n break\n case 4:\n // vertical flip\n ctx.translate(0, canvas.height)\n ctx.scale(1, -1)\n break\n case 5:\n // vertical flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI)\n ctx.scale(1, -1)\n break\n case 6:\n // 90° rotate right\n ctx.rotate(0.5 * Math.PI)\n ctx.translate(0, -canvas.height)\n break\n case 7:\n // horizontal flip + 90 rotate right\n ctx.rotate(0.5 * Math.PI)\n ctx.translate(canvas.width, -canvas.height)\n ctx.scale(-1, 1)\n break\n case 8:\n // 90° rotate left\n ctx.rotate(-0.5 * Math.PI)\n ctx.translate(-canvas.width, 0)\n break\n default:\n break\n }\n\n\n const width_scaled = width * cords.scale\n const height_scaled = height * cords.scale\n\n ctx.drawImage(\n img,\n cords.x * 3.5 + (frameSize - width_scaled) * 0.5,\n cords.y * 3.5 + (frameSize - height_scaled) * 0.5,\n width_scaled,\n height_scaled,\n )\n // ctx.drawImage(\n // img,\n // ((frameSize - width_scaled) * 0.5),\n // ((frameSize - height_scaled) * 0.5),\n // width_scaled,\n // height_scaled,\n // )\n\n const pngUrl = canvas.toDataURL()\n\n mergeImages([\n purpleBG,\n ...(pngUrl ? [pngUrl] : []),\n ...(frameURL ? [frameURL] : []),\n ...(hashtagURL ? [hashtagURL] : []),\n ])\n .then(b64 => {\n // set_combinedImage(b64)\n trigger_download('volt-profile-picture.png', b64)\n })\n\n }\n img.src = originalPhoto\n }, [\n originalPhoto,\n cords.x,\n cords.y,\n cords.scale,\n orientation,\n frameURL,\n hashtagURL,\n height,\n width,\n ])\n\n const { isDragActive, getRootProps } = useDropzone({\n onDrop,\n accept: 'image/*',\n maxFiles: 1,\n noKeyboard: true,\n })\n\n\n return (\n \n
\n\n
\n \n
\n\n
\n
\n\n
\n {!!originalPhoto ? : null}\n {!!originalPhoto ? getString('button_change_photo') : getString('button_load_photo') } \n \n \n\n {true || !!originalPhoto ? (<>\n
\n
\n
\n
\n >) : null}\n\n {!!originalPhoto && !!frameURL && !!handleHashtagURL ? (<>\n
\n {/*\n
Edit your Photo: \n
Your can reposition the image and scale it. Use pinch-to-zoom or scroll to scale.
\n */}\n\n
\n\n
\n >) : null}\n\n
\n
\n )\n}\nconst AppLocalized = withLocalization(App)\n\n\nfunction AppWrapper() {\n const [userLocales, setUserLocales] = useState(navigator.languages)\n const [currentLocale, setCurrentLocale] = useState(null)\n\n const handleLanguageChange = useCallback(event => {\n setUserLocales([event.target.dataset.locale])\n }, [setUserLocales])\n\n const handleCurrentLocalesChange = useCallback(currentLocales => {\n setCurrentLocale(currentLocales.length > 0 ? currentLocales[0] : '')\n }, [setCurrentLocale])\n\n return \n <>\n \n\n \n {\n Object.entries(locales)\n .map(([locale, name]) => {\n return \n {name}\n \n })\n }\n
\n >\n \n}\nexport default withLocalization(AppWrapper)\n\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry)\n getFID(onPerfEntry)\n getFCP(onPerfEntry)\n getLCP(onPerfEntry)\n getTTFB(onPerfEntry)\n })\n }\n}\n\nexport default reportWebVitals\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport App from './App'\nimport reportWebVitals from './reportWebVitals'\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n)\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals()\n"],"sourceRoot":""}
\ No newline at end of file