-
Notifications
You must be signed in to change notification settings - Fork 0
/
584.js.map
1 lines (1 loc) · 106 KB
/
584.js.map
1
{"version":3,"file":"584.js","mappings":"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","sources":["webpack://@lenna-proj/lenna-web/./src/components/ImageUploadPreview.vue?39cf","webpack://@lenna-proj/lenna-web/./src/views/Process.vue?060f","webpack://@lenna-proj/lenna-web/./src/bootstrap.ts","webpack://@lenna-proj/lenna-web/./src/controllers/plugin_manager.ts","webpack://@lenna-proj/lenna-web/./src/controllers/processor.ts","webpack://@lenna-proj/lenna-web/./src/controllers/storage.ts","webpack://@lenna-proj/lenna-web/./src/router.ts","webpack://@lenna-proj/lenna-web/./src/components/Navbar.vue","webpack://@lenna-proj/lenna-web/./src/components/Navbar.vue?fb62","webpack://@lenna-proj/lenna-web/./src/components/Navbar.vue?75b5","webpack://@lenna-proj/lenna-web/./src/components/Footer.vue","webpack://@lenna-proj/lenna-web/./src/components/Footer.vue?ff87","webpack://@lenna-proj/lenna-web/./src/components/Footer.vue?162e","webpack://@lenna-proj/lenna-web/./src/App.vue","webpack://@lenna-proj/lenna-web/./src/App.vue?3b2b","webpack://@lenna-proj/lenna-web/./src/components/ConfigComp.vue","webpack://@lenna-proj/lenna-web/./src/components/ConfigComp.vue?e61b","webpack://@lenna-proj/lenna-web/./src/controllers/config_generator.ts","webpack://@lenna-proj/lenna-web/./src/components/ConfigComp.vue?146c","webpack://@lenna-proj/lenna-web/./src/components/DownloadButton.vue","webpack://@lenna-proj/lenna-web/./src/components/DownloadButton.vue?868f","webpack://@lenna-proj/lenna-web/./src/components/DownloadButton.vue?90bb","webpack://@lenna-proj/lenna-web/./src/components/Help.vue","webpack://@lenna-proj/lenna-web/./src/components/Help.vue?ed81","webpack://@lenna-proj/lenna-web/./src/components/ImageUploadPreview.vue?ef84","webpack://@lenna-proj/lenna-web/./src/components/PluginsManager.vue","webpack://@lenna-proj/lenna-web/./src/plugins/Plugin.vue","webpack://@lenna-proj/lenna-web/./src/plugins/Blur.vue","webpack://@lenna-proj/lenna-web/./src/plugins/Blur.vue?a315","webpack://@lenna-proj/lenna-web/./src/plugins/Blur.vue?a574","webpack://@lenna-proj/lenna-web/./src/plugins/Canny.vue","webpack://@lenna-proj/lenna-web/./src/plugins/Canny.vue?f4b3","webpack://@lenna-proj/lenna-web/./src/plugins/Canny.vue?9ae2","webpack://@lenna-proj/lenna-web/./src/plugins/Rotate.vue","webpack://@lenna-proj/lenna-web/./src/plugins/Rotate.vue?0975","webpack://@lenna-proj/lenna-web/./src/plugins/Rotate.vue?d5fd","webpack://@lenna-proj/lenna-web/./src/components/Checkbox.vue","webpack://@lenna-proj/lenna-web/./src/components/Checkbox.vue?3095","webpack://@lenna-proj/lenna-web/./src/components/Checkbox.vue?4fbc","webpack://@lenna-proj/lenna-web/./src/components/PluginTitle.vue","webpack://@lenna-proj/lenna-web/./src/components/PluginTitle.vue?5bb0","webpack://@lenna-proj/lenna-web/./src/components/PluginTitle.vue?7dc2","webpack://@lenna-proj/lenna-web/./src/components/Icon.vue?62a3","webpack://@lenna-proj/lenna-web/./src/components/Icon.vue?433b","webpack://@lenna-proj/lenna-web/./src/components/Icon.vue","webpack://@lenna-proj/lenna-web/./src/plugins/Plugin.vue?079a","webpack://@lenna-proj/lenna-web/./src/plugins/Plugin.vue?7945","webpack://@lenna-proj/lenna-web/./src/components/PluginsManager.vue?d84f","webpack://@lenna-proj/lenna-web/./src/components/PluginsManager.vue?4be4","webpack://@lenna-proj/lenna-web/./src/views/About.vue","webpack://@lenna-proj/lenna-web/./src/views/About.vue?99e7","webpack://@lenna-proj/lenna-web/./src/views/About.vue?b54e","webpack://@lenna-proj/lenna-web/./src/views/Home.vue","webpack://@lenna-proj/lenna-web/./src/components/Mountains.vue","webpack://@lenna-proj/lenna-web/./src/components/Mountains.vue?e458","webpack://@lenna-proj/lenna-web/./src/components/AboutProject.vue","webpack://@lenna-proj/lenna-web/./src/components/HowToTile.vue","webpack://@lenna-proj/lenna-web/./src/components/HowToTile.vue?07e9","webpack://@lenna-proj/lenna-web/./src/components/HowToTile.vue?38b5","webpack://@lenna-proj/lenna-web/./src/components/AboutProject.vue?4924","webpack://@lenna-proj/lenna-web/./src/components/AboutProject.vue?1615","webpack://@lenna-proj/lenna-web/./src/components/HowToConvert.vue","webpack://@lenna-proj/lenna-web/./src/components/HowToConvert.vue?3e59","webpack://@lenna-proj/lenna-web/./src/components/HowToConvert.vue?9f5d","webpack://@lenna-proj/lenna-web/./src/views/Home.vue?58e5","webpack://@lenna-proj/lenna-web/./src/views/Home.vue?caea","webpack://@lenna-proj/lenna-web/./src/views/Process.vue?7e21","webpack://@lenna-proj/lenna-web/./src/components/ImageUploadPreview.vue","webpack://@lenna-proj/lenna-web/./src/views/Process.vue"],"sourcesContent":["\nimport { defineComponent } from \"vue\";\nimport FileUpload from \"vue-upload-component\";\nimport DownloadButton from \"./DownloadButton.vue\";\nimport VueEasyLightbox from \"vue-easy-lightbox\";\nimport { saveAs } from \"file-saver\";\nimport JSZip from \"jszip\";\nimport { useToast } from \"vue-toastification\";\nimport { convert } from \"@lenna-proj/lenna-cli\";\nimport { ImageSource } from \"../models/image\";\n\ndeclare interface FileOption {\n text: string;\n value: string;\n}\n\ndeclare interface ImageUploadPreviewData {\n files: Object[];\n imgs: string[];\n visible: boolean;\n index: number;\n filetype: string;\n options: Array<FileOption>;\n}\n\nexport default defineComponent({\n components: {\n FileUpload,\n DownloadButton,\n VueEasyLightbox,\n },\n props: {\n images: {\n type: Array as () => Array<ImageSource>,\n required: true,\n },\n },\n data(): ImageUploadPreviewData {\n return {\n files: [],\n imgs: [],\n visible: false,\n index: 0,\n filetype: \"png\",\n options: [\n { text: \"png\", value: \"png\" },\n { text: \"jpg\", value: \"jpg\" },\n { text: \"bmp\", value: \"bmp\" },\n { text: \"ico\", value: \"ico\" },\n { text: \"gif\", value: \"gif\" },\n ],\n };\n },\n methods: {\n // eslint-disable-next-line no-unused-vars\n inputFile(newFile: any, oldFile: any, prevent: any) {\n //this.images.push(newFile.url);\n this.imgs = [newFile.url];\n this.$emit(\"changeImage\", newFile);\n },\n inputFilter(newFile: any, oldFile: any, prevent: any) {\n if (newFile && !oldFile) {\n if (!/\\.(gif|jpg|jpeg|png|webp)$/i.test(newFile.name)) {\n alert(\"Your choice is not a picture\");\n return prevent();\n }\n }\n if (newFile && (!oldFile || newFile.file !== oldFile.file)) {\n newFile.url = \"\";\n let URL = window.URL || window.webkitURL;\n if (URL && URL.createObjectURL) {\n newFile.url = URL.createObjectURL(newFile.file);\n }\n }\n },\n createObjectURL(image: ImageSource) {\n return URL.createObjectURL(image);\n },\n async safeImage(file: any, format: string) {\n let data = await file\n .arrayBuffer()\n .then((image: any) => new Uint8Array(image));\n return convert(data, format);\n },\n async downloadZip() {\n let zip = new JSZip();\n const toast = useToast();\n const imageCount = this.images.length;\n if (imageCount < 1) {\n return;\n }\n let compressedCount = 0;\n toast.info(`compressing of ${this.images.length} images started`);\n let promises = this.images.map((image: ImageSource) => {\n let type = `image/${this.filetype}`;\n\n return this.safeImage(image, this.filetype).then((compressed_image) => {\n let file = new File([compressed_image], image.name, { type });\n compressedCount++;\n toast.success(\n `compressed ${image.name} ${compressedCount} / ${imageCount} images`\n );\n return zip.file(\n `${image.name.replace(/(\\.[^/.]+)+$/, \"\")}.${this.filetype}`,\n file\n );\n });\n });\n await Promise.all(promises);\n zip.generateAsync({ type: \"blob\" }).then(function (blob) {\n saveAs(blob, \"images.zip\");\n });\n },\n show() {\n this.visible = true;\n },\n showImg(index: any) {\n this.index = index;\n this.visible = true;\n },\n handleHide() {\n this.visible = false;\n },\n },\n watch: {\n $props: {\n handler() {\n this.imgs = [];\n this.index = 0;\n this.images.forEach((image) => {\n this.imgs = [this.createObjectURL(image)];\n });\n },\n deep: true,\n immediate: true,\n },\n },\n});\n","\nimport { defineComponent, ref } from \"vue\";\nimport * as NProgress from \"nprogress\";\nimport { Slide } from \"vue3-burger-menu\";\nimport { useToast } from \"vue-toastification\";\nimport PluginsManager from \"../components/PluginsManager.vue\";\nimport ImageUploadPreview from \"../components/ImageUploadPreview.vue\";\nimport ConfigComp from \"../components/ConfigComp.vue\";\nimport Help from \"../components/Help.vue\";\nimport { PluginManager } from \"../controllers/plugin_manager\";\nimport { Image, ImageSource } from \"../models/image\";\nimport { processImages } from \"../controllers/processor\";\nimport { listPlugins } from \"../controllers/storage\";\n\nexport declare interface HomeData {\n pluginUrl: string;\n just: string | null;\n defaultConfig: [];\n defaultPlugins: string[];\n sourceImages: Image[];\n resultImages: ImageSource[];\n pluginManager: PluginManager;\n}\n\nexport default defineComponent({\n name: \"Process\",\n components: {\n Slide,\n PluginsManager,\n ImageUploadPreview,\n ConfigComp,\n Help,\n },\n data(): HomeData {\n return {\n pluginUrl: \"\",\n just: null,\n defaultConfig: [],\n defaultPlugins: [],\n sourceImages: [],\n resultImages: [],\n pluginManager: new PluginManager(\"\"),\n };\n },\n setup: () => {\n const pluginsManager = ref(PluginsManager);\n return {\n pluginsManager,\n };\n },\n created() {\n if (this.$route.query[\"config\"]) {\n this.defaultConfig = JSON.parse(\n // eslint-disable-next-line no-undef\n Buffer.from(this.$route.query[\"config\"].toString(), \"base64\").toString(\n \"binary\"\n )\n );\n console.log(this.defaultConfig);\n }\n if (this.$route.query.plugin) {\n this.defaultPlugins = [this.$route.query.plugin.toString()];\n }\n if (this.$route.query.just) {\n this.pluginManager.filter = this.$route.query.just.toString();\n this.just = this.$route.query.just.toString();\n }\n this.loadDefaultPluginsMap();\n this.loadDefaultPluginJson();\n this.loadAddedPlugins();\n },\n methods: {\n loadPlugin(pluginUrl: string) {\n console.log(\"loaded plugin: \", pluginUrl);\n this.pluginManager.importPlugin(pluginUrl, pluginUrl);\n },\n\n loadDefaultPluginsMap() {\n this.pluginManager.importPluginMap(\n \"https://lenna.app/lenna-plugins/importmap.json\"\n );\n },\n loadDefaultPluginJson() {\n this.pluginManager.importPluginsJson(\n \"/plugins.json\"\n );\n },\n loadAddedPlugins() {\n listPlugins().forEach((plugin) => {\n this.pluginManager.importPlugin(plugin, plugin);\n });\n },\n onMorePlugins() {\n window.location.replace(\"/marketplace\");\n },\n changeImages(files: any) {\n this.sourceImages = [files.file];\n this.processImages();\n },\n async processImages() {\n NProgress.configure({ parent: \"#process\" });\n NProgress.start();\n\n await processImages(\n this.sourceImages,\n this.resultImages,\n this.pluginManager.getPlugins(),\n {\n info: (message: string) => {},\n success: (message: string) => {},\n },\n NProgress.set\n );\n NProgress.done();\n NProgress.remove();\n },\n },\n});\n","import { createApp } from \"vue\";\nimport App from \"./App.vue\";\nimport route from \"./router\"\nimport \"./styles/index.scss\";\n\nimport Toast, { POSITION } from \"vue-toastification\";\nimport \"vue-toastification/dist/index.css\";\n\ncreateApp(App)\n .use(route)\n .use(Toast, { position: POSITION.TOP_LEFT })\n .mount(\"#app\");\n","import { LennaPlugin } from '../models/plugin';\nimport { PluginModule } from '../models/plugin_module';\nimport { Config } from '../models/config';\nimport { loadConfig } from \"../controllers/storage\";\n\nexport class PluginManager {\n\n configs: Config[] = []\n plugins: LennaPlugin[] = []\n\n filter: string = \"\"\n\n constructor(filter: string) {\n this.filter = filter;\n }\n\n async importPlugin(key: string, url: string) {\n // eslint-disable-next-line no-undef\n return System.import(url).then(async (module: any) => {\n // eslint-disable-next-line no-undef\n await module.init(__webpack_require__.S[\"default\"]);\n return module.get(\"default\").then((plugin: Function) => {\n this.importModule(key, url, plugin());\n });\n });\n }\n\n async importModule(key: string, url: string, module: PluginModule) {\n const pluginConfig = loadConfig({\n name: key,\n url: url,\n plugin: module,\n enabled: false,\n config: {},\n });\n if (this.filter.length > 0) {\n if (pluginConfig.name.includes(this.filter)) {\n pluginConfig.enabled = true;\n this.configs.push({\n name: pluginConfig.name,\n enabled: true,\n config: pluginConfig.config,\n });\n this.plugins.push(pluginConfig);\n }\n } else {\n this.plugins.push(pluginConfig);\n }\n }\n\n async importPluginMap(mapUrl: string) {\n const tasks = [];\n const res = await fetch(mapUrl);\n const data = await res.json();\n for (const key in data.imports) {\n const url = data.imports[key];\n tasks.push(\n System.import(key).then((plugin: PluginModule) => {\n return this.importModule(key, url, plugin);\n })\n );\n }\n return Promise.all(tasks);\n }\n\n async importPluginsJson(jsonUrl: string) {\n const tasks = [];\n const res = await fetch(jsonUrl);\n const data = await res.json();\n for (const key in data.plugins) {\n const url = data.plugins[key];\n tasks.push(this.importPlugin(key, url));\n }\n return Promise.all(tasks);\n }\n\n changeConfig(name: string, config: Object) {\n const plugin = this.plugins.find((o: LennaPlugin) => o.name === name);\n if (plugin) {\n plugin.config = config;\n }\n }\n\n getPlugins(): LennaPlugin[] {\n return this.plugins;\n }\n}\n","import { LennaPlugin } from \"../models/plugin\";\nimport { Logger } from \"../models/logger\";\nimport { Image } from \"../models/image\";\n\nconst processImages = async (sourceImages: Image[], resultImages: Image[], plugins: LennaPlugin[], logger: Logger, progressCallback: Function) => {\n\n const imageCount = sourceImages.length;\n let convertedCount = 0;\n logger.info(`converting ${imageCount} images started`);\n resultImages.length = 0;\n const tasks = [];\n for (const sourceImage of sourceImages) {\n tasks.push(\n processImage(sourceImage, plugins, progressCallback).then((image) => {\n const file = new File([image], sourceImage.name, {\n type: \"image/png\",\n });\n resultImages.push(file);\n convertedCount++;\n logger.success(\n `converted ${convertedCount} of ${imageCount} images`\n );\n })\n );\n }\n return Promise.all(tasks).then(() => {\n logger.info(`converted ${convertedCount} images`);\n });\n}\n\n\nconst processImage = async (imageFile: any, plugins: LennaPlugin[], progressCallback: Function) => {\n let progress = 0.0;\n let img = new Uint8Array(await imageFile.arrayBuffer());\n for (const plugin of plugins) {\n progressCallback(progress);\n progress += 1 / plugins.length;\n if (plugin.enabled) {\n img = await plugin.plugin?.process(plugin.config, img);\n }\n }\n progressCallback(1.0);\n return img;\n}\n\nexport { processImages, processImage }\n","import { LennaPlugin } from \"../models/plugin\";\nimport { Config } from \"../models/config\";\n\nconst saveConfig = (plugin: LennaPlugin) => {\n const config: Config = {\n name: plugin.name,\n enabled: plugin.enabled,\n config: plugin.config,\n };\n localStorage.setItem(plugin.name, JSON.stringify(config));\n};\n\nconst loadConfig = (plugin: LennaPlugin): LennaPlugin => {\n const savedConfig = localStorage.getItem(plugin.name);\n if (savedConfig) {\n const config: Config = JSON.parse(savedConfig);\n plugin.enabled = config.enabled;\n plugin.config = Object.assign(plugin.config, config.config);\n }\n return plugin;\n};\n\nconst loadConfigFromParams = (plugin: LennaPlugin, params: Config[]): LennaPlugin => {\n params.forEach((config: Config) => {\n if (config.name === plugin.name) {\n plugin.enabled = config.enabled;\n plugin.config = Object.assign(plugin.config, config.config);\n }\n });\n return plugin;\n};\n\nconst addPlugin = (plugin: string) => {\n const plugins: string[] = JSON.parse(localStorage.getItem(\"plugins\") || \"[]\");\n if (!plugins.includes(plugin)) {\n plugins.push(plugin);\n localStorage.setItem(\"plugins\", JSON.stringify(plugins));\n }\n};\n\nconst listPlugins = (): string[] => {\n const plugins = localStorage.getItem(\"plugins\") || \"[]\";\n return JSON.parse(plugins);\n}\n\nexport { saveConfig, loadConfig, loadConfigFromParams, addPlugin, listPlugins };\n","import { createWebHistory, createRouter } from \"vue-router\";\nimport Home from \"@/views/Home.vue\";\nimport Process from \"@/views/Process.vue\";\nimport About from \"@/views/About.vue\";\n\nconst routes = [\n {\n path: \"/\",\n name: \"Home\",\n component: Home,\n },\n {\n path: \"/process\",\n name: \"Process\",\n component: Process,\n },\n {\n path: \"/about\",\n name: \"About\",\n component: About,\n },\n {\n path: \"/just/${just}\",\n name: \"Just\",\n component: Home,\n }\n];\n\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n});\n\nexport default router;","<template>\n <div class=\"navbar\">\n <div id=\"banner\"><img src=\"@/assets/banner.svg\" /></div>\n <router-link to=\"/\">Home</router-link>\n <router-link to=\"/process\">Process Image</router-link>\n <router-link to=\"/about\">Contact us</router-link>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"Navbar\",\n});\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n\n$navbar_padding: 20px;\n\n.navbar {\n padding: 0px $navbar_padding;\n position: fixed;\n top: 0;\n width: calc(100% - 2 * #{$navbar_padding});\n height: 66px;\n margin: 0;\n overflow: hidden;\n background-color: $nav_background;\n justify-content: flex-end;\n display: flex;\n color: $text_color;\n text-transform: uppercase;\n}\n\n.navbar a {\n display: block;\n color: $text_color;\n text-align: center;\n margin: 18px 10px;\n text-decoration: none;\n\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 500;\n font-size: 18px;\n line-height: 22px;\n\n color: #ffffff;\n}\n\n#banner {\n position: absolute;\n top: 10px;\n left: 2%;\n padding: 10px;\n}\n\n#banner img {\n height: 29px;\n width: 214px;\n}\n\n@media screen and (max-width: 800px) {\n #banner {\n left: 10px;\n top: 40px;\n }\n #banner img {\n display: none;\n }\n #banner::before {\n background-image: url(\"https://lenna.app/logo.png\");\n background-size: 30px 30px;\n width: 30px;\n height: 30px;\n display: inline-block;\n content: \"\";\n }\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"Navbar\",\n});\n","import { render } from \"./Navbar.vue?vue&type=template&id=7d45cea4&scoped=true\"\nimport script from \"./Navbar.vue?vue&type=script&lang=ts\"\nexport * from \"./Navbar.vue?vue&type=script&lang=ts\"\n\nimport \"./Navbar.vue?vue&type=style&index=0&id=7d45cea4&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-7d45cea4\"\n\nexport default script","<template>\n <div class=\"footer\">\n <v-footer>\n Convert images online without upload of your data.\n <p>\n © {{ new Date().getFullYear() }} —\n <a href=\"https://lenna.app\"> lenna.app </a>\n </p>\n </v-footer>\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"Footer\",\n});\n</script>\n<style scoped>\n.footer {\n text-align: center;\n height: 65px;\n color: white;\n background: #5a5a5a;\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"Footer\",\n});\n","import { render } from \"./Footer.vue?vue&type=template&id=1b71c086&scoped=true\"\nimport script from \"./Footer.vue?vue&type=script&lang=ts\"\nexport * from \"./Footer.vue?vue&type=script&lang=ts\"\n\nimport \"./Footer.vue?vue&type=style&index=0&id=1b71c086&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-1b71c086\"\n\nexport default script","<template>\n <div>\n <Navbar />\n <router-view />\n <Footer />\n </div>\n</template>\n<script>\nimport { defineComponent } from \"vue\";\nimport Navbar from \"@/components/Navbar.vue\";\nimport Footer from \"@/components/Footer.vue\";\nexport default defineComponent({\n name: \"App\",\n components: {\n Navbar,\n Footer\n },\n});\n</script>","import { render } from \"./App.vue?vue&type=template&id=0acc35d2\"\nimport script from \"./App.vue?vue&type=script&lang=js\"\nexport * from \"./App.vue?vue&type=script&lang=js\"\nscript.render = render\n\nexport default script","<template>\n <div>\n <button v-on:click=\"generateConfigUrlBase64\" v-if=\"plugins\">\n generate actual config url\n </button>\n <div class=\"config\" v-if=\"base64config\">\n <textarea v-model=\"base64config\" :readonly=\"true\"></textarea>\n </div>\n\n <button v-on:click=\"generateLennaConfig\">lenna.yml</button>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nimport { LennaPlugin } from \"../models/plugin\";\nimport {\n generateBase64Config,\n generateYamlConfig,\n} from \"../controllers/config_generator\";\nexport default defineComponent({\n name: \"ConfigComp\",\n props: {\n plugins: {\n type: Array as () => Array<LennaPlugin>,\n required: true,\n },\n },\n data() {\n return {\n url: \"https://lenna.app/?config=\",\n base64config: \"\",\n };\n },\n methods: {\n download(filename: string, text: string) {\n var element = document.createElement(\"a\");\n element.setAttribute(\n \"href\",\n \"data:text/plain;charset=utf-8,\" + encodeURIComponent(text)\n );\n element.setAttribute(\"download\", filename);\n\n element.style.display = \"none\";\n document.body.appendChild(element);\n\n element.click();\n\n document.body.removeChild(element);\n },\n generateConfigUrlBase64() {\n let config = generateBase64Config(this.plugins);\n this.base64config = this.url + config;\n },\n generateLennaConfig() {\n let lenna_yml = generateYamlConfig(this.plugins);\n this.download(\"lenna.yml\", lenna_yml);\n },\n },\n});\n</script>\n\n<style scoped>\n.config {\n margin: 10px;\n width: 200px;\n height: 300px;\n background-color: #efcda4;\n border: 1px solid darkgray;\n border-radius: 5px;\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nimport { LennaPlugin } from \"../models/plugin\";\nimport {\n generateBase64Config,\n generateYamlConfig,\n} from \"../controllers/config_generator\";\nexport default defineComponent({\n name: \"ConfigComp\",\n props: {\n plugins: {\n type: Array as () => Array<LennaPlugin>,\n required: true,\n },\n },\n data() {\n return {\n url: \"https://lenna.app/?config=\",\n base64config: \"\",\n };\n },\n methods: {\n download(filename: string, text: string) {\n var element = document.createElement(\"a\");\n element.setAttribute(\n \"href\",\n \"data:text/plain;charset=utf-8,\" + encodeURIComponent(text)\n );\n element.setAttribute(\"download\", filename);\n\n element.style.display = \"none\";\n document.body.appendChild(element);\n\n element.click();\n\n document.body.removeChild(element);\n },\n generateConfigUrlBase64() {\n let config = generateBase64Config(this.plugins);\n this.base64config = this.url + config;\n },\n generateLennaConfig() {\n let lenna_yml = generateYamlConfig(this.plugins);\n this.download(\"lenna.yml\", lenna_yml);\n },\n },\n});\n","import YAML from \"yaml\";\nimport { LennaPlugin } from \"../models/plugin\";\n\nconst generateBase64Config = (plugins: LennaPlugin[]): string => {\n const configs = [];\n for (const plugin of plugins) {\n if (plugin.enabled) {\n const config: any = plugin.config;\n config.name = plugin.name;\n configs.push(config);\n }\n }\n const config = JSON.stringify(configs);\n return btoa(config);\n}\n\nconst generateYamlConfig = (plugins: LennaPlugin[]): string => {\n const configs = [];\n for (const plugin of plugins) {\n if (plugin.enabled) {\n const config: any = plugin.config;\n config.name = plugin.name;\n configs.push(config);\n }\n }\n const comment =\n \"# https://github.com/lenna-project/lenna-cli\\n\" +\n \"# lenna-cli images_path --config lenna.yml\\n\";\n const yml_config = YAML.stringify({ pipeline: configs });\n return comment + yml_config;\n}\n\nexport { generateBase64Config, generateYamlConfig }","import { render } from \"./ConfigComp.vue?vue&type=template&id=171f4380&scoped=true\"\nimport script from \"./ConfigComp.vue?vue&type=script&lang=ts\"\nexport * from \"./ConfigComp.vue?vue&type=script&lang=ts\"\n\nimport \"./ConfigComp.vue?vue&type=style&index=0&id=171f4380&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-171f4380\"\n\nexport default script","<template>\n <div class=\"download-button\">\n <img v-on:click=\"onClick\" src=\"../assets/download.svg\" />\n <div id=\"text\" v-on:click=\"onClick\">Download</div>\n <select v-model=\"filetype\">\n <option\n v-for=\"option in options\"\n :value=\"option.value\"\n :key=\"option.text\"\n >\n {{ option.text }}\n </option>\n </select>\n </div>\n</template>\n<script lang=\"ts\">\nimport { computed, defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"DownloadButton\",\n props: {\n onClick: {\n type: Function,\n required: true,\n },\n filetype: {\n type: String,\n required: true,\n },\n },\n emits: [\"update:filetype\"],\n setup(props, { emit }) {\n const filetype = computed({\n get: () => props.filetype,\n set: (value) => emit(\"update:filetype\", value),\n });\n\n return {\n filetype,\n };\n },\n data(): any {\n return {\n options: [\n { text: \"png\", value: \"png\" },\n { text: \"jpg\", value: \"jpg\" },\n { text: \"bmp\", value: \"bmp\" },\n { text: \"ico\", value: \"ico\" },\n { text: \"gif\", value: \"gif\" },\n ],\n };\n },\n});\n</script>\n<style scoped lang=\"scss\">\n.download-button {\n padding: 0px 10px;\n display: flex;\n cursor: pointer;\n height: 40px;\n width: 220px;\n border-radius: 12px;\n background: #cca7bf;\n}\n.download-button img {\n margin: auto 10px;\n height: 25px;\n width: 24px;\n}\n#text {\n margin: auto 5px;\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 700;\n font-size: 16px;\n line-height: 22px;\n color: #ffffff;\n}\n.download-button select {\n margin: auto 10px;\n height: 30px;\n min-width: 50px;\n color: black;\n font-family: \"Open Sans\", sans-serif;\n font-size: 16px;\n cursor: pointer;\n border: 1px solid #a5a5a5;\n border-radius: 0px;\n outline: none;\n background-color: white;\n transform: scale(0.9);\n}\n</style>\n","\nimport { computed, defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"DownloadButton\",\n props: {\n onClick: {\n type: Function,\n required: true,\n },\n filetype: {\n type: String,\n required: true,\n },\n },\n emits: [\"update:filetype\"],\n setup(props, { emit }) {\n const filetype = computed({\n get: () => props.filetype,\n set: (value) => emit(\"update:filetype\", value),\n });\n\n return {\n filetype,\n };\n },\n data(): any {\n return {\n options: [\n { text: \"png\", value: \"png\" },\n { text: \"jpg\", value: \"jpg\" },\n { text: \"bmp\", value: \"bmp\" },\n { text: \"ico\", value: \"ico\" },\n { text: \"gif\", value: \"gif\" },\n ],\n };\n },\n});\n","import { render } from \"./DownloadButton.vue?vue&type=template&id=23d32a3a&scoped=true\"\nimport script from \"./DownloadButton.vue?vue&type=script&lang=ts\"\nexport * from \"./DownloadButton.vue?vue&type=script&lang=ts\"\n\nimport \"./DownloadButton.vue?vue&type=style&index=0&id=23d32a3a&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-23d32a3a\"\n\nexport default script","<template>\n <div class=\"help\">\n <h2>How to Convert Images</h2>\n <ol>\n <li>Drop images into left box.</li>\n <li>Enable the plugins you want to use in convertion.</li>\n <li>Order the plugins via drag and drop</li>\n <li>Press the process button.</li>\n <li>Select file type you want to download on the right.</li>\n <li>Download your converted images compressed as zip.</li>\n </ol>\n </div>\n</template>\n<script setup lang=\"ts\">\n</script>\n<style scoped>\n.help {\n display: block;\n}\n</style>\n","import { render } from \"./Help.vue?vue&type=template&id=0067483e&scoped=true\"\nconst script = {}\n\nimport \"./Help.vue?vue&type=style&index=0&id=0067483e&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-0067483e\"\n\nexport default script","import { render } from \"./ImageUploadPreview.vue?vue&type=template&id=52b41522&scoped=true\"\nimport script from \"./ImageUploadPreview.vue?vue&type=script&lang=ts\"\nexport * from \"./ImageUploadPreview.vue?vue&type=script&lang=ts\"\n\nimport \"./ImageUploadPreview.vue?vue&type=style&index=0&id=52b41522&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-52b41522\"\n\nexport default script","<template>\n <div class=\"plugins-manager\">\n <draggable\n class=\"dragArea list-group plugins\"\n :list=\"plugins\"\n @change=\"change()\"\n >\n <div class=\"list-group-item\" v-for=\"item in plugins\" :key=\"item.name\">\n <Plugin\n :name=\"item.name\"\n :plugin=\"item.plugin\"\n :url=\"item.url\"\n :defaultConfig=\"configs\"\n @changeEnabled=\"changeEnabled(item.name, $event)\"\n @changeConfig=\"changeConfig(item.name, $event)\"\n />\n </div>\n </draggable>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nimport { VueDraggableNext } from \"vue-draggable-next\";\nimport Plugin from \"../plugins/Plugin.vue\";\nimport { LennaPlugin } from \"../models/plugin\";\nimport { PluginManager } from \"../controllers/plugin_manager\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\nexport declare interface PluginsManagerData {\n plugins: LennaPlugin[];\n configs: Configs;\n}\n\nexport default defineComponent({\n name: \"PluginsManager\",\n props: {\n pluginsmap: String,\n pluginsjson: String,\n defaultConfig: Object,\n pluginManager: Object as () => PluginManager,\n defaultPlugins: Array as () => Array<string>,\n },\n components: {\n Plugin,\n draggable: VueDraggableNext,\n },\n data(): PluginsManagerData {\n return {\n plugins: [],\n configs: {},\n };\n },\n beforeMount() {\n this.plugins = this.pluginManager?.getPlugins() || [];\n //this.importPlugin(\"local\", \"http://localhost:3002/remoteEntry.js\");\n },\n methods: {\n changeEnabled(name: string, enabled: boolean) {\n let plugin = this.plugins.find((o: any) => o.name === name);\n if (plugin) {\n plugin.enabled = enabled;\n this.change();\n }\n },\n changeConfig(name: string, config: Object) {\n let plugin = this.plugins.find((o: LennaPlugin) => o.name === name);\n if (plugin) {\n plugin.config = config;\n }\n this.change();\n },\n change() {\n this.$emit(\"change\");\n },\n raw(comp: any) {\n return comp;\n },\n },\n});\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n.plugins-manager {\n width: 257px;\n height: 737px;\n background: #5a5a5a;\n border-radius: 32px;\n padding: 20px 10px;\n padding-top: 40px;\n}\n</style>\n","<template>\n <div class=\"content\">\n <div class=\"plugin\" v-if=\"plugin\">\n <div class=\"head\">\n <div><img id=\"drag-icon\" src=\"../assets/drag.png\" /></div>\n <span />\n <plugin-title :title=\"plugin.name()\">\n <img v-if=\"plugin.name() == 'blur'\" src=\"../assets/blur.svg\" />\n <img\n v-if=\"plugin.name() == 'dramatic'\"\n src=\"../assets/dramatic.svg\"\n />\n <img v-if=\"plugin.name() == 'sharpen'\" src=\"../assets/sharpen.svg\" />\n <img v-if=\"plugin.name() == 'sepia'\" src=\"../assets/sepia.svg\" />\n </plugin-title>\n </div>\n <div class=\"icons\">\n <Checkbox\n id=\"checkbox\"\n :checked=\"enabled\"\n @update:checked=\"updateEnabled($event)\"\n />\n </div>\n </div>\n <div v-if=\"enabled\">\n <Blur\n v-if=\"plugin.name() == 'blur'\"\n :key=\"pluginKey\"\n :defaultConfig=\"config\"\n @changeConfig=\"updateConfig($event)\"\n />\n <Canny\n v-if=\"plugin.name() == 'canny'\"\n :key=\"pluginKey\"\n :defaultConfig=\"config\"\n @changeConfig=\"updateConfig($event)\"\n />\n <Rotate\n v-if=\"plugin.name() == 'rotate'\"\n :key=\"pluginKey\"\n :defaultConfig=\"config\"\n @changeConfig=\"updateConfig($event)\"\n />\n </div>\n <div id=\"line\"></div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { shallowRef, Ref, defineComponent } from \"vue\";\nimport Blur from \"./Blur.vue\";\nimport Canny from \"./Canny.vue\";\nimport Rotate from \"./Rotate.vue\";\nimport { PluginModule } from \"../models/plugin_module\";\nimport { Config } from \"../models/config\";\nimport Checkbox from \"../components/Checkbox.vue\";\nimport PluginTitle from \"../components/PluginTitle.vue\";\nimport Icon from \"../components/Icon.vue\";\nimport {\n loadConfig,\n loadConfigFromParams,\n saveConfig,\n} from \"@/controllers/storage\";\n\ndeclare interface PluginData {\n ui: Ref;\n icon: Ref;\n processor: any;\n enabled: boolean;\n keyCounter: number;\n pluginKey: string;\n config: Object;\n}\n\nexport default defineComponent({\n name: \"Plugin\",\n props: {\n name: String,\n plugin: Object as () => PluginModule,\n url: String,\n defaultConfig: Object as () => Config[],\n },\n components: {\n Checkbox,\n Icon,\n Blur,\n Canny,\n Rotate,\n PluginTitle,\n },\n data(): PluginData {\n return {\n ui: shallowRef(null),\n icon: shallowRef(null),\n processor: null,\n enabled: false,\n keyCounter: 0,\n pluginKey: \"\",\n config: {},\n };\n },\n methods: {\n async loadDefaultConfig() {\n this.plugin?.defaultConfig().then((defaultConfig: any) => {\n if (this.defaultConfig && this.defaultConfig.length > 0) {\n const { enabled, config } = loadConfigFromParams(\n {\n name: this.name || \"\",\n enabled: true,\n config: defaultConfig,\n },\n this.defaultConfig\n );\n this.config = config;\n this.enabled = enabled || false;\n } else {\n const { enabled, config } = loadConfig({\n name: this.name || \"\",\n enabled: false,\n config: defaultConfig,\n });\n this.config = config;\n this.enabled = enabled || false;\n }\n });\n },\n async loadUI() {\n if (this.plugin?.ui && this.url) {\n // eslint-disable-next-line no-undef\n System.import(this.url)\n .then((module: any) => {\n module.get(\"./Widget\").then((widget: Function) => {\n this.ui = widget().default;\n });\n })\n .catch((e: any) => console.log(e));\n }\n if (this.plugin?.icon) {\n this.icon = this.plugin.icon();\n }\n },\n async updateConfig(config: Object) {\n saveConfig({\n name: this.name || \"\",\n enabled: this.enabled,\n config: config,\n });\n this.$emit(\"changeConfig\", config);\n },\n async updateEnabled(enabled: boolean) {\n this.enabled = enabled;\n saveConfig({\n name: this.name || \"\",\n enabled: this.enabled,\n config: this.config,\n });\n this.$emit(\"changeEnabled\", enabled);\n },\n },\n created() {\n console.log(this.name);\n this.loadUI();\n this.loadDefaultConfig();\n },\n watch: {\n defaultConfig: {\n handler: function () {\n this.keyCounter += 1;\n this.pluginKey = (this.name || \"\") + this.keyCounter;\n },\n },\n },\n});\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n.content {\n position: relative;\n}\n.head {\n width: 150px;\n display: flex;\n}\n#drag-icon {\n width: 12px;\n height: 16px;\n margin: 3px;\n}\n.icons {\n width: 20px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n#checkbox {\n transform: scale(0.5);\n}\n.plugin {\n min-width: 160px;\n height: 50px;\n background: #5a5a5a;\n border-radius: 5px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n text-transform: uppercase;\n}\n#line {\n position: absolute;\n width: 121px;\n height: 0px;\n left: 50px;\n bottom: 3px;\n border: 1px solid #8a8a8a;\n}\n</style>\n","<template>\n <div class=\"plugin-config\" v-if=\"config\">\n <div v-for=\"c in config\" :key=\"c.key\">\n <div class=\"parameter\">\n <div id=\"slider\">\n <vue-slider\n :interval=\"0.1\"\n :min=\"0.1\"\n :max=\"5.0\"\n v-model=\"c.value\"\n @change=\"updateConfig()\"\n v-bind:id=\"c.key\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nimport VueSlider from \"vue-slider-component\";\nimport \"vue-slider-component/theme/antd.css\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\ninterface Config {\n key: string;\n value: any;\n}\n\ndeclare interface PluginConfigData {\n config: Config[];\n}\n\nexport default defineComponent({\n name: \"BlurConfig\",\n props: {\n defaultConfig: Object,\n },\n components: {\n VueSlider,\n },\n data(): PluginConfigData {\n return {\n config: [],\n };\n },\n methods: {\n async updateConfig() {\n let config: Configs = {};\n for (let c of this.config) {\n config[c.key] = c.value;\n }\n this.$emit(\"changeConfig\", config);\n },\n },\n created() {\n for (let key in this.defaultConfig) {\n let config = { key: key, value: this.defaultConfig[key] };\n this.config.push(config);\n }\n this.updateConfig();\n },\n});\n</script>\n\n<style scoped>\n.plugin-config {\n margin: 5px;\n}\n.parameter {\n padding-bottom: 10px;\n}\n#slider {\n margin: 0 auto;\n width: 80px;\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nimport VueSlider from \"vue-slider-component\";\nimport \"vue-slider-component/theme/antd.css\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\ninterface Config {\n key: string;\n value: any;\n}\n\ndeclare interface PluginConfigData {\n config: Config[];\n}\n\nexport default defineComponent({\n name: \"BlurConfig\",\n props: {\n defaultConfig: Object,\n },\n components: {\n VueSlider,\n },\n data(): PluginConfigData {\n return {\n config: [],\n };\n },\n methods: {\n async updateConfig() {\n let config: Configs = {};\n for (let c of this.config) {\n config[c.key] = c.value;\n }\n this.$emit(\"changeConfig\", config);\n },\n },\n created() {\n for (let key in this.defaultConfig) {\n let config = { key: key, value: this.defaultConfig[key] };\n this.config.push(config);\n }\n this.updateConfig();\n },\n});\n","import { render } from \"./Blur.vue?vue&type=template&id=01f22ffa&scoped=true\"\nimport script from \"./Blur.vue?vue&type=script&lang=ts\"\nexport * from \"./Blur.vue?vue&type=script&lang=ts\"\n\nimport \"./Blur.vue?vue&type=style&index=0&id=01f22ffa&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-01f22ffa\"\n\nexport default script","<template>\n <div class=\"plugin-config\" v-if=\"config\">\n <div v-for=\"c in config\" :key=\"c.key\">\n <div class=\"parameter\">\n <label>{{ c.key }}: </label>\n <div id=\"slider\">\n <vue-slider\n :interval=\"1\"\n :min=\"0\"\n :max=\"100\"\n v-model=\"c.value\"\n @change=\"updateConfig()\"\n v-bind:id=\"c.key\"\n />\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nimport VueSlider from \"vue-slider-component\";\nimport \"vue-slider-component/theme/antd.css\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\ninterface Config {\n key: string;\n value: any;\n}\n\ndeclare interface PluginConfigData {\n config: Config[];\n}\n\nexport default defineComponent({\n name: \"CannyConfig\",\n props: {\n defaultConfig: Object,\n },\n components: {\n VueSlider,\n },\n data(): PluginConfigData {\n return {\n config: [],\n };\n },\n methods: {\n async updateConfig() {\n let config: Configs = {};\n for (let c of this.config) {\n config[c.key] = c.value;\n }\n this.$emit(\"changeConfig\", config);\n },\n },\n created() {\n for (let key in this.defaultConfig) {\n let config = { key: key, value: this.defaultConfig[key] };\n this.config.push(config);\n }\n this.updateConfig();\n },\n});\n</script>\n\n<style scoped>\n.plugin-config {\n margin: 5px;\n}\n.parameter {\n padding-bottom: 10px;\n}\n#slider {\n margin: 0 auto;\n width: 80px;\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nimport VueSlider from \"vue-slider-component\";\nimport \"vue-slider-component/theme/antd.css\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\ninterface Config {\n key: string;\n value: any;\n}\n\ndeclare interface PluginConfigData {\n config: Config[];\n}\n\nexport default defineComponent({\n name: \"CannyConfig\",\n props: {\n defaultConfig: Object,\n },\n components: {\n VueSlider,\n },\n data(): PluginConfigData {\n return {\n config: [],\n };\n },\n methods: {\n async updateConfig() {\n let config: Configs = {};\n for (let c of this.config) {\n config[c.key] = c.value;\n }\n this.$emit(\"changeConfig\", config);\n },\n },\n created() {\n for (let key in this.defaultConfig) {\n let config = { key: key, value: this.defaultConfig[key] };\n this.config.push(config);\n }\n this.updateConfig();\n },\n});\n","import { render } from \"./Canny.vue?vue&type=template&id=47e111a8&scoped=true\"\nimport script from \"./Canny.vue?vue&type=script&lang=ts\"\nexport * from \"./Canny.vue?vue&type=script&lang=ts\"\n\nimport \"./Canny.vue?vue&type=style&index=0&id=47e111a8&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-47e111a8\"\n\nexport default script","<template>\n <div class=\"plugin-config\">\n <select v-model=\"selected\" @change=\"updateConfig()\">\n <option\n v-for=\"option in options\"\n :value=\"option.value\"\n :key=\"option.text\"\n >\n {{ option.text }} Clockwise\n </option>\n </select>\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nimport VueSlider from \"vue-slider-component\";\nimport \"vue-slider-component/theme/antd.css\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\ndeclare interface PluginConfigData {\n options: any;\n selected: String;\n}\n\nexport default defineComponent({\n name: \"RotateConfig\",\n props: {\n defaultConfig: Object,\n },\n components: {\n VueSlider,\n },\n data(): PluginConfigData {\n return {\n selected: \"90\",\n options: [\n { text: \"90°\", value: \"90\" },\n { text: \"180°\", value: \"180\" },\n { text: \"270°\", value: \"270\" },\n ],\n };\n },\n methods: {\n async updateConfig() {\n let config = {\n theta: 0.0,\n };\n if (this.selected === \"90\") {\n config.theta = 90.0;\n } else if (this.selected === \"180\") {\n config.theta = 180.0;\n } else if (this.selected === \"270\") {\n config.theta = 270.0;\n }\n this.$emit(\"changeConfig\", config);\n },\n },\n created() {\n this.updateConfig();\n },\n});\n</script>\n\n<style scoped>\n.plugin-config {\n margin: 5px;\n padding-bottom: 10px;\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nimport VueSlider from \"vue-slider-component\";\nimport \"vue-slider-component/theme/antd.css\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\ndeclare interface PluginConfigData {\n options: any;\n selected: String;\n}\n\nexport default defineComponent({\n name: \"RotateConfig\",\n props: {\n defaultConfig: Object,\n },\n components: {\n VueSlider,\n },\n data(): PluginConfigData {\n return {\n selected: \"90\",\n options: [\n { text: \"90°\", value: \"90\" },\n { text: \"180°\", value: \"180\" },\n { text: \"270°\", value: \"270\" },\n ],\n };\n },\n methods: {\n async updateConfig() {\n let config = {\n theta: 0.0,\n };\n if (this.selected === \"90\") {\n config.theta = 90.0;\n } else if (this.selected === \"180\") {\n config.theta = 180.0;\n } else if (this.selected === \"270\") {\n config.theta = 270.0;\n }\n this.$emit(\"changeConfig\", config);\n },\n },\n created() {\n this.updateConfig();\n },\n});\n","import { render } from \"./Rotate.vue?vue&type=template&id=5f83a273&scoped=true\"\nimport script from \"./Rotate.vue?vue&type=script&lang=ts\"\nexport * from \"./Rotate.vue?vue&type=script&lang=ts\"\n\nimport \"./Rotate.vue?vue&type=style&index=0&id=5f83a273&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-5f83a273\"\n\nexport default script","<template>\n <div class=\"checkbox-container\">\n <label class=\"checkbox\">\n <input\n @input=\"(event) => $emit('update:checked', event.target.checked)\"\n type=\"checkbox\"\n :checked=\"checked\"\n id=\"checkbox\"\n />\n <span></span>\n </label>\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"Checkbox\",\n props: {\n checked: {\n type: Boolean,\n },\n },\n emits: [\"update:checked\"],\n computed: {\n value: {\n get() {\n return this.checked;\n },\n set(value: boolean) {\n this.$emit(\"update:checked\", value);\n },\n },\n },\n});\n</script>\n<style scoped lang=\"scss\">\n.checkbox-container {\n height: 50px;\n}\n.checkbox {\n cursor: pointer;\n position: relative;\n}\n.checkbox > input {\n height: 40px;\n width: 40px;\n position: absolute;\n left: -25px;\n top: 0rem;\n -webkit-appearance: none;\n -moz-appearance: none;\n -o-appearance: none;\n appearance: none;\n border-radius: 25px;\n outline: none;\n transition-duration: 0.3s;\n background-color: #363636;\n cursor: pointer;\n}\n.checkbox > input:checked {\n background-color: #363636\n}\n.checkbox > input:checked + span::before {\n height: 30px;\n width: 30px;\n background-color: white;\n border-radius: 50%;\n font-size: 2.4em;\n content: \"\";\n text-align: center;\n color: white;\n position: absolute;\n left: -15px;\n top: 8px;\n}\n.checkbox > input:active {\n border: 2px solid #34495e;\n}\n.checkbox-container:hover {\n transform: scale(0.9);\n}\n</style>\n","\nimport { defineComponent } from \"vue\";\nexport default defineComponent({\n name: \"Checkbox\",\n props: {\n checked: {\n type: Boolean,\n },\n },\n emits: [\"update:checked\"],\n computed: {\n value: {\n get() {\n return this.checked;\n },\n set(value: boolean) {\n this.$emit(\"update:checked\", value);\n },\n },\n },\n});\n","import { render } from \"./Checkbox.vue?vue&type=template&id=42b7f665&scoped=true\"\nimport script from \"./Checkbox.vue?vue&type=script&lang=ts\"\nexport * from \"./Checkbox.vue?vue&type=script&lang=ts\"\n\nimport \"./Checkbox.vue?vue&type=style&index=0&id=42b7f665&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-42b7f665\"\n\nexport default script","<template>\n <div class=\"content\">\n <div id=\"icon\">\n <slot />\n </div>\n <div>\n {{ title }}\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nexport default {\n props: {\n title: {\n type: [String],\n },\n },\n};\n</script>\n<style scoped lang=\"scss\">\n.content {\n margin-left: 10px;\n float: left;\n display: flex;\n\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 500;\n font-size: 16px;\n color: #ffffff;\n}\n#icon {\n margin: 8px;\n margin-top: 0;\n width: 13px;\n height: 13px;\n}\n</style>\n","import { render } from \"./PluginTitle.vue?vue&type=template&id=28c3f29c&scoped=true\"\nimport script from \"./PluginTitle.vue?vue&type=script&lang=ts\"\nexport * from \"./PluginTitle.vue?vue&type=script&lang=ts\"\n\nimport \"./PluginTitle.vue?vue&type=style&index=0&id=28c3f29c&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-28c3f29c\"\n\nexport default script","\nexport default {\n props: {\n title: {\n type: [String],\n },\n },\n};\n","import { render } from \"./Icon.vue?vue&type=template&id=223afea4&scoped=true\"\nimport script from \"./Icon.vue?vue&type=script&lang=ts\"\nexport * from \"./Icon.vue?vue&type=script&lang=ts\"\n\nimport \"./Icon.vue?vue&type=style&index=0&id=223afea4&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-223afea4\"\n\nexport default script","\nexport default {\n props: {\n src: {\n type: [Object, String],\n },\n },\n};\n","<template>\n <div>\n <img id=\"icon\" :src=\"src\" />\n </div>\n</template>\n<script lang=\"ts\">\nexport default {\n props: {\n src: {\n type: [Object, String],\n },\n },\n};\n</script>\n<style scoped lang=\"scss\">\n#icon {\n margin: 10px;\n margin-top: 20px;\n height: 96px;\n left: 50%;\n}\n</style>\n","\nimport { shallowRef, Ref, defineComponent } from \"vue\";\nimport Blur from \"./Blur.vue\";\nimport Canny from \"./Canny.vue\";\nimport Rotate from \"./Rotate.vue\";\nimport { PluginModule } from \"../models/plugin_module\";\nimport { Config } from \"../models/config\";\nimport Checkbox from \"../components/Checkbox.vue\";\nimport PluginTitle from \"../components/PluginTitle.vue\";\nimport Icon from \"../components/Icon.vue\";\nimport {\n loadConfig,\n loadConfigFromParams,\n saveConfig,\n} from \"@/controllers/storage\";\n\ndeclare interface PluginData {\n ui: Ref;\n icon: Ref;\n processor: any;\n enabled: boolean;\n keyCounter: number;\n pluginKey: string;\n config: Object;\n}\n\nexport default defineComponent({\n name: \"Plugin\",\n props: {\n name: String,\n plugin: Object as () => PluginModule,\n url: String,\n defaultConfig: Object as () => Config[],\n },\n components: {\n Checkbox,\n Icon,\n Blur,\n Canny,\n Rotate,\n PluginTitle,\n },\n data(): PluginData {\n return {\n ui: shallowRef(null),\n icon: shallowRef(null),\n processor: null,\n enabled: false,\n keyCounter: 0,\n pluginKey: \"\",\n config: {},\n };\n },\n methods: {\n async loadDefaultConfig() {\n this.plugin?.defaultConfig().then((defaultConfig: any) => {\n if (this.defaultConfig && this.defaultConfig.length > 0) {\n const { enabled, config } = loadConfigFromParams(\n {\n name: this.name || \"\",\n enabled: true,\n config: defaultConfig,\n },\n this.defaultConfig\n );\n this.config = config;\n this.enabled = enabled || false;\n } else {\n const { enabled, config } = loadConfig({\n name: this.name || \"\",\n enabled: false,\n config: defaultConfig,\n });\n this.config = config;\n this.enabled = enabled || false;\n }\n });\n },\n async loadUI() {\n if (this.plugin?.ui && this.url) {\n // eslint-disable-next-line no-undef\n System.import(this.url)\n .then((module: any) => {\n module.get(\"./Widget\").then((widget: Function) => {\n this.ui = widget().default;\n });\n })\n .catch((e: any) => console.log(e));\n }\n if (this.plugin?.icon) {\n this.icon = this.plugin.icon();\n }\n },\n async updateConfig(config: Object) {\n saveConfig({\n name: this.name || \"\",\n enabled: this.enabled,\n config: config,\n });\n this.$emit(\"changeConfig\", config);\n },\n async updateEnabled(enabled: boolean) {\n this.enabled = enabled;\n saveConfig({\n name: this.name || \"\",\n enabled: this.enabled,\n config: this.config,\n });\n this.$emit(\"changeEnabled\", enabled);\n },\n },\n created() {\n console.log(this.name);\n this.loadUI();\n this.loadDefaultConfig();\n },\n watch: {\n defaultConfig: {\n handler: function () {\n this.keyCounter += 1;\n this.pluginKey = (this.name || \"\") + this.keyCounter;\n },\n },\n },\n});\n","import { render } from \"./Plugin.vue?vue&type=template&id=4295be9c&scoped=true\"\nimport script from \"./Plugin.vue?vue&type=script&lang=ts\"\nexport * from \"./Plugin.vue?vue&type=script&lang=ts\"\n\nimport \"./Plugin.vue?vue&type=style&index=0&id=4295be9c&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-4295be9c\"\n\nexport default script","\nimport { defineComponent } from \"vue\";\nimport { VueDraggableNext } from \"vue-draggable-next\";\nimport Plugin from \"../plugins/Plugin.vue\";\nimport { LennaPlugin } from \"../models/plugin\";\nimport { PluginManager } from \"../controllers/plugin_manager\";\n\nexport interface Configs {\n [key: string]: any;\n}\n\nexport declare interface PluginsManagerData {\n plugins: LennaPlugin[];\n configs: Configs;\n}\n\nexport default defineComponent({\n name: \"PluginsManager\",\n props: {\n pluginsmap: String,\n pluginsjson: String,\n defaultConfig: Object,\n pluginManager: Object as () => PluginManager,\n defaultPlugins: Array as () => Array<string>,\n },\n components: {\n Plugin,\n draggable: VueDraggableNext,\n },\n data(): PluginsManagerData {\n return {\n plugins: [],\n configs: {},\n };\n },\n beforeMount() {\n this.plugins = this.pluginManager?.getPlugins() || [];\n //this.importPlugin(\"local\", \"http://localhost:3002/remoteEntry.js\");\n },\n methods: {\n changeEnabled(name: string, enabled: boolean) {\n let plugin = this.plugins.find((o: any) => o.name === name);\n if (plugin) {\n plugin.enabled = enabled;\n this.change();\n }\n },\n changeConfig(name: string, config: Object) {\n let plugin = this.plugins.find((o: LennaPlugin) => o.name === name);\n if (plugin) {\n plugin.config = config;\n }\n this.change();\n },\n change() {\n this.$emit(\"change\");\n },\n raw(comp: any) {\n return comp;\n },\n },\n});\n","import { render } from \"./PluginsManager.vue?vue&type=template&id=a120d5b2&scoped=true\"\nimport script from \"./PluginsManager.vue?vue&type=script&lang=ts\"\nexport * from \"./PluginsManager.vue?vue&type=script&lang=ts\"\n\nimport \"./PluginsManager.vue?vue&type=style&index=0&id=a120d5b2&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-a120d5b2\"\n\nexport default script","<template>\n <div class=\"about\">\n <h1>About Lenna Project</h1>\n <p>\n Lenna is a library for image processing algorithms. The web page allows to\n test and use them.\n </p>\n <Help />\n <h2>Thanks</h2>\n <ul>\n <li>Silvia (<a href=\"https://github.com/silvia-odwyer/photon\">photon</a>)</li>\n </ul>\n <h2>Plugins</h2>\n <p>\n Lenna allows to plug in more algorithms. \n The plugins can be activated for use in the <a href=\"https://lenna.app/marketplace/\">marketplace</a>. \n Some examples can be found at\n <a href=\"https://github.com/lenna-project/lenna-plugins\"\n >lenna-project/lenna-plugins</a\n >\n on github.\n <br/>\n Following a list of available plugins:\n\n <ul>\n <li><b>blur</b> - Blurs the image. The strength can be configured.</li>\n <li><b>dramatic</b> - Gives the image a dramatic touch.</li>\n <li><b>exif</b> - Allows to clear exif data of the image.</li>\n <li><b>rotate</b> - Rotates the image.</li>\n <li><b>canny</b> - Shows edges of objects in the image.</li>\n </ul>\n </p>\n \n <h2>Jupyter Notebooks</h2>\n View some notebooks <a href=\"/jupyter\">here</a> to see how the plugins can be used in python.\n \n <h2>Command Line Interface</h2>\n <iframe src=\"https://snapcraft.io/lenna-cli/embedded?button=black&summary=true\" frameborder=\"0\" width=\"100%\" height=\"380px\" style=\"border: 1px solid #CCC; border-radius: 2px;\"></iframe>\n <p>\n A command line interface allows to use the algorithms and run them on\n multiple images at once. The source for\n <a href=\"https://github.com/lenna-project/lenna-cli\">lenna-cli</a>\n can be found on github.\n </p>\n <img src=\"https://raw.githubusercontent.com/lenna-project/lenna-cli/main/docs/images/run.gif\" />\n\n <h2>Desktop App</h2>\n <a href=\"https://sourceforge.net/projects/lenna/files/latest/download\"><img alt=\"Download lenna\" src=\"https://a.fsdn.com/con/app/sf-download-button\" width=276 height=48 srcset=\"https://a.fsdn.com/con/app/sf-download-button?button_size=2x 2x\"></a>\n <br />\n <iframe src=\"https://snapcraft.io/lenna/embedded?button=black&summary=true&screenshot=true\" frameborder=\"0\" width=\"100%\" height=\"620px\" style=\"border: 1px solid #CCC; border-radius: 2px;\"></iframe>\n\n <h2>Desktop Web App</h2>\n <a href=\"https://github.com/lenna-project/lenna-gui/releases/latest\">Lenna GUI</a>\n This App supports convertion of images in folders.\n <br />\n You can find installers for Mac, Linux and Windows.\n <br />\n\n </div>\n</template>\n\n<script lang=\"ts\">\nimport Help from \"../components/Help.vue\";\n\nexport default {\n name: \"About\",\n components: {\n Help,\n },\n};\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n.about {\n padding: 100px;\n padding-left: 30%;\n background-color: $body_background;\n height: 100%;\n}\n</style>\n","import { render } from \"./About.vue?vue&type=template&id=5155017c&scoped=true\"\nimport script from \"./About.vue?vue&type=script&lang=ts\"\nexport * from \"./About.vue?vue&type=script&lang=ts\"\n\nimport \"./About.vue?vue&type=style&index=0&id=5155017c&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-5155017c\"\n\nexport default script","\nimport Help from \"../components/Help.vue\";\n\nexport default {\n name: \"About\",\n components: {\n Help,\n },\n};\n","<template>\n <div>\n <div class=\"main\">\n <h1>Convert images online<br/> without upload of your data</h1>\n <Mountains />\n <router-link class=\"process-image-button\" to=\"/process\">Process Image</router-link>\n <AboutProject />\n <HowToConvert />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from \"vue\";\nimport Mountains from \"../components/Mountains.vue\";\nimport AboutProject from \"../components/AboutProject.vue\";\nimport HowToConvert from \"../components/HowToConvert.vue\";\n\nexport default defineComponent({\n name: \"Home\",\n components: {\n Mountains,\n AboutProject,\n HowToConvert,\n },\n});\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n@import url(\"https://fonts.googleapis.com/css2?family=Amatic+SC&display=swap\");\n\n.main {\n background-color: $body_background;\n padding: 150px;\n padding-top: 120px;\n text-align: center;\n background-image: url(\"../assets/mainbg.svg\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n.main h1 {\n text-transform: uppercase;\n font-family: \"Amatic SC\", cursive;\n font-size: 32pt;\n}\n.main hr {\n margin-top: 10px;\n border: none;\n border-top: 2px dotted blue;\n color: #fff;\n background-color: #fff;\n height: 2px;\n width: 100%;\n}\n.top_main {\n display: flex;\n justify-content: center;\n}\n.bottom_main {\n padding-top: 20px;\n padding-bottom: 0;\n}\n\n.process-image-button {\n display: inline-block;\n text-decoration: inherit;\n margin: 40px;\n width: 248px;\n padding: 25px;\n\n background: #d8c6c6;\n border-radius: 11px;\n\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 400;\n font-size: 24px;\n line-height: 30px;\n\n color: #000000;\n}\n\n@media screen and (max-width: 800px) {\n .main {\n margin-top: 120px;\n padding: 0;\n }\n #process button {\n width: 150px;\n }\n}\n</style>\n","<template>\n <div id=\"container\">\n <span id=\"mountain1\" />\n <div id=\"container-right\">\n <span id=\"mountain2\" />\n <span id=\"mountain3\" />\n </div>\n </div>\n</template>\n<script lang=\"ts\">\n</script>\n<style scoped lang=\"css\">\n#container {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n#container-right {\n display: flex;\n flex-direction: column;\n flex-wrap: wrap;\n}\n\n#mountain1 {\n width: 480px;\n height: 320px;\n background: url(\"../assets/mountain1.png\");\n filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25));\n border-radius: 17px;\n}\n\n#mountain2 {\n margin: 5px;\n width: 224px;\n height: 150px;\n background: url(\"../assets/mountain2.png\");\n filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25));\n border-radius: 14px;\n}\n\n#mountain3 {\n margin: 5px;\n width: 224px;\n height: 150px;\n background: url(\"../assets/mountain3.png\");\n filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25));\n border-radius: 14px;\n}\n</style>\n","import { render } from \"./Mountains.vue?vue&type=template&id=836ff504&scoped=true\"\nconst script = {}\n\nimport \"./Mountains.vue?vue&type=style&index=0&id=836ff504&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-836ff504\"\n\nexport default script","<template>\n <p id=\"title\">About the project</p>\n <div id=\"container\">\n <div id=\"tile1\"></div>\n <div id=\"tile2\">\n Imaging & Co. is a library for image processing algorithms. The web\n page allows to test and use them.\n </div>\n </div>\n</template>\n<script lang=\"ts\">\nimport HowToTile from \"./HowToTile.vue\";\nexport default {\n components: {\n HowToTile,\n },\n};\n</script>\n<style scoped lang=\"css\">\n#title {\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 400;\n font-size: 36px;\n line-height: 45px;\n color: #000000;\n}\n#container {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n#tile1 {\n margin: 20px;\n width: 561px;\n height: 374px;\n\n border-radius: 17px;\n background-image: url(\"../assets/about_project_tile1.jpg\");\n background-size: contain;\n}\n#tile2 {\n margin: 20px;\n padding: 110px 30px;\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 400;\n font-size: 24px;\n line-height: 30px;\n color: #000000;\n\n width: 495px;\n height: 104px;\n background-image: url(\"../assets/about_project_tile2.svg\");\n background-repeat: no-repeat;\n background-size: contain;\n}\n</style>\n","<template>\n <div class=\"howtotile\">\n <p id=\"text\">{{text}}</p>\n </div>\n</template>\n<script lang=\"ts\">\nexport default {\n props: {\n text: {\n type: [String],\n },\n },\n};\n</script>\n<style scoped lang=\"scss\">\n.howtotile {\n width: 289px;\n height: 342px;\n margin: 30px;\n padding: 30px;\n\n background: #c4c4c4;\n border-radius: 12px;\n}\n\n#text {\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 400;\n font-size: 24px;\n line-height: 30px;\n\n color: #000000;\n}\n</style>\n","import { render } from \"./HowToTile.vue?vue&type=template&id=5caaf127&scoped=true\"\nimport script from \"./HowToTile.vue?vue&type=script&lang=ts\"\nexport * from \"./HowToTile.vue?vue&type=script&lang=ts\"\n\nimport \"./HowToTile.vue?vue&type=style&index=0&id=5caaf127&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-5caaf127\"\n\nexport default script","\nexport default {\n props: {\n text: {\n type: [String],\n },\n },\n};\n","import { render } from \"./AboutProject.vue?vue&type=template&id=4db0d360&scoped=true\"\nimport script from \"./AboutProject.vue?vue&type=script&lang=ts\"\nexport * from \"./AboutProject.vue?vue&type=script&lang=ts\"\n\nimport \"./AboutProject.vue?vue&type=style&index=0&id=4db0d360&scoped=true&lang=css\"\nscript.render = render\nscript.__scopeId = \"data-v-4db0d360\"\n\nexport default script","\nimport HowToTile from \"./HowToTile.vue\";\nexport default {\n components: {\n HowToTile,\n },\n};\n","<template>\n <p id=\"title\">How to convert images</p>\n <div id=\"tiles\">\n <HowToTile text=\"1. Upload the image\" />\n <HowToTile text=\"2. Enable the plugins\" />\n <HowToTile\n text=\"3. You can order the plugins by dragging and dropping them\"\n />\n <HowToTile text=\"4. Press the ‘Process button’.\" />\n </div>\n</template>\n<script lang=\"ts\">\nimport HowToTile from \"./HowToTile.vue\";\nexport default {\n components: {\n HowToTile,\n },\n};\n</script>\n<style scoped lang=\"scss\">\n#title {\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 400;\n font-size: 36px;\n line-height: 45px;\n color: #000000;\n}\n#tiles {\n display: flex;\n}\n</style>\n","import { render } from \"./HowToConvert.vue?vue&type=template&id=1d035855&scoped=true\"\nimport script from \"./HowToConvert.vue?vue&type=script&lang=ts\"\nexport * from \"./HowToConvert.vue?vue&type=script&lang=ts\"\n\nimport \"./HowToConvert.vue?vue&type=style&index=0&id=1d035855&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-1d035855\"\n\nexport default script","\nimport HowToTile from \"./HowToTile.vue\";\nexport default {\n components: {\n HowToTile,\n },\n};\n","\nimport { defineComponent, ref } from \"vue\";\nimport Mountains from \"../components/Mountains.vue\";\nimport AboutProject from \"../components/AboutProject.vue\";\nimport HowToConvert from \"../components/HowToConvert.vue\";\n\nexport default defineComponent({\n name: \"Home\",\n components: {\n Mountains,\n AboutProject,\n HowToConvert,\n },\n});\n","import { render } from \"./Home.vue?vue&type=template&id=5a478374&scoped=true\"\nimport script from \"./Home.vue?vue&type=script&lang=ts\"\nexport * from \"./Home.vue?vue&type=script&lang=ts\"\n\nimport \"./Home.vue?vue&type=style&index=0&id=5a478374&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-5a478374\"\n\nexport default script","import { render } from \"./Process.vue?vue&type=template&id=432c5aa6&scoped=true\"\nimport script from \"./Process.vue?vue&type=script&lang=ts\"\nexport * from \"./Process.vue?vue&type=script&lang=ts\"\n\nimport \"./Process.vue?vue&type=style&index=0&id=432c5aa6&scoped=true&lang=scss\"\nscript.render = render\nscript.__scopeId = \"data-v-432c5aa6\"\n\nexport default script","<template>\n <div class=\"image-preview\">\n <FileUpload\n :multiple=\"true\"\n :drop=\"true\"\n :drop-directory=\"true\"\n extensions=\"gif,jpg,jpeg,png,webp\"\n accept=\"image/png,image/gif,image/jpeg,image/webp\"\n @input-filter=\"inputFilter\"\n @input-file=\"inputFile\"\n ref=\"upload\"\n class=\"file-upload\"\n >\n <div class=\"upload-container\">\n <img src=\"../assets/add_image.svg\" />\n <div v-if=\"imgs.length < 1\" class=\"upload-text\">\n Drop files here\n <div id=\"or-line\">\n <div class=\"line\" />\n or\n <div class=\"line\" />\n </div>\n </div>\n <div v-if=\"imgs.length < 1\" id=\"upload-button\">Select Files...</div>\n </div>\n </FileUpload>\n\n <div v-if=\"imgs.length > 0\" id=\"save\">\n <download-button\n :onClick=\"downloadZip\"\n :filetype=\"filetype\"\n @update:filetype=\"filetype = $event\"\n />\n </div>\n <br />\n <div v-if=\"imgs.length > 0\" class=\"image-container\">\n <div\n v-for=\"(src, index) in imgs\"\n :key=\"index\"\n class=\"pic\"\n @click=\"() => showImg(index)\"\n >\n <img :src=\"src\" />\n </div>\n </div>\n <vue-easy-lightbox\n escDisabled\n moveDisabled\n :visible=\"visible\"\n :imgs=\"imgs\"\n :index=\"index\"\n @hide=\"handleHide\"\n ></vue-easy-lightbox>\n </div>\n</template>\n<script lang=\"ts\">\nimport { defineComponent } from \"vue\";\nimport FileUpload from \"vue-upload-component\";\nimport DownloadButton from \"./DownloadButton.vue\";\nimport VueEasyLightbox from \"vue-easy-lightbox\";\nimport { saveAs } from \"file-saver\";\nimport JSZip from \"jszip\";\nimport { useToast } from \"vue-toastification\";\nimport { convert } from \"@lenna-proj/lenna-cli\";\nimport { ImageSource } from \"../models/image\";\n\ndeclare interface FileOption {\n text: string;\n value: string;\n}\n\ndeclare interface ImageUploadPreviewData {\n files: Object[];\n imgs: string[];\n visible: boolean;\n index: number;\n filetype: string;\n options: Array<FileOption>;\n}\n\nexport default defineComponent({\n components: {\n FileUpload,\n DownloadButton,\n VueEasyLightbox,\n },\n props: {\n images: {\n type: Array as () => Array<ImageSource>,\n required: true,\n },\n },\n data(): ImageUploadPreviewData {\n return {\n files: [],\n imgs: [],\n visible: false,\n index: 0,\n filetype: \"png\",\n options: [\n { text: \"png\", value: \"png\" },\n { text: \"jpg\", value: \"jpg\" },\n { text: \"bmp\", value: \"bmp\" },\n { text: \"ico\", value: \"ico\" },\n { text: \"gif\", value: \"gif\" },\n ],\n };\n },\n methods: {\n // eslint-disable-next-line no-unused-vars\n inputFile(newFile: any, oldFile: any, prevent: any) {\n //this.images.push(newFile.url);\n this.imgs = [newFile.url];\n this.$emit(\"changeImage\", newFile);\n },\n inputFilter(newFile: any, oldFile: any, prevent: any) {\n if (newFile && !oldFile) {\n if (!/\\.(gif|jpg|jpeg|png|webp)$/i.test(newFile.name)) {\n alert(\"Your choice is not a picture\");\n return prevent();\n }\n }\n if (newFile && (!oldFile || newFile.file !== oldFile.file)) {\n newFile.url = \"\";\n let URL = window.URL || window.webkitURL;\n if (URL && URL.createObjectURL) {\n newFile.url = URL.createObjectURL(newFile.file);\n }\n }\n },\n createObjectURL(image: ImageSource) {\n return URL.createObjectURL(image);\n },\n async safeImage(file: any, format: string) {\n let data = await file\n .arrayBuffer()\n .then((image: any) => new Uint8Array(image));\n return convert(data, format);\n },\n async downloadZip() {\n let zip = new JSZip();\n const toast = useToast();\n const imageCount = this.images.length;\n if (imageCount < 1) {\n return;\n }\n let compressedCount = 0;\n toast.info(`compressing of ${this.images.length} images started`);\n let promises = this.images.map((image: ImageSource) => {\n let type = `image/${this.filetype}`;\n\n return this.safeImage(image, this.filetype).then((compressed_image) => {\n let file = new File([compressed_image], image.name, { type });\n compressedCount++;\n toast.success(\n `compressed ${image.name} ${compressedCount} / ${imageCount} images`\n );\n return zip.file(\n `${image.name.replace(/(\\.[^/.]+)+$/, \"\")}.${this.filetype}`,\n file\n );\n });\n });\n await Promise.all(promises);\n zip.generateAsync({ type: \"blob\" }).then(function (blob) {\n saveAs(blob, \"images.zip\");\n });\n },\n show() {\n this.visible = true;\n },\n showImg(index: any) {\n this.index = index;\n this.visible = true;\n },\n handleHide() {\n this.visible = false;\n },\n },\n watch: {\n $props: {\n handler() {\n this.imgs = [];\n this.index = 0;\n this.images.forEach((image) => {\n this.imgs = [this.createObjectURL(image)];\n });\n },\n deep: true,\n immediate: true,\n },\n },\n});\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n.image-upload {\n margin: 10px;\n width: 300px;\n height: 350px;\n text-align: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.file-upload {\n font-size: 14pt;\n margin: 10px;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.file-upload:hover {\n transform: scale(1.05);\n}\n.upload-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n.upload-container img {\n height: 83px;\n width: 83px;\n padding: 5px;\n}\n.upload-text {\n display: flex;\n flex-direction: column;\n align-items: center;\n\n font-family: \"Quicksand\";\n font-size: 27px;\n font-style: normal;\n font-weight: 500;\n line-height: 34px;\n letter-spacing: 0em;\n text-align: center;\n color: #5C5C5C;\n}\n#upload-button {\n margin: 20px;\n padding: 8px;\n width: 151px;\n background: #ffffff;\n border: 1px solid #000000;\n box-sizing: border-box;\n border-radius: 5px;\n\n font-family: \"Quicksand\";\n font-style: normal;\n font-weight: 500;\n font-size: 17px;\n line-height: 21px;\n color: #000000;\n text-align: center;\n}\n.image-preview {\n margin: 10px;\n width: 100%;\n align-items: center;\n text-align: center;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.image-container img {\n max-width: 100%;\n max-height: 100%;\n}\n.image-container {\n height: 600px;\n display: flex;\n flex-wrap: wrap;\n overflow-y: auto;\n}\n#save {\n position: absolute;\n top: 16px;\n left: 600px;\n filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25));\n}\n#save:hover {\n transform: scale(1.05);\n}\n#or-line {\n margin: 10px;\n display: flex;\n font-size: 18px;\n}\n.line {\n margin: auto;\n margin-left: 10px;\n margin-right: 10px;\n width: 34px;\n height: 0px;\n border: 2px solid #6c6c6c;\n}\n</style>\n","<template>\n <div>\n <div class=\"main\">\n <div id=\"process\" class=\"top_main\">\n <PluginsManager\n class=\"v-step-4\"\n ref=\"pluginsManager\"\n :pluginManager=\"pluginManager\"\n :defaultConfig=\"defaultConfig\"\n :defaultPlugins=\"defaultPlugins\"\n @change=\"processImages()\"\n />\n <ImageUploadPreview\n :images=\"resultImages\"\n @changeImage=\"changeImages($event)\"\n />\n </div>\n <div class=\"bottom_main\">\n </div>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from \"vue\";\nimport * as NProgress from \"nprogress\";\nimport { Slide } from \"vue3-burger-menu\";\nimport { useToast } from \"vue-toastification\";\nimport PluginsManager from \"../components/PluginsManager.vue\";\nimport ImageUploadPreview from \"../components/ImageUploadPreview.vue\";\nimport ConfigComp from \"../components/ConfigComp.vue\";\nimport Help from \"../components/Help.vue\";\nimport { PluginManager } from \"../controllers/plugin_manager\";\nimport { Image, ImageSource } from \"../models/image\";\nimport { processImages } from \"../controllers/processor\";\nimport { listPlugins } from \"../controllers/storage\";\n\nexport declare interface HomeData {\n pluginUrl: string;\n just: string | null;\n defaultConfig: [];\n defaultPlugins: string[];\n sourceImages: Image[];\n resultImages: ImageSource[];\n pluginManager: PluginManager;\n}\n\nexport default defineComponent({\n name: \"Process\",\n components: {\n Slide,\n PluginsManager,\n ImageUploadPreview,\n ConfigComp,\n Help,\n },\n data(): HomeData {\n return {\n pluginUrl: \"\",\n just: null,\n defaultConfig: [],\n defaultPlugins: [],\n sourceImages: [],\n resultImages: [],\n pluginManager: new PluginManager(\"\"),\n };\n },\n setup: () => {\n const pluginsManager = ref(PluginsManager);\n return {\n pluginsManager,\n };\n },\n created() {\n if (this.$route.query[\"config\"]) {\n this.defaultConfig = JSON.parse(\n // eslint-disable-next-line no-undef\n Buffer.from(this.$route.query[\"config\"].toString(), \"base64\").toString(\n \"binary\"\n )\n );\n console.log(this.defaultConfig);\n }\n if (this.$route.query.plugin) {\n this.defaultPlugins = [this.$route.query.plugin.toString()];\n }\n if (this.$route.query.just) {\n this.pluginManager.filter = this.$route.query.just.toString();\n this.just = this.$route.query.just.toString();\n }\n this.loadDefaultPluginsMap();\n this.loadDefaultPluginJson();\n this.loadAddedPlugins();\n },\n methods: {\n loadPlugin(pluginUrl: string) {\n console.log(\"loaded plugin: \", pluginUrl);\n this.pluginManager.importPlugin(pluginUrl, pluginUrl);\n },\n\n loadDefaultPluginsMap() {\n this.pluginManager.importPluginMap(\n \"https://lenna.app/lenna-plugins/importmap.json\"\n );\n },\n loadDefaultPluginJson() {\n this.pluginManager.importPluginsJson(\n \"/plugins.json\"\n );\n },\n loadAddedPlugins() {\n listPlugins().forEach((plugin) => {\n this.pluginManager.importPlugin(plugin, plugin);\n });\n },\n onMorePlugins() {\n window.location.replace(\"/marketplace\");\n },\n changeImages(files: any) {\n this.sourceImages = [files.file];\n this.processImages();\n },\n async processImages() {\n NProgress.configure({ parent: \"#process\" });\n NProgress.start();\n\n await processImages(\n this.sourceImages,\n this.resultImages,\n this.pluginManager.getPlugins(),\n {\n info: (message: string) => {},\n success: (message: string) => {},\n },\n NProgress.set\n );\n NProgress.done();\n NProgress.remove();\n },\n },\n});\n</script>\n<style scoped lang=\"scss\">\n@import \"@/styles/_variables.scss\";\n@import \"//unpkg.com/[email protected]/nprogress.css\";\n@import url(\"https://fonts.googleapis.com/css2?family=Amatic+SC&display=swap\");\n\n.main {\n background-color: $body_background;\n padding: 150px;\n padding-top: 120px;\n text-align: center;\n background-image: url(\"../assets/processbg.svg\");\n background-size: contain;\n background-repeat: no-repeat;\n}\n.top_main {\n display: flex;\n}\n.bottom_main {\n padding-top: 20px;\n padding-bottom: 0;\n}\n\n@media screen and (max-width: 800px) {\n .main {\n margin-top: 120px;\n padding: 0;\n }\n #process button {\n width: 150px;\n }\n}\n</style>\n"],"names":["defineComponent","components","FileUpload","DownloadButton","VueEasyLightbox","props","images","type","Array","required","data","files","imgs","visible","index","filetype","options","text","value","methods","inputFile","newFile","oldFile","prevent","this","url","$emit","inputFilter","test","name","alert","file","window","URL","webkitURL","createObjectURL","image","safeImage","format","arrayBuffer","then","Uint8Array","downloadZip","zip","toast","imageCount","length","compressedCount","info","promises","map","compressed_image","File","success","replace","Promise","all","generateAsync","blob","saveAs","show","showImg","handleHide","watch","$props","handler","forEach","deep","immediate","Slide","PluginsManager","ImageUploadPreview","ConfigComp","Help","pluginUrl","just","defaultConfig","defaultPlugins","sourceImages","resultImages","pluginManager","setup","pluginsManager","ref","created","$route","query","JSON","parse","Buffer","from","toString","console","log","plugin","filter","loadDefaultPluginsMap","loadDefaultPluginJson","loadAddedPlugins","loadPlugin","importPlugin","importPluginMap","importPluginsJson","onMorePlugins","location","changeImages","processImages","parent","getPlugins","message","createApp","use","position","mount","configs","plugins","key","System","import","module","init","__webpack_require__","S","get","importModule","pluginConfig","enabled","config","includes","push","mapUrl","tasks","fetch","json","imports","jsonUrl","changeConfig","find","o","logger","progressCallback","convertedCount","sourceImage","processImage","imageFile","progress","img","process","saveConfig","localStorage","setItem","stringify","loadConfig","savedConfig","getItem","Object","assign","loadConfigFromParams","params","listPlugins","routes","path","component","createRouter","history","createWebHistory","class","_createElementVNode","id","src","_imports_0","_createElementBlock","_hoisted_2","_createVNode","_component_router_link","to","href","_component_v_footer","_toDisplayString","Date","getFullYear","_hoisted_3","Navbar","Footer","_component_Navbar","_component_router_view","_component_Footer","base64config","download","filename","element","document","createElement","setAttribute","encodeURIComponent","style","display","body","appendChild","click","removeChild","generateConfigUrlBase64","btoa","generateBase64Config","generateLennaConfig","lenna_yml","pipeline","generateYamlConfig","_ctx","onClick","$event","readonly","Function","String","emits","emit","computed","set","_Fragment","_renderList","option","script","_hoisted_4","_imports_1","_imports_2","_imports_3","_imports_4","VueSlider","updateConfig","c","_component_vue_slider","interval","min","max","onChange","selected","theta","checked","Boolean","onInput","event","target","title","_renderSlot","undefined","Checkbox","Icon","Blur","Canny","Rotate","PluginTitle","ui","shallowRef","icon","processor","keyCounter","pluginKey","loadDefaultConfig","loadUI","widget","default","catch","e","updateEnabled","_hoisted_5","_component_plugin_title","_component_Checkbox","_cache","_hoisted_11","_createBlock","_component_Blur","onChangeConfig","_component_Canny","_component_Rotate","_hoisted_12","pluginsmap","pluginsjson","Plugin","draggable","beforeMount","changeEnabled","change","raw","comp","_component_draggable","list","item","_component_Plugin","onChangeEnabled","frameborder","width","height","alt","srcset","_component_Help","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_23","_hoisted_25","HowToTile","_hoisted_1","_component_HowToTile","Mountains","AboutProject","HowToConvert","_component_Mountains","_component_AboutProject","_component_HowToConvert","_component_FileUpload","multiple","drop","extensions","accept","onInputFilter","onInputFile","_hoisted_7","_component_download_button","_hoisted_10","_component_vue_easy_lightbox","escDisabled","moveDisabled","onHide","_component_PluginsManager","_component_ImageUploadPreview","onChangeImage"],"sourceRoot":""}