dashy/js/dashy.94aab285.js.map

1 line
821 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/interface-icons/user-logout.svg","webpack:///./src/components/Configuration/ConfigContainer.vue?3452","webpack:///./src/assets/interface-icons/config-delete-local.svg","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue?b271","webpack:///./src/components/Configuration/AppVersion.vue?0a9c","webpack:///./src/assets/interface-icons/config-language.svg","webpack:///./src/assets/interface-icons/application-rebuild.svg","webpack:///./src/components/Settings/ItemSizeSelector.vue?b04a","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue?85ce","webpack:///./src/assets/interface-icons/interactive-editor-app-config.svg","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue?e2ee","webpack:///./src/assets/interface-icons/open-iframe.svg","webpack:///./src/components/Workspace/SideBarItem.vue?1428","webpack:///./src/assets/interface-icons/interactive-editor-save-disk.svg","webpack:///./src/components/Configuration/ConfigContainer.vue?2c6c","webpack:///./src/views/Login.vue?d1de","webpack:///./src/assets/interface-icons/interactive-editor-cancel-changes.svg","webpack:///./src/components/Workspace/WebContent.vue?3653","webpack:///./src/assets/interface-icons/open-current-tab.svg","webpack:///./src/assets/interface-icons/open-new-tab.svg","webpack:///./src/assets/interface-icons/application-about.svg","webpack:///./src/components/PageStrcture/LoadingScreen.vue?b110","webpack:///./src/assets/interface-icons/application-minimal.svg","webpack:///./src/assets/interface-icons/config-editor.svg","webpack:///./src/components/InteractiveEditor/EditSection.vue?b89a","webpack:///./src/components/Settings/CustomThemeMaker.vue?0eb0","webpack:///./src/assets/interface-icons/application-change-view.svg","webpack:///./src/assets/interface-icons/config-backup.svg","webpack:///./src/assets/interface-icons/open-workspace.svg","webpack:///./src/assets/interface-icons/application-reload.svg","webpack:///./src/assets/interface-icons/config-color-palette.svg","webpack:///./src/components/LinkItems/StatusIndicator.vue?e73e","webpack:///./src/components/Settings/ThemeSelector.vue?d713","webpack:///./src/components/InteractiveEditor/EditItem.vue?d1f9","webpack:///./src/components/Settings/LayoutSelector.vue?cc28","webpack:///./src/assets/interface-icons/interactive-editor-export-changes.svg","webpack:///./src/components/Settings/SearchBar.vue?feff","webpack:///./src/components/Settings/LanguageSwitcher.vue?9734","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?0632","webpack:///./src/App.vue?dd7a","webpack:///./src/components/PageStrcture/Header.vue?be8d","webpack:///./src/components/PageStrcture/PageTitle.vue?b2e2","webpack:///./src/utils/StoreMutations.js","webpack:///src/components/PageStrcture/PageTitle.vue","webpack:///./src/components/PageStrcture/PageTitle.vue?3da7","webpack:///./src/components/PageStrcture/PageTitle.vue","webpack:///./src/components/PageStrcture/Nav.vue?545c","webpack:///src/components/PageStrcture/Nav.vue","webpack:///./src/components/PageStrcture/Nav.vue?e74f","webpack:///./src/components/PageStrcture/Nav.vue","webpack:///./src/utils/MiscHelpers.js","webpack:///src/components/PageStrcture/Header.vue","webpack:///./src/components/PageStrcture/Header.vue?2de8","webpack:///./src/components/PageStrcture/Header.vue","webpack:///./src/components/PageStrcture/Footer.vue?7317","webpack:///src/components/PageStrcture/Footer.vue","webpack:///./src/components/PageStrcture/Footer.vue?0e1c","webpack:///./src/components/PageStrcture/Footer.vue","webpack:///./src/components/InteractiveEditor/EditModeTopBanner.vue?7561","webpack:///./src/components/InteractiveEditor/EditModeTopBanner.vue","webpack:///./src/components/PageStrcture/LoadingScreen.vue?1630","webpack:///src/components/PageStrcture/LoadingScreen.vue","webpack:///./src/components/PageStrcture/LoadingScreen.vue?3cf6","webpack:///./src/components/PageStrcture/LoadingScreen.vue","webpack:///./src/utils/CoolConsole.js","webpack:///./src/utils/ErrorHandler.js","webpack:///src/App.vue","webpack:///./src/App.vue?f99d","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?1d1d","webpack:///./src/components/Settings/SettingsContainer.vue?5ebc","webpack:///./src/components/Settings/SearchBar.vue?79d1","webpack:///./src/utils/ArrowKeyNavigation.js","webpack:///./src/utils/ConfigAccumalator.js","webpack:///./src/utils/Auth.js","webpack:///./src/utils/CheckSectionVisibility.js","webpack:///./src/utils/languages.js","webpack:///./src/utils/ConfigHelpers.js","webpack:///./src/utils/Search.js","webpack:///src/components/Settings/SearchBar.vue","webpack:///./src/components/Settings/SearchBar.vue?4b42","webpack:///./src/components/Settings/SearchBar.vue","webpack:///./src/components/Settings/ConfigLauncher.vue?bcd1","webpack:///./src/components/Configuration/ConfigContainer.vue?8bdc","webpack:///./src/components/Configuration/JsonEditor.vue?5a5a","webpack:///./src/components/FormElements/Button.vue?5a34","webpack:///src/components/FormElements/Button.vue","webpack:///./src/components/FormElements/Button.vue?804e","webpack:///./src/components/FormElements/Button.vue","webpack:///./src/components/FormElements/Radio.vue?00db","webpack:///src/components/FormElements/Radio.vue","webpack:///./src/components/FormElements/Radio.vue?6097","webpack:///./src/components/FormElements/Radio.vue","webpack:///src/components/Configuration/JsonEditor.vue","webpack:///./src/components/Configuration/JsonEditor.vue?f3e2","webpack:///./src/components/Configuration/JsonEditor.vue","webpack:///./src/components/Configuration/CustomCss.vue?e4a5","webpack:///./src/components/Settings/CustomThemeMaker.vue?2b1b","webpack:///src/components/Settings/CustomThemeMaker.vue","webpack:///./src/components/Settings/CustomThemeMaker.vue?6674","webpack:///./src/components/Settings/CustomThemeMaker.vue","webpack:///./src/components/Settings/ThemeSelector.vue?d390","webpack:///./src/utils/ThemeHelper.js","webpack:///src/components/Settings/ThemeSelector.vue","webpack:///./src/components/Settings/ThemeSelector.vue?84ba","webpack:///./src/components/Settings/ThemeSelector.vue","webpack:///src/components/Configuration/CustomCss.vue","webpack:///./src/components/Configuration/CustomCss.vue?4b5d","webpack:///./src/components/Configuration/CustomCss.vue","webpack:///./src/components/Configuration/CloudBackupRestore.vue?b97f","webpack:///./src/components/FormElements/Input.vue?2266","webpack:///src/components/FormElements/Input.vue","webpack:///./src/components/FormElements/Input.vue?2102","webpack:///./src/components/FormElements/Input.vue","webpack:///./src/utils/CloudBackup.js","webpack:///src/components/Configuration/CloudBackupRestore.vue","webpack:///./src/components/Configuration/CloudBackupRestore.vue?fc42","webpack:///./src/components/Configuration/CloudBackupRestore.vue","webpack:///./src/components/Configuration/RebuildApp.vue?f75a","webpack:///src/components/Configuration/RebuildApp.vue","webpack:///./src/components/Configuration/RebuildApp.vue?7d07","webpack:///./src/components/Configuration/RebuildApp.vue","webpack:///./src/components/Configuration/AppVersion.vue?04c8","webpack:///src/components/Configuration/AppVersion.vue","webpack:///./src/components/Configuration/AppVersion.vue?3f67","webpack:///./src/components/Configuration/AppVersion.vue","webpack:///src/components/Configuration/ConfigContainer.vue","webpack:///./src/components/Configuration/ConfigContainer.vue?a1c8","webpack:///./src/components/Configuration/ConfigContainer.vue","webpack:///./src/components/Settings/LanguageSwitcher.vue?d488","webpack:///src/components/Settings/LanguageSwitcher.vue","webpack:///./src/components/Settings/LanguageSwitcher.vue?6797","webpack:///./src/components/Settings/LanguageSwitcher.vue","webpack:///src/components/Settings/ConfigLauncher.vue","webpack:///./src/components/Settings/ConfigLauncher.vue?64bf","webpack:///./src/components/Settings/ConfigLauncher.vue","webpack:///./src/components/Settings/LayoutSelector.vue?53bf","webpack:///src/components/Settings/LayoutSelector.vue","webpack:///./src/components/Settings/LayoutSelector.vue?b5bf","webpack:///./src/components/Settings/LayoutSelector.vue","webpack:///./src/components/Settings/ItemSizeSelector.vue?4732","webpack:///src/components/Settings/ItemSizeSelector.vue","webpack:///./src/components/Settings/ItemSizeSelector.vue?b3f2","webpack:///./src/components/Settings/ItemSizeSelector.vue","webpack:///./src/components/Settings/AuthButtons.vue?deeb","webpack:///src/components/Settings/AuthButtons.vue","webpack:///./src/components/Settings/AuthButtons.vue?5ea4","webpack:///./src/components/Settings/AuthButtons.vue","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?84c8","webpack:///src/components/Settings/KeyboardShortcutInfo.vue","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?4c22","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue","webpack:///./src/components/Configuration/AppInfoModal.vue?900b","webpack:///src/components/Configuration/AppInfoModal.vue","webpack:///./src/components/Configuration/AppInfoModal.vue?c1c1","webpack:///./src/components/Configuration/AppInfoModal.vue","webpack:///src/components/Settings/SettingsContainer.vue","webpack:///./src/components/Settings/SettingsContainer.vue?d1c9","webpack:///./src/components/Settings/SettingsContainer.vue","webpack:///./src/components/LinkItems/Section.vue?9079","webpack:///./src/components/LinkItems/Item.vue?c1b3","webpack:///./src/components/LinkItems/ItemIcon.vue?8410","webpack:///src/components/LinkItems/ItemIcon.vue","webpack:///./src/components/LinkItems/ItemIcon.vue?4095","webpack:///./src/components/LinkItems/ItemIcon.vue","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?0837","webpack:///src/components/LinkItems/ItemOpenMethodIcon.vue","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?5dc8","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue","webpack:///./src/components/LinkItems/StatusIndicator.vue?37ad","webpack:///src/components/LinkItems/StatusIndicator.vue","webpack:///./src/components/LinkItems/StatusIndicator.vue?5395","webpack:///./src/components/LinkItems/StatusIndicator.vue","webpack:///./src/components/InteractiveEditor/EditItem.vue?036d","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue?6706","webpack:///src/components/InteractiveEditor/SaveCancelButtons.vue","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue?4928","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue","webpack:///./src/components/FormElements/Select.vue?d011","webpack:///src/components/FormElements/Select.vue","webpack:///./src/components/FormElements/Select.vue?5eee","webpack:///./src/components/FormElements/Select.vue","webpack:///src/components/InteractiveEditor/EditItem.vue","webpack:///./src/components/InteractiveEditor/EditItem.vue?54ab","webpack:///./src/components/InteractiveEditor/EditItem.vue","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue?14ae","webpack:///src/components/InteractiveEditor/MoveItemTo.vue","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue?ce62","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue","webpack:///./src/components/LinkItems/ItemContextMenu.vue?7a3e","webpack:///src/components/LinkItems/ItemContextMenu.vue","webpack:///./src/components/LinkItems/ItemContextMenu.vue?b9d2","webpack:///./src/components/LinkItems/ItemContextMenu.vue","webpack:///src/components/LinkItems/Item.vue","webpack:///./src/components/LinkItems/Item.vue?2ad0","webpack:///./src/components/LinkItems/Item.vue","webpack:///./src/components/LinkItems/Collapsable.vue?81c3","webpack:///src/components/LinkItems/Collapsable.vue","webpack:///./src/components/LinkItems/Collapsable.vue?31d4","webpack:///./src/components/LinkItems/Collapsable.vue","webpack:///./src/components/LinkItems/IframeModal.vue?331c","webpack:///src/components/LinkItems/IframeModal.vue","webpack:///./src/components/LinkItems/IframeModal.vue?cd01","webpack:///./src/components/LinkItems/IframeModal.vue","webpack:///./src/components/InteractiveEditor/EditSection.vue?6dfc","webpack:///src/components/InteractiveEditor/EditSection.vue","webpack:///./src/components/InteractiveEditor/EditSection.vue?7248","webpack:///./src/components/InteractiveEditor/EditSection.vue","webpack:///./src/components/LinkItems/SectionContextMenu.vue?3c3d","webpack:///src/components/LinkItems/SectionContextMenu.vue","webpack:///./src/components/LinkItems/SectionContextMenu.vue?fe43","webpack:///./src/components/LinkItems/SectionContextMenu.vue","webpack:///src/components/LinkItems/Section.vue","webpack:///./src/components/LinkItems/Section.vue?101a","webpack:///./src/components/LinkItems/Section.vue","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue?f133","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue?fa99","webpack:///src/components/InteractiveEditor/EditPageInfo.vue","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue?a59e","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue?ea9d","webpack:///src/components/InteractiveEditor/EditAppConfig.vue","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue?6b96","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue","webpack:///src/components/InteractiveEditor/EditModeSaveMenu.vue","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue?c5f5","webpack:///./src/components/InteractiveEditor/EditModeSaveMenu.vue","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue?8055","webpack:///src/components/InteractiveEditor/ExportConfigMenu.vue","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue?a747","webpack:///./src/components/InteractiveEditor/ExportConfigMenu.vue","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue?72a1","webpack:///src/components/InteractiveEditor/AddNewSectionLauncher.vue","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue?6863","webpack:///./src/components/InteractiveEditor/AddNewSectionLauncher.vue","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?588c","webpack:///./src/views/Home.vue","webpack:///./src/views/Login.vue?125c","webpack:///src/views/Login.vue","webpack:///./src/views/Login.vue?b90c","webpack:///./src/views/Login.vue","webpack:///./src/views/Workspace.vue?b9ac","webpack:///./src/components/Workspace/SideBar.vue?c306","webpack:///./src/components/Workspace/SideBarItem.vue?07a3","webpack:///src/components/Workspace/SideBarItem.vue","webpack:///./src/components/Workspace/SideBarItem.vue?7db1","webpack:///./src/components/Workspace/SideBarItem.vue","webpack:///./src/components/Workspace/SideBarSection.vue?c88b","webpack:///src/components/Workspace/SideBarSection.vue","webpack:///./src/components/Workspace/SideBarSection.vue?2afa","webpack:///./src/components/Workspace/SideBarSection.vue","webpack:///src/components/Workspace/SideBar.vue","webpack:///./src/components/Workspace/SideBar.vue?968e","webpack:///./src/components/Workspace/SideBar.vue","webpack:///./src/components/Workspace/WebContent.vue?7e00","webpack:///src/components/Workspace/WebContent.vue","webpack:///./src/components/Workspace/WebContent.vue?1b3c","webpack:///./src/components/Workspace/WebContent.vue","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?e89e","webpack:///src/components/Workspace/MultiTaskingWebComtent.vue","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?dc52","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue","webpack:///src/views/Workspace.vue","webpack:///./src/views/Workspace.vue?f4db","webpack:///./src/views/Workspace.vue","webpack:///./src/views/Minimal.vue?f117","webpack:///./src/components/MinimalView/MinimalSection.vue?080f","webpack:///src/components/MinimalView/MinimalSection.vue","webpack:///./src/components/MinimalView/MinimalSection.vue?fa57","webpack:///./src/components/MinimalView/MinimalSection.vue","webpack:///./src/components/MinimalView/MinimalHeading.vue?2260","webpack:///src/components/MinimalView/MinimalHeading.vue","webpack:///./src/components/MinimalView/MinimalHeading.vue?4e62","webpack:///./src/components/MinimalView/MinimalHeading.vue","webpack:///./src/components/MinimalView/MinimalSearch.vue?d024","webpack:///src/components/MinimalView/MinimalSearch.vue","webpack:///./src/components/MinimalView/MinimalSearch.vue?707f","webpack:///./src/components/MinimalView/MinimalSearch.vue","webpack:///src/views/Minimal.vue","webpack:///./src/views/Minimal.vue?4dec","webpack:///./src/views/Minimal.vue","webpack:///./src/router.js","webpack:///./src/store.js","webpack:///./src/utils/InitServiceWorker.js","webpack:///./src/utils/ClickOutside.js","webpack:///./src/utils/ErrorReporting.js","webpack:///./src/main.js","webpack:///./src/assets/interface-icons/config-open-settings.svg","webpack:///./src/assets/interface-icons/layout-horizontal.svg","webpack:///./src/components/InteractiveEditor/MoveItemTo.vue?a409","webpack:///./src/assets/interface-icons/interactive-editor-move-to.svg","webpack:///./src/assets/interface-icons/application-home.svg","webpack:///./src/assets/interface-icons/interactive-editor-copy-clipboard.svg","webpack:///./src/App.vue?946b","webpack:///./src/utils/defaults.js","webpack:///./src/assets/interface-icons/config-close.svg","webpack:///./src/assets/interface-icons/loader.svg","webpack:///./src/views/Minimal.vue?57d3","webpack:///./src/assets/interface-icons/cloud-backup-restore.svg","webpack:///./src/components/PageStrcture/PageTitle.vue?e490","webpack:///./src/components/MinimalView/MinimalSection.vue?76c5","webpack:///./src/assets/interface-icons/back-arrow.svg","webpack:///./src/components/FormElements/Button.vue?8869","webpack:///./src/components/Workspace/SideBarSection.vue?b5d5","webpack:///./src/assets/interface-icons/icon-size-medium.svg","webpack:///./src/components/LinkItems/SectionContextMenu.vue?7a2d","webpack:///./src/assets/interface-icons/interactive-editor-remove.svg","webpack:///./src/components/Settings/AuthButtons.vue?f323","webpack:///./src/assets/interface-icons/config-custom-css.svg","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?b9aa","webpack:///./src/components/LinkItems/StatusIndicator.vue?3cfb","webpack:///./src/components/Configuration/JsonEditor.vue?3537","webpack:///./src/components/LinkItems/Item.vue?7ab8","webpack:///./src/components/MinimalView/MinimalHeading.vue?4a91","webpack:///./src/assets/interface-icons/open-top.svg","webpack:///./src/components/FormElements/Input.vue?43ad","webpack:///./src/components/LinkItems/ItemContextMenu.vue?bd7d","webpack:///./public/conf.yml","webpack:///./src/components/Configuration/AppInfoModal.vue?d472","webpack:///./src/assets/interface-icons/interactive-editor-page-info.svg","webpack:///./src/assets/interface-icons/config-cancel.svg","webpack:///./src/assets/interface-icons/save-config.svg","webpack:///./src/assets/interface-icons/icon-size-large.svg","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?4558","webpack:///./src/assets/interface-icons/broken-icon.svg","webpack:///./src/components/LinkItems/Section.vue?4723","webpack:///./src/components/Configuration/CustomCss.vue?1f3c","webpack:///./src/components/PageStrcture/Footer.vue?6cf7","webpack:///./src/components/PageStrcture/Nav.vue?f817","webpack:///./src/components/Settings/ConfigLauncher.vue?694b","webpack:///./src/components/FormElements/Select.vue?2ed1","webpack:///./src/components/InteractiveEditor/EditModeTopBanner.vue?a8b8","webpack:///./src/views/Workspace.vue?0b24","webpack:///./src/components/InteractiveEditor/SaveCancelButtons.vue?e9f4","webpack:///./src/assets/interface-icons/unknown-icon.svg","webpack:///./src/views/Minimal.vue?c486","webpack:///./src/components/LinkItems/Collapsable.vue?8d81","webpack:///./src/components/FormElements/Select.vue?47db","webpack:///./src/components/InteractiveEditor/EditAppConfig.vue?5308","webpack:///./src/assets/interface-icons/interactive-editor-edit-mode.svg","webpack:///./src/assets/interface-icons/interactive-editor-save-locally.svg","webpack:///./src/components/Workspace/SideBar.vue?5c7e","webpack:///./src/components/FormElements/Radio.vue?33ea","webpack:///./src/assets/interface-icons/layout-default.svg","webpack:///./src/assets/interface-icons/config-download-file.svg","webpack:///./src/components/InteractiveEditor/EditPageInfo.vue?fa8e","webpack:///./src/assets/interface-icons/icon-size-small.svg","webpack:///./src/views/Home.vue?9b46","webpack:///./src/components/LinkItems/ItemIcon.vue?e6ee","webpack:///./src/components/Configuration/AppInfoModal.vue?ad8e","webpack:///./src/assets/interface-icons/open-parent.svg","webpack:///./src/utils/EmojiUnicodeRegex.js","webpack:///./src/assets/interface-icons/burger-menu.svg","webpack:///./src/assets/interface-icons/interactive-editor-add.svg","webpack:///./src/assets/interface-icons/config-restore.svg","webpack:///./src/assets/interface-icons/config-edit-json.svg","webpack:///./src/utils/JsonToYaml.js","webpack:///./src/components/PageStrcture/Header.vue?4925","webpack:///./src/components/LinkItems/IframeModal.vue?11f4","webpack:///./src/components/Settings/SettingsContainer.vue?708e","webpack:///./src/components/Settings/LanguageSwitcher.vue?042c","webpack:///./src/components/Configuration/RebuildApp.vue?206b","webpack:///./src/components/LinkItems/Item.vue?1142","webpack:///./src/assets/interface-icons/layout-vertical.svg","webpack:///./src/components/Configuration/CloudBackupRestore.vue?9556"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","installedCssChunks","jsonpScriptSrc","p","exports","module","l","e","promises","cssChunks","Promise","resolve","reject","href","fullhref","existingLinkTags","document","getElementsByTagName","tag","dataHref","getAttribute","rel","existingStyleTags","linkTag","createElement","type","onload","onerror","event","request","target","src","err","Error","code","parentNode","removeChild","head","appendChild","then","installedChunkData","promise","onScriptComplete","script","charset","timeout","nc","setAttribute","error","clearTimeout","chunk","errorType","realSrc","message","name","undefined","setTimeout","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","console","jsonpArray","window","oldJsonpFunction","slice","functional","_h","_vm","_c","_v","children","class","classNames","staticClass","style","staticStyle","attrs","rest","assign","concat","render","this","$createElement","_self","_e","isLoading","pageInfo","visibleComponents","footerText","staticRenderFns","title","description","logo","navLinks","isEditMode","_s","directives","rawName","tooltip","expression","on","$event","editTitle","KEY_NAMES","MUTATIONS","forEach","props","String","components","EditModeIcon","computed","$store","state","editMode","methods","$modal","show","commit","content","$t","component","navVisible","_l","link","index","path","isUrl","IconBurger","links","Array","isMobile","detectMobile","screenWidth","body","clientWidth","shouldBeVisible","routeName","hideFurnitureOn","includes","asciiHash","input","str","Math","random","toString","reducer","previousHash","char","charCodeAt","asciiSum","split","reduce","shortened","btoa","makeItemId","sectionStr","itemStr","charSum","map","a","x","y","itemTitleStr","replace","toLowerCase","applyItemId","inputSections","sections","sec","secIdx","items","item","itemIdx","id","PageTitle","Nav","$route","getters","pageTitle","navigation","text","visible","domProps","authorUrl","authorName","licenseUrl","license","showCopyright","date","repoUrl","_m","welcomeMsg","v","log","warningMsg","info","statusMsg","msg","statusErrorMsg","errorLog","makeTime","now","Date","pad","digit","padStart","getHours","getMinutes","getSeconds","appendToErrorLog","sessionStorage","getItem","sessionStorageKeys","ERROR_LOG","setItem","ErrorHandler","Sentry","InfoHandler","WarningInfoHandler","InfoKeys","AUTH","CLOUD_BACKUP","EDITOR","RAW_EDITOR","VISUAL","Header","Footer","LoadingScreen","EditModeTopBanner","config","appConfig","dispatch","usersCss","textContent","append","shouldShowSplash","availibleLocales","isLangSupported","languageList","userLang","usersBorwserLang1","navigator","language","usersBorwserLang2","usersSpairLangs","languages","$i18n","availableLocales","usersLang","localStorage","autoDetectLanguage","getLanguage","locale","loader","getElementById","display","applyLanguage","hideSplash","customCss","cleanedCss","injectCustomStyles","hideLoader","getBackgroundImage","ref","layout","itemSizeBound","getExternalCSSLinks","modalOpen","searching","updateModalVisibility","checkTheresData","singleSectionView","colCount","section","searchValue","filterTiles","icon","getDisplayData","finishedSearching","checkIfResults","userIsTypingSomething","settingsVisible","displayLayout","iconSize","userState","toggleSettingsVisibility","minimalSearch","preventDefault","searchSubmitted","arguments","composing","indexOf","_k","keyCode","clearFilterInput","searchPrefs","disableWebSearch","ArrowKeyNavigation","constructor","resetIndex","arrowNavigation","goToPrevious","goToNext","getSafeElementIndex","selectItemByIndex","focus","getElementsByClassName","numResults","getNumResults","startingIndex","isSameRow","indx","pos","offsetTop","checkPreviousIndex","currentIndex","yPos","position","isBelow","start","end","nextIndex","findPreviousRow","count","rowLen","findNextRow","adjustment","checkNextIndex","isAbove","ConfigAccumulator","conf","appConfigFile","usersAppConfig","defaultAppConfig","localStorageKeys","APP_CONFIG","JSON","parse","LAYOUT_ORIENTATION","defaultLayout","ICON_SIZE","defaultIconSize","auth","localPageInfo","PAGE_INFO","filePageInfo","defaultPageInfo","localSections","CONF_SECTIONS","json","getAppConfig","Accumulator","printWarning","isKeycloakEnabled","enableKeycloak","getKeycloakConfig","keycloak","serverUrl","realm","clientId","getUsers","isArray","users","generateUserToken","user","strAndUpper","toUpperCase","sha","sha256","hash","isLoggedIn","validTokens","userAuthenticated","cookie","cookieKey","trim","cookieValue","cookieKeys","AUTH_TOKEN","isAuthEnabled","isGuestAccessEnabled","enableGuestAccess","checkCredentials","username","pass","messages","response","correct","successMsg","incorrectPassword","missingPassword","missingUsername","incorrectUsername","login","expiry","setTime","getTime","toGMTString","userObject","USERNAME","logout","removeItem","getCurrentUser","foundUserObject","isLoggedInAsGuest","guestEnabled","notLoggedIn","isUserAdmin","currentUser","isAdmin","getUserState","notConfigured","loggedIn","guestAccess","userStateEnum","determineVisibility","visibilityList","cUsername","isFound","userInList","isSectionVisibleToUser","displayData","isGuest","checkVisiblity","hideFor","hideForUsers","checkHiddenability","showForUsers","checkIfHideForGuest","hideForGuest","hideForGuests","checkSectionVisibility","filter","currentSection","en","flag","de","nl","pl","fr","sl","es","it","zhCN","ar","hi","ja","pt","ru","nb","pirate","i18nMessages","lang","filterUserSections","componentVisibility","usersChoice","hideComponents","isThere","userValue","hideHeading","hideNav","searchBar","hideSearch","settings","hideSettings","footer","hideFooter","splashScreen","hideSplashScreen","getTheme","localTheme","THEME","appConfigTheme","theme","defaultTheme","getCustomColors","localColors","CUSTOM_COLORS","configColors","customColors","getCustomKeyShortcuts","results","itemsWithHotKeys","hotkey","url","flat","getUsersLanguage","langCode","LANGUAGE","defaultLanguage","langObj","find","targetValidator","acceptedTargets","ConfigSchema","properties","enum","isTargetValid","getDomainFromUrl","urlPattern","domainPattern","match","filterHelper","compareStr","searchStr","process","searchTiles","allTiles","searchTerm","tile","provider","tags","getSearchEngineFromBang","searchQuery","bangList","bangNames","keys","foundBang","bang","findUrlForSearchEngine","searchEngine","availableSearchEngines","test","stripBangs","q","Boolean","akn","webSearch","addEventListener","handleKeyPress","removeEventListener","currentElem","activeElement","notAlreadySearching","active","$refs","handleHotKey","$emit","blur","usersHotKeys","parseInt","open","method","openingMethod","searchBang","desiredSearchEngine","isCustomSearch","searchUrl","encodeURIComponent","launchWebSearch","showEditor","enterEditModeTooltip","startInteractiveEditor","openChangeViewMenu","modalNames","CONF_EDITOR","editorClosed","combineConfig","LANG_SWITCHER","openExportConfigModal","navigateToTab","openLanguageSwitchModal","backupId","openRebuildAppModal","resetLocalSettings","openAboutModal","options","model","callback","$$v","jsonData","saveOptions","initialSaveMode","allowWriteToDisk","saveMode","isValid","save","startPreview","errorMessages","saveSuccess","responseText","disallow","disabled","click","_t","Function","trigger","delay","label","radio","makeGroupName","_q","selectedRadio","updateValue","initialOption","VJsoneditor","Button","Radio","schema","modes","onValidationError","validationErrors","progress","allowConfigEdit","writeConfigToDisk","$toasted","saveConfigLocally","hide","yaml","baseUrl","endpoint","headers","success","carefullyClearLocalStorage","showToast","errors","currentTheme","showingAllVars","colorName","replaceAll","isColor","swatches","setVariable","$set","makeSwatchStyles","slot","isTextual","showFontVariables","findAllVariableNames","exportToClipboard","resetAndSave","themeToEdit","saveChanges","resetUnsavedColors","VSwatches","SaveIcon","CancelIcon","makeInitialData","cssVar","getComputedStyle","documentElement","getPropertyValue","variable","setProperty","priorSettings","variables","removeProperty","themeName","clipboardText","clipboard","writeText","variableArray","hasDash","addDash","removeDash","getCssVariableValue","currentVariables","fonts","fontVariables","availableVariables","from","styleSheets","colorHex","threeToSix","hex","hexToRgb","hexCode","startsWith","colorParts","exec","getLightness","contrastingColor","getForegroundColor","variableName","variableValue","nonColorVariables","varName","varValue","themeNames","themeChanged","selectedTheme","hidePallete","openThemeConfigurator","closeThemeConfigurator","GetTheme","ApplyCustomVariables","mainCssVars","vName","themeColors","customVar","ApplyLocalTheme","newTheme","htmlTag","hasAttribute","removeAttribute","LoadExternalTheme","preloadTheme","sheet","checkTheme","themes","selectTheme","add","CustomThemeMaker","IconPalette","watch","updateTheme","themeConfiguratorOpen","themeHelper","externalThemeNames","externalThemes","specialThemes","userThemes","cssThemes","availibleThemes","externalStyleSheet","externals","ext","Default","initialTheme","getInitialTheme","added","isThemeLocal","themeToCheck","localThemes","resetToDefault","ThemeSelector","css","saveToBrowser","injectToPage","showSuccessMsg","reloadPage","userStyles","localAppConfig","backupPassword","checkPass","restoreCode","restorePassword","restoreBackup","placeholder","Number","default","validator","ENDPOINT","backupEndpoint","encryptData","password","stringifiedData","stringify","encryptedData","aes","encrypt","decryptData","decrypt","Utf8","makeSubHash","backup","axios","post","userData","subHash","update","put","encodeGetParams","entries","kv","join","restore","params","errorMsg","decryptedData","Input","IconBackup","IconRestore","savedHash","makeUpdate","showErrorMsg","makeBackup","setBackupIdLocally","isUpdate","makeHash","modalName","startBuild","loading","allowRebuild","scopedSlots","_u","fn","proxy","output","refreshPage","RebuildIcon","ReloadIcon","LoadingAnimation","responseData","location","reload","isVersionValid","appVersion","finished","isUpToDate","veryOutOfDate","latestVersion","checksEnabled","checkVersion","packageUrl","version","checkIfUpToDate","currentVersion","difference","isNaN","jsonParser","JsonToYaml","JsonEditor","CustomCssEditor","CloudBackupRestore","RebuildApp","AppVersion","DownloadIcon","DeleteIcon","EditIcon","CloudIcon","CustomCssIcon","LanguageIcon","IconAbout","tabInxex","itemToSelect","tabView","navItems","activeTabItem","isTheUserSure","confirm","clear","navToTab","navigateConfToTab","isValidTabIndex","navigateToStartingTab","applyLanguageLocally","saveLanguage","SaveConfigIcon","savedLanguage","getIsoFromLangObj","newLang","friendlyName","selectedLanguage","i18nLocales","checkLocale","getLanguageFromIso","viewSwitcherOpen","ConfigContainer","LanguageSwitcher","IconSpanner","IconInteractiveEditor","IconViewMode","IconHome","IconWorkspaceView","IconMinimalView","updateDisplayLayout","IconDeafault","IconHorizontal","IconVertical","updateIconSize","IconSmall","IconMedium","IconLarge","makeText","userType","goToLogin","IconLogout","shouldHide","hideWelcomeHelper","timeDelay","keyPressEvent","shouldHideWelcomeMessage","$destroy","getErrorLog","SearchBar","ConfigLauncher","LayoutSelector","ItemSizeSelector","AuthButtons","KeyboardShortcutInfo","AppInfoModal","IconOpen","IconClose","getSettingsVisibility","something","groupId","collapsed","cols","rows","color","customStyles","openEditSection","openContextMenu","isGridLayout","itemSize","backgroundColor","statusCheckUrl","statusCheckHeaders","newItemSize","shouldEnableStatusCheck","statusCheck","getStatusCheckInterval","statusCheckAllowInsecure","triggerModal","closeEditSection","contextMenuOpen","contextPos","posX","posY","navigateToSection","removeSection","getTooltipOptions","makeClassList","getUnicodeOpeningIcon","hyperLinkHref","anchorTarget","itemOpened","button","accumulatedTarget","statusResponse","successStatus","openItemSettings","isAddNew","launchItem","openMoveItemMenu","openDeleteItem","parentSectionTitle","closeEditMenu","size","iconType","getEmoji","iconPath","getSimpleIcon","broken","imageNotFound","BrokenImage","determineImageType","getIconPath","pattern","RegExp","img","fileExtRegex","validImgExtensions","splitPath","emojiCode","emojiType","fromCodePoint","substr","fullUrl","specificApi","shouldUseDefaultFavicon","urlParts","host","getHostName","faviconApi","faviconIdentifier","getFavicon","isLocalIP","encodeURI","imageName","toLocaleLowerCase","imgType","makeClass","isSmall","isTransparent","transparent","NewTabOpenIcon","SameTabOpenIcon","IframeOpenIcon","WorkspaceOpenIcon","ParentOpenIcon","TopOpenIcon","UnknownIcon","statusText","otherStatusText","classes","statusSuccess","startTime","modalClosed","itemId","formData","row","boolRadioOptions","boolToStr","removeField","additionalFormData","appendNewField","saveItem","saveClick","cancelClick","selectedOption","isNew","Select","AddIcon","BinIcon","SaveCancelButtons","getItemFromState","makeInitialFormData","getItemById","getInputType","requiredFields","unneededFields","isPrimaryField","singleRow","makeRowData","bool","fieldId","elem","schemaItem","definedType","structured","newItem","formatBeforeSave","payload","strToTags","tagArr","strToBool","close","operationRadioOptions","operation","sectionList","selectedSection","appendToRadioOptions","appendTo","initialSection","sectionName","copyPayload","isMenuDisabled","launch","openSettings","openMoveMenu","MoveIcon","disableContextMenu","subtitle","enableStatusCheck","statusCheckInterval","Icon","ItemOpenMethodIcon","StatusIndicator","ContextMenu","MoveItemTo","EditItem","defaultOpeningMethod","nothing","noAnchorNeeded","getId","background","editMenuOpen","altKey","disableSmartSort","incrementMostUsedCount","incrementLastUsedCount","clientX","pageXOffset","clientY","pageYOffset","providerText","lb1","hotkeyText","tooltipText","editText","hideOnTargetClick","html","placement","encode","urlToCheck","enableInsecure","makeApiUrl","mostUsed","counter","lastUsed","closeContextMenu","parentSection","getParentSectionOfItem","checkWebsiteStatus","setInterval","rowColSpanClass","collapseClass","sanitizeCustomStyles","sectionKey","isExpanded","collapseChanged","editTooltip","openEditModal","uniqueKey","checkSpanNum","getCollapseState","span","classPrefix","maxSpan","numSpan","userCss","storageKey","initStorage","collapseStateObject","initialiseStorage","newState","collapseState","whatChanged","srcElement","checked","setCollapseState","customSchema","sectionData","saveSection","sectionIndex","FormSchema","sectionSchema","displayDataSchema","sortBy","getSectionByIndex","openSection","openEditSectionMenu","Collapsable","Item","IframeModal","EditSection","sortOrder","sortAlphabetically","reverse","sortByMostUsed","sortBLastUsed","sortRandomly","sectionLayout","styles","itemCountX","itemCountY","itemPreference","globalPreference","interval","sort","b","usageCount","gmu","glu","sectionIdentifier","confirmMsg","youSure","saveLocally","writeToDisk","openExportConfigMenu","openCloudBackupMenu","openRawConfigEditor","reset","openEditPageInfo","openEditAppConfig","saveToState","cancelEditing","processedFormData","removeUndefinedValues","rawAppConfig","raw","isEmpty","EditPageInfo","SaveLocallyIcon","SaveToDiskIcon","ExportIcon","AppConfigIcon","PageInfoIcon","EditAppConfig","CloudBackupIcon","EditRawIcon","yamlOptions","copyConfigToClipboard","downloadConfig","CopyConfigIcon","DownloadConfigIcon","filename","convertJsonToYaml","element","openAddNewSectionMenu","addNewSectionOpen","EditSectionMenu","SettingsContainer","EditModeSaveMenu","ExportConfigMenu","AddNewSection","Section","BackIcon","findSingleSection","filterComp","modalState","allSections","sectionTitle","sectionToReturn","prefix","isNeeded","checkIfIconLibraryNeeded","enableFontAwesome","checkIfFontAwesomeNeeded","fontAwesomeScript","faKey","fontAwesomeKey","checkIfMdiNeeded","mdiStylesheet","itemsFound","backgroundImg","initiateFontAwesome","initiateMaterialDesignIcons","layoutOrientation","existingUsername","stayLoggedIn","getOut","status","isUserAlreadyLoggedIn","isAuthenticationEnabled","dropDownMenu","submitLogin","guestLogin","time","goHome","isAllowed","setTheme","getInitialUrl","launchApp","isMultiTaskingEnabled","isOpen","itemClicked","SideBarItem","initUrl","fill","SideBarSection","val","ind","compare","findIndex","openDefaultSection","openApps","openExistingApp","appendNewApp","ComponentClass","instance","propsData","$mount","container","$el","frame","classList","remove","enableMultiTasking","SideBar","WebContent","MultiTaskingWebComtent","route","query","decodeURI","workspaceLandingUrl","this$1","setColumnCount","modalChanged","tabbedView","getSections","sectionSelected","selected","showAll","makeId","selectSection","startFiltering","MinimalSection","MinimalHeading","MinimalSearch","clearMinFilterInput","applyTheme","Vue","use","Router","ProgressBar","isAuthenticated","authEnabled","userLoggedIn","getConfig","getStartingView","startingView","getStartingComponent","usersPreference","Home","Minimal","Workspace","makeMetaTags","defaultTitle","metaTags","metaTagData","routingMode","router","routes","meta","routePaths","home","workspace","minimal","Login","beforeEnter","to","next","about","download","notFound","redirectedFrom","redirect","beforeEach","afterEach","nextTick","Vuex","INITIALIZE_CONFIG","SET_CONFIG","SET_MODAL_OPEN","SET_LANGUAGE","SET_ITEM_LAYOUT","SET_ITEM_SIZE","SET_THEME","SET_CUSTOM_COLORS","UPDATE_ITEM","SET_EDIT_MODE","SET_PAGE_INFO","SET_APP_CONFIG","SET_SECTIONS","UPDATE_SECTION","INSERT_SECTION","REMOVE_SECTION","COPY_ITEM","REMOVE_ITEM","INSERT_ITEM","UPDATE_CUSTOM_CSS","CONF_MENU_INDEX","Keys","store","Store","foundItem","itm","foundSection","mutations","newConfig","secIndex","itemIndex","newPageInfo","newAppConfig","newSections","newSection","targetSection","toSection","unshift","actions","deepCopy","setSwStatus","swStateToSet","initialSwState","ready","registered","cached","updateFound","updated","offline","devMode","disabledByUser","sessionData","SW_STATUS","currentSwState","newSwState","shouldEnableServiceWorker","enableServiceWorker","printSwStatus","swUrl","registerServiceWorker","register","updatefound","instances","onDocumentClick","el","contains","binding","dataset","outsideClickIndex","unbind","handler","ErrorReporting","enableErrorReporting","require","Integrations","dsn","sentryDsn","init","integrations","BrowserTracing","routingInstrumentation","vueRouterInstrumentation","tracesSampleRate","release","VueI18n","VTooltip","tooltipOptions","VModal","VTabs","TreeView","Toasted","toastedOptions","VSelect","directive","clickOutside","productionTip","i18n","fallbackLocale","serviceWorker","awesome","Dashy","mount","initOptions","onLoad","Keycloak","serviceEndpoints","statusPing","rebuild","builtInThemes","HIDE_WELCOME_BANNER","COLLAPSE_STATE","BACKUP_ID","BACKUP_HASH","HIDE_SETTINGS","MOST_USED","LAST_USED","REBUILD_APP","ABOUT_APP","EDIT_ITEM","EDIT_SECTION","EDIT_PAGE_INFO","EDIT_APP_CONFIG","EXPORT_CONFIG_MENU","MOVE_ITEM_TO","topLevelConfKeys","SECTIONS","splashScreenTime","duration","keepOnHover","className","iconPack","defaultTrigger","defaultHideOnTargetClick","autoHide","defaultHtml","defaultPlacement","defaultLoadingContent","defaultDelay","faviconApiEndpoints","mcapi","clearbit","faviconkit","google","allesedv","webmasterapi","iconCdns","fa","mdi","si","generative","localPath","faviconName","homeLabIcons","searchEngineUrls","duckduckgo","whoogle","qwant","startpage","ecosia","metager","swisscows","mojeek","peekier","wikipedia","stackoverflow","wolframalpha","reddit","youtube","github","bbc","defaultSearchEngine","defaultSearchOpeningMethod","searchBangs","pwa","manifestPath","themeColor","msTileColor","iconPaths","manifestCrossorigin","favicon64","favicon32","maskIcon","msTileImage","trimWhitespace","trimRight","throwError","indentLevel","handlers","null","number","boolean","string","array","typeOf","inArray","rootNode","k","function"],"mappings":"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","file":"js/dashy.94aab285.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded CSS chunks\n \tvar installedCssChunks = {\n \t\t\"dashy\": 0\n \t}\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"dashy\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"js/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-051d7c14\":\"30c3b7cc\",\"chunk-36fb5c32\":\"6f3940cb\",\"chunk-724820ea\":\"b6da96e1\"}[chunkId] + \".js\"\n \t}\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// mini-css-extract-plugin CSS loading\n \t\tvar cssChunks = {\"chunk-051d7c14\":1,\"chunk-36fb5c32\":1,\"chunk-724820ea\":1};\n \t\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n \t\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n \t\t\tpromises.push(installedCssChunks[chunkId] = new Promise(function(resolve, reject) {\n \t\t\t\tvar href = \"css/\" + ({}[chunkId]||chunkId) + \".\" + {\"chunk-051d7c14\":\"6fea770a\",\"chunk-36fb5c32\":\"a64c098d\",\"chunk-724820ea\":\"8e5b7c8e\"}[chunkId] + \".css\";\n \t\t\t\tvar fullhref = __webpack_require__.p + href;\n \t\t\t\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n \t\t\t\tfor(var i = 0; i < existingLinkTags.length; i++) {\n \t\t\t\t\tvar tag = existingLinkTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n \t\t\t\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return resolve();\n \t\t\t\t}\n \t\t\t\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n \t\t\t\tfor(var i = 0; i < existingStyleTags.length; i++) {\n \t\t\t\t\tvar tag = existingStyleTags[i];\n \t\t\t\t\tvar dataHref = tag.getAttribute(\"data-href\");\n \t\t\t\t\tif(dataHref === href || dataHref === fullhref) return resolve();\n \t\t\t\t}\n \t\t\t\tvar linkTag = document.createElement(\"link\");\n \t\t\t\tlinkTag.rel = \"stylesheet\";\n \t\t\t\tlinkTag.type = \"text/css\";\n \t\t\t\tlinkTag.onload = resolve;\n \t\t\t\tlinkTag.onerror = function(event) {\n \t\t\t\t\tvar request = event && event.target && event.target.src || fullhref;\n \t\t\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + request + \")\");\n \t\t\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n \t\t\t\t\terr.request = request;\n \t\t\t\t\tdelete installedCssChunks[chunkId]\n \t\t\t\t\tlinkTag.parentNode.removeChild(linkTag)\n \t\t\t\t\treject(err);\n \t\t\t\t};\n \t\t\t\tlinkTag.href = fullhref;\n\n \t\t\t\tvar head = document.getElementsByTagName(\"head\")[0];\n \t\t\t\thead.appendChild(linkTag);\n \t\t\t}).then(function() {\n \t\t\t\tinstalledCssChunks[chunkId] = 0;\n \t\t\t}));\n \t\t}\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([0,\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-sign-out-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"sign-out-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M497 273L329 441c-15 15-41 4.5-41-17v-96H152c-13.3 0-24-10.7-24-24v-96c0-13.3 10.7-24 24-24h136V88c0-21.4 25.9-32 41-17l168 168c9.3 9.4 9.3 24.6 0 34zM192 436v-40c0-6.6-5.4-12-12-12H96c-17.7 0-32-14.3-32-32V160c0-17.7 14.3-32 32-32h84c6.6 0 12-5.4 12-12V76c0-6.6-5.4-12-12-12H96c-53 0-96 43-96 96v192c0 53 43 96 96 96h84c6.6 0 12-5.4 12-12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=style&index=0&id=7b4f1c0a&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-trash-alt fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"trash-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M268 416h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12zM432 80h-82.41l-34-56.7A48 48 0 00274.41 0H173.59a48 48 0 00-41.16 23.3L98.41 80H16A16 16 0 000 96v16a16 16 0 0016 16h16v336a48 48 0 0048 48h288a48 48 0 0048-48V128h16a16 16 0 0016-16V96a16 16 0 00-16-16zM171.84 50.91A6 6 0 01177 48h94a6 6 0 015.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddNewSectionLauncher.vue?vue&type=style&index=0&id=53ced373&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=style&index=0&id=2f975a24&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-language fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"language\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M160.3 203.8h-.5s-4.3 20.9-7.8 33l-11 37.3h37.9l-10.7-37.3c-3.6-12.1-7.9-33-7.9-33zM616 96H24c-13.3 0-24 10.7-24 24v272c0 13.3 10.7 24 24 24h592c13.3 0 24-10.7 24-24V120c0-13.3-10.7-24-24-24zM233.2 352h-22.6a12 12 0 01-11.5-8.6l-9.3-31.7h-59.9l-9.1 31.6c-1.5 5.1-6.2 8.7-11.5 8.7H86.8c-8.2 0-14-8.1-11.4-15.9l57.1-168c1.7-4.9 6.2-8.1 11.4-8.1h32.2c5.1 0 9.7 3.3 11.4 8.1l57.1 168c2.6 7.8-3.2 15.9-11.4 15.9zM600 376H320V136h280zM372 228h110.8c-6.3 12.8-15.1 25.9-25.9 38.5-6.6-7.8-12.8-15.8-18.3-24-3.5-5.3-10.6-6.9-16.1-3.6l-13.7 8.2c-5.9 3.5-7.6 11.3-3.8 17 6.5 9.7 14.4 20.1 23.5 30.6-9 7.7-18.6 14.8-28.7 21.2-5.4 3.4-7.1 10.5-3.9 16l7.9 13.9c3.4 5.9 11 7.9 16.8 4.2 12.5-7.9 24.6-17 36-26.8 10.7 9.6 22.3 18.6 34.6 26.6 5.8 3.7 13.6 1.9 17-4.1l8-13.9c3.1-5.5 1.5-12.5-3.8-16-9.2-6-18.4-13.1-27.2-20.9 1.5-1.7 2.9-3.3 4.3-5 17.1-20.6 29.6-41.7 36.8-62H540c6.6 0 12-5.4 12-12v-16c0-6.6-5.4-12-12-12h-64v-16c0-6.6-5.4-12-12-12h-16c-6.6 0-12 5.4-12 12v16h-64c-6.6 0-12 5.4-12 12v16c0 6.7 5.4 12.1 12 12.1z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-hammer fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"hammer\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M571.31 193.94l-22.63-22.63c-6.25-6.25-16.38-6.25-22.63 0l-11.31 11.31-28.9-28.9c5.63-21.31.36-44.9-16.35-61.61l-45.25-45.25c-62.48-62.48-163.79-62.48-226.28 0l90.51 45.25v18.75c0 16.97 6.74 33.25 18.75 45.25l49.14 49.14c16.71 16.71 40.3 21.98 61.61 16.35l28.9 28.9-11.31 11.31c-6.25 6.25-6.25 16.38 0 22.63l22.63 22.63c6.25 6.25 16.38 6.25 22.63 0l90.51-90.51c6.23-6.24 6.23-16.37-.02-22.62zm-286.72-15.2c-3.7-3.7-6.84-7.79-9.85-11.95L19.64 404.96c-25.57 23.88-26.26 64.19-1.53 88.93s65.05 24.05 88.93-1.53l238.13-255.07c-3.96-2.91-7.9-5.87-11.44-9.41l-49.14-49.14z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=style&index=0&id=499e085c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ExportConfigMenu.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-cogs fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"cogs\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M217.1 478.1c-23.8 0-41.6-3.5-57.5-7.5-10.6-2.7-18.1-12.3-18.1-23.3v-31.7c-9.4-4.4-18.4-9.6-26.9-15.6l-26.7 15.4c-9.6 5.6-21.9 3.8-29.5-4.3-35.4-37.6-44.2-58.6-57.2-98.5-3.6-10.9 1.1-22.7 11-28.4l26.8-15c-.9-10.3-.9-20.7 0-31.1L12.2 223c-10-5.6-14.6-17.5-11-28.4 13.1-40 21.9-60.9 57.2-98.5 7.6-8.1 19.8-9.9 29.5-4.3l26.7 15.4c8.5-6 17.5-11.2 26.9-15.6V61.4c0-11.1 7.6-20.8 18.4-23.3 44.2-10.5 70-10.5 114.3 0 10.8 2.6 18.4 12.2 18.4 23.3v30.4c9.4 4.4 18.4 9.6 26.9 15.6L346.2 92c9.7-5.6 21.9-3.7 29.6 4.4 26.1 27.9 48.4 58.5 56.8 100.3 2 9.8-2.4 19.8-10.9 25.1l-26.6 16.5c.9 10.3.9 20.7 0 31.1l26.6 16.5c8.4 5.2 12.9 15.2 10.9 24.9-8.1 40.5-29.6 71.3-56.9 100.6-7.6 8.1-19.8 9.9-29.5 4.3l-26.7-15.4c-8.5 6-17.5 11.2-26.9 15.6v31.7c0 11-7.4 20.6-18.1 23.3-15.8 3.8-33.6 7.2-57.4 7.2zm-27.6-50.7c18.3 2.9 36.9 2.9 55.1 0v-44.8l16-5.7c15.2-5.4 29.1-13.4 41.3-23.9l12.9-11 38.8 22.4c11.7-14.4 21-30.5 27.6-47.7l-38.8-22.4 3.1-16.7c2.9-15.9 2.9-32 0-47.9l-3.1-16.7 38.8-22.4c-6.6-17.2-15.9-33.3-27.6-47.7l-38.8 22.4-12.9-11c-12.3-10.5-26.2-18.6-41.3-23.9l-16-5.7V80c-18.3-2.9-36.9-2.9-55.1 0v44.8l-16 5.7c-15.2 5.4-29.1 13.4-41.3 23.9l-12.9 11L80.5 143c-11.7 14.4-21 30.5-27.6 47.7l38.8 22.4-3.1 16.7c-2.9 15.9-2.9 32 0 47.9l3.1 16.7-38.8 22.4c6.6 17.2 15.9 33.4 27.6 47.7l38.8-22.4 12.9 11c12.3 10.5 26.2 18.6 41.3 23.9l16 5.7v44.7zm27.1-85.1c-22.6 0-45.2-8.6-62.4-25.8-34.4-34.4-34.4-90.4 0-124.8 34.4-34.4 90.4-34.4 124.8 0 34.4 34.4 34.4 90.4 0 124.8-17.3 17.2-39.9 25.8-62.4 25.8zm0-128.4c-10.3 0-20.6 3.9-28.5 11.8-15.7 15.7-15.7 41.2 0 56.9 15.7 15.7 41.2 15.7 56.9 0 15.7-15.7 15.7-41.2 0-56.9-7.8-7.9-18.1-11.8-28.4-11.8zM638.5 85c-1-5.8-6-10-11.9-10h-16.1c-3.5-9.9-8.8-19-15.5-26.8l8-13.9c2.9-5.1 1.8-11.6-2.7-15.3C591 11.3 580.5 5.1 569 .8c-5.5-2.1-11.8.1-14.7 5.3l-8 13.9c-10.2-1.9-20.7-1.9-30.9 0l-8-13.9c-3-5.1-9.2-7.3-14.7-5.3-11.5 4.3-22.1 10.5-31.4 18.2-4.5 3.7-5.7 10.2-2.7 15.3l8 13.9c-6.7 7.8-12 16.9-15.5 26.8H435c-5.9 0-11 4.3-11.9 10.2-2 12.2-1.9 24.5 0 36.2 1 5.8 6 10 11.9 10h16.1c3.5 9.9 8.8 19 15.5 26.8l-8 13.9c-2.9 5.1-1.8 11.6 2.7 15.3 9.3 7.7 19.9 13.9 31.4 18.2 5.5 2.1 11.8-.1 14.7-5.3l8-13.9c10.2 1.9 20.7 1.9 30.9 0l8 13.9c3 5.1 9.2 7.3 14.7 5.3 11.5-4.3 22.1-10.5 31.4-18.2 4.5-3.7 5.7-10.2 2.7-15.3l-8-13.9c6.7-7.8 12-16.9 15.5-26.8h16.1c5.9 0 11-4.3 11.9-10.2 1.9-12.2 1.9-24.4-.1-36.2zm-107.8 50.2c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm107.8 255.4c-1-5.8-6-10-11.9-10h-16.1c-3.5-9.9-8.8-19-15.5-26.8l8-13.9c2.9-5.1 1.8-11.6-2.7-15.3-9.3-7.7-19.9-13.9-31.4-18.2-5.5-2.1-11.8.1-14.7 5.3l-8 13.9c-10.2-1.9-20.7-1.9-30.9 0l-8-13.9c-3-5.1-9.2-7.3-14.7-5.3-11.5 4.3-22.1 10.5-31.4 18.2-4.5 3.7-5.7 10.2-2.7 15.3l8 13.9c-6.7 7.8-12 16.9-15.5 26.8h-16.1c-5.9 0-11 4.3-11.9 10.2-2 12.2-1.9 24.5 0 36.2 1 5.8 6 10 11.9 10H451c3.5 9.9 8.8 19 15.5 26.8l-8 13.9c-2.9 5.1-1.8 11.6 2.7 15.3 9.3 7.7 19.9 13.9 31.4 18.2 5.5 2.1 11.8-.1 14.7-5.3l8-13.9c10.2 1.9 20.7 1.9 30.9 0l8 13.9c3 5.1 9.2 7.3 14.7 5.3 11.5-4.3 22.1-10.5 31.4-18.2 4.5-3.7 5.7-10.2 2.7-15.3l-8-13.9c6.7-7.8 12-16.9 15.5-26.8h16.1c5.9 0 11-4.3 11.9-10.2 2-12.1 2-24.4 0-36.2zm-107.8 50.2c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeSaveMenu.vue?vue&type=style&index=0&id=1893de4e&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-clone fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"clone\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=style&index=0&id=df79d1ee&lang=scss&scoped=true&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-save fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"save\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M433.941 129.941l-83.882-83.882A48 48 0 00316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 00-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 01-6-6V86a6 6 0 016-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 011.757 4.243V426a6 6 0 01-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-ban fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"ban\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M256 8C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm141.421 106.579c73.176 73.175 77.05 187.301 15.964 264.865L132.556 98.615c77.588-61.105 191.709-57.193 264.865 15.964zM114.579 397.421c-73.176-73.175-77.05-187.301-15.964-264.865l280.829 280.829c-77.588 61.105-191.709 57.193-264.865-15.964z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebContent.vue?vue&type=style&index=0&id=f1f96a0a&lang=scss&scoped=true&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-window-maximize fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"window-maximize\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V192h416v234z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-external-link-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"external-link-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M432 320h-32a16 16 0 00-16 16v112H64V128h144a16 16 0 0016-16V80a16 16 0 00-16-16H48a48 48 0 00-48 48v352a48 48 0 0048 48h352a48 48 0 0048-48V336a16 16 0 00-16-16zM488 0H360c-21.37 0-32.05 25.91-17 41l35.73 35.73L135 320.37a24 24 0 000 34L157.67 377a24 24 0 0034 0l243.61-243.68L471 169c15 15 41 4.5 41-17V24a24 24 0 00-24-24z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-info fa-w-8\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"info\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 256 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M224 352.589V224c0-16.475-6.258-31.517-16.521-42.872C225.905 161.14 236 135.346 236 108 236 48.313 187.697 0 128 0 68.313 0 20 48.303 20 108c0 20.882 5.886 40.859 16.874 58.037C15.107 176.264 0 198.401 0 224v39.314c0 23.641 12.884 44.329 32 55.411v33.864C12.884 363.671 0 384.359 0 408v40c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-40c0-23.641-12.884-44.329-32-55.411zM128 48c33.137 0 60 26.863 60 60s-26.863 60-60 60-60-26.863-60-60 26.863-60 60-60zm80 400c0 8.836-7.164 16-16 16H64c-8.836 0-16-7.164-16-16v-40c0-8.836 7.164-16 16-16h16V279.314H64c-8.836 0-16-7.164-16-16V224c0-8.836 7.164-16 16-16h96c8.836 0 16 7.164 16 16v168h16c8.836 0 16 7.164 16 16v40z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=style&index=0&id=a7bc1de6&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-splotch fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"splotch\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M472.29 195.89l-67.06-22.95c-19.28-6.6-33.54-20.92-38.14-38.3L351.1 74.19c-11.58-43.77-76.57-57.13-109.98-22.62l-46.14 47.67c-13.26 13.71-33.54 20.93-54.2 19.31l-71.88-5.62c-52.05-4.07-86.93 44.88-59.03 82.83l38.54 52.42c11.08 15.07 12.82 33.86 4.64 50.24L24.62 355.4c-20.59 41.25 22.84 84.87 73.49 73.81l69.96-15.28c20.11-4.39 41.45 0 57.07 11.73l54.32 40.83c39.32 29.56 101.04 7.57 104.45-37.22l4.7-61.86c1.35-17.79 12.8-33.86 30.63-42.99l62-31.74c44.88-22.96 39.59-80.17-8.95-96.79z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-wrench fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"wrench\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M507.73 109.1c-2.24-9.03-13.54-12.09-20.12-5.51l-74.36 74.36-67.88-11.31-11.31-67.88 74.36-74.36c6.62-6.62 3.43-17.9-5.66-20.16-47.38-11.74-99.55.91-136.58 37.93-39.64 39.64-50.55 97.1-34.05 147.2L18.74 402.76c-24.99 24.99-24.99 65.51 0 90.5 24.99 24.99 65.51 24.99 90.5 0l213.21-213.21c50.12 16.71 107.47 5.68 147.37-34.22 37.07-37.07 49.7-89.32 37.91-136.73zM64 472c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24s24 10.74 24 24c0 13.25-10.75 24-24 24z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditSection.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomThemeMaker.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-swatchbook fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"swatchbook\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M112 424c13.25 0 24-10.75 24-24 0-13.26-10.75-24-24-24s-24 10.74-24 24c0 13.25 10.75 24 24 24zm368-136h-97.61l69.02-69.02c12.5-12.5 12.5-32.76 0-45.25L338.27 60.59c-6.25-6.25-14.44-9.37-22.63-9.37s-16.38 3.12-22.63 9.37L224 129.61V32c0-17.67-14.33-32-32-32H32C14.33 0 0 14.33 0 32v368c0 61.86 50.14 112 112 112h368c17.67 0 32-14.33 32-32V320c0-17.67-14.33-32-32-32zM176 400c0 17.88-7.41 34.03-19.27 45.65-3.65 3.57-7.7 6.53-11.99 9.05-.86.51-1.76.96-2.64 1.43-4.47 2.34-9.12 4.31-14.02 5.57-5.16 1.35-10.48 2.29-16.06 2.29H112c-35.29 0-64-28.71-64-64v-96h128V400zm0-144H48v-80h128v80zm0-128H48V48h128v80zm48 69.49l91.65-91.65 90.51 90.51L224 378.51V197.49zM464 464H206.39l128-128H464v128z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-upload fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fal\",\"data-icon\":\"upload\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M452 432c0 11-9 20-20 20s-20-9-20-20 9-20 20-20 20 9 20 20zm-84-20c-11 0-20 9-20 20s9 20 20 20 20-9 20-20-9-20-20-20zm144-48v104c0 24.3-19.7 44-44 44H44c-24.3 0-44-19.7-44-44V364c0-24.3 19.7-44 44-44h124v-99.3h-52.7c-35.6 0-53.4-43.1-28.3-68.3L227.7 11.7c15.6-15.6 40.9-15.6 56.6 0L425 152.4c25.2 25.2 7.3 68.3-28.3 68.3H344V320h124c24.3 0 44 19.7 44 44zM200 188.7V376c0 4.4 3.6 8 8 8h96c4.4 0 8-3.6 8-8V188.7h84.7c7.1 0 10.7-8.6 5.7-13.7L261.7 34.3c-3.1-3.1-8.2-3.1-11.3 0L109.7 175c-5 5-1.5 13.7 5.7 13.7H200zM480 364c0-6.6-5.4-12-12-12H344v24c0 22.1-17.9 40-40 40h-96c-22.1 0-40-17.9-40-40v-24H44c-6.6 0-12 5.4-12 12v104c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12V364z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-briefcase fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"briefcase\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 128h-80V80c0-26.51-21.49-48-48-48H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v256c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V176c0-26.51-21.49-48-48-48zM176 80h160v48H176V80zM54 176h404c3.31 0 6 2.69 6 6v74H48v-74c0-3.31 2.69-6 6-6zm404 256H54c-3.31 0-6-2.69-6-6V304h144v24c0 13.25 10.75 24 24 24h80c13.25 0 24-10.75 24-24v-24h144v122c0 3.31-2.69 6-6 6z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-sync fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"sync\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M440.65 12.57l4 82.77A247.16 247.16 0 00255.83 8C134.73 8 33.91 94.92 12.29 209.82A12 12 0 0024.09 224h49.05a12 12 0 0011.67-9.26 175.91 175.91 0 01317-56.94l-101.46-4.86a12 12 0 00-12.57 12v47.41a12 12 0 0012 12H500a12 12 0 0012-12V12a12 12 0 00-12-12h-47.37a12 12 0 00-11.98 12.57zM255.83 432a175.61 175.61 0 01-146-77.8l101.8 4.87a12 12 0 0012.57-12v-47.4a12 12 0 00-12-12H12a12 12 0 00-12 12V500a12 12 0 0012 12h47.35a12 12 0 0012-12.6l-4.15-82.57A247.17 247.17 0 00255.83 504c121.11 0 221.93-86.92 243.55-201.82a12 12 0 00-11.8-14.18h-49.05a12 12 0 00-11.67 9.26A175.86 175.86 0 01255.83 432z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-palette fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"palette\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M128 224c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.4-32-32-32zM418.6 58.1C359.2 9.3 281.3-10 204.6 5 104.9 24.4 24.7 104.2 5.1 203.7c-16.7 84.2 8.1 168.3 67.8 230.6 47.3 49.4 109.7 77.8 167.9 77.8 8.8 0 17.5-.6 26.1-2 24.2-3.7 44.6-18.7 56.1-41.1 12.3-24 12.3-52.7.2-76.6-6.1-12-5.5-26.2 1.8-38 7-11.8 18.7-18.4 32-18.4h72.2c46.4 0 82.8-35.7 82.8-81.3-.2-76.4-34.3-148.1-93.4-196.6zM429.2 288H357c-29.9 0-57.2 15.4-73 41.3-16 26.1-17.3 57.8-3.6 84.9 5.1 10.1 5.1 22.7-.2 32.9-2.6 5-8.7 13.7-20.6 15.6-49.3 7.7-108.9-16.6-152-61.6-48.8-50.9-69-119.4-55.4-188 15.9-80.6 80.8-145.3 161.6-161 62.6-12.3 126.1 3.5 174.3 43.1 48.1 39.5 75.7 97.6 75.9 159.6 0 18.6-15.3 33.2-34.8 33.2zM160 128c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.4-32-32-32zm96-32.1c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32c0-17.6-14.3-32-32-32zm96 32.1c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditItem.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=style&index=0&id=748b80da&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-file-download fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"file-download\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M224 136V0H24C10.7 0 0 10.7 0 24v464c0 13.3 10.7 24 24 24h336c13.3 0 24-10.7 24-24V160H248c-13.2 0-24-10.8-24-24zm76.45 211.36l-96.42 95.7c-6.65 6.61-17.39 6.61-24.04 0l-96.42-95.7C73.42 337.29 80.54 320 94.82 320H160v-80c0-8.84 7.16-16 16-16h32c8.84 0 16 7.16 16 16v80h65.18c14.28 0 21.4 17.29 11.27 27.36zM377 105L279.1 7c-4.5-4.5-10.6-7-17-7H256v128h128v-6.1c0-6.3-2.5-12.4-7-16.9z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=style&index=0&id=3e12dc6e&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=style&index=0&id=35dfeeb8&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=style&index=0&id=3bd0e154&scoped=true&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"dashy\"}},[(_vm.isEditMode)?_c('EditModeTopBanner'):_vm._e(),(_vm.shouldShowSplash)?_c('LoadingScreen',{attrs:{\"isLoading\":_vm.isLoading}}):_vm._e(),_c('Header',{attrs:{\"pageInfo\":_vm.pageInfo}}),_c('router-view'),(_vm.visibleComponents.footer)?_c('Footer',{attrs:{\"text\":_vm.footerText}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.componentVisible)?_c('header',[(_vm.titleVisible)?_c('PageTitle',{attrs:{\"title\":_vm.pageInfo.title,\"description\":_vm.pageInfo.description,\"logo\":_vm.pageInfo.logo}}):_vm._e(),(_vm.navVisible)?_c('Nav',{staticClass:\"nav\",attrs:{\"links\":_vm.pageInfo.navLinks}}):_vm._e()],1):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('router-link',{staticClass:\"page-titles\",attrs:{\"to\":\"/\",\"disabled\":_vm.isEditMode}},[(_vm.logo)?_c('img',{staticClass:\"site-logo\",attrs:{\"src\":_vm.logo}}):_vm._e(),_c('div',{staticClass:\"text\"},[_c('h1',[_vm._v(_vm._s(_vm.title))]),_c('span',{staticClass:\"subtitle\"},[_vm._v(_vm._s(_vm.description))])]),(_vm.isEditMode)?_c('EditModeIcon',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip()),expression:\"tooltip()\"}],staticClass:\"edit-icon\",on:{\"click\":function($event){return _vm.editTitle()}}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","// A list of mutation names\nconst KEY_NAMES = [\n 'INITIALIZE_CONFIG',\n 'SET_CONFIG',\n 'SET_MODAL_OPEN',\n 'SET_LANGUAGE',\n 'SET_EDIT_MODE',\n 'SET_ITEM_LAYOUT',\n 'SET_ITEM_SIZE',\n 'SET_THEME',\n 'SET_CUSTOM_COLORS',\n 'UPDATE_ITEM',\n 'SET_PAGE_INFO',\n 'SET_APP_CONFIG',\n 'SET_SECTIONS',\n 'UPDATE_SECTION',\n 'INSERT_SECTION',\n 'REMOVE_SECTION',\n 'COPY_ITEM',\n 'REMOVE_ITEM',\n 'INSERT_ITEM',\n 'UPDATE_CUSTOM_CSS',\n 'CONF_MENU_INDEX',\n];\n\n// Convert array of key names into an object, and export\nconst MUTATIONS = {};\nKEY_NAMES.forEach((key) => { MUTATIONS[key] = key; });\nexport default MUTATIONS;\n","<template>\n <router-link to=\"/\" class=\"page-titles\" :disabled=\"isEditMode\">\n <!-- Optional page logo image -->\n <img v-if=\"logo\" :src=\"logo\" class=\"site-logo\" />\n <!-- Page heading and sub-heading -->\n <div class=\"text\">\n <h1>{{ title }}</h1>\n <span class=\"subtitle\">{{ description }}</span>\n </div>\n <!-- When in edit mode, show Edit Title button -->\n <EditModeIcon v-if=\"isEditMode\" @click=\"editTitle()\"\n class=\"edit-icon\" v-tooltip=\"tooltip()\" />\n </router-link>\n</template>\n\n<script>\nimport EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'PageTitle',\n props: {\n title: String,\n description: String,\n logo: String,\n },\n components: {\n EditModeIcon,\n },\n computed: {\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* On edit button click, open the edit pageInfo modal */\n editTitle() {\n this.$modal.show(modalNames.EDIT_PAGE_INFO);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n /* Edit button tooltip */\n tooltip() {\n const content = this.$t('interactive-editor.menu.edit-page-info-btn');\n return { content, trigger: 'hover focus', delay: 250 };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\n.page-titles {\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n align-items: center;\n text-decoration: none;\n position: relative;\n h1 {\n color: var(--heading-text-color);\n font-size: 2.5rem;\n margin: 0;\n }\n span.subtitle {\n color: var(--heading-text-color);\n font-style: italic;\n text-shadow: 1px 1px 2px #130f23;\n opacity: var(--dimming-factor);\n }\n img.site-logo {\n margin: 0.2rem 0.5rem 0.2rem 0;\n max-width: 3.5rem;\n height: fit-content;\n }\n @include phone {\n flex-direction: column;\n text-align: center;\n padding: 0.25rem 0;\n }\n &[disabled] {\n cursor: default;\n }\n svg.edit-icon {\n width: 1rem;\n height: 1rem;\n right: 1rem;\n top: 0.5rem;\n padding: 0.25rem;\n margin: 0.25rem;\n cursor: pointer;\n border: 1px solid var(--background-darker);\n border-radius: var(--curve-factor);\n path { fill: var(--primary); }\n &:hover { border: 1px solid var(--primary); }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./PageTitle.vue?vue&type=template&id=3b5dde54&scoped=true&\"\nimport script from \"./PageTitle.vue?vue&type=script&lang=js&\"\nexport * from \"./PageTitle.vue?vue&type=script&lang=js&\"\nimport style0 from \"./PageTitle.vue?vue&type=style&index=0&id=3b5dde54&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3b5dde54\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"nav-outer\"},[_c('IconBurger',{class:(\"burger \" + (!_vm.navVisible ? 'visible' : '')),on:{\"click\":function($event){_vm.navVisible = !_vm.navVisible}}}),(_vm.navVisible)?_c('nav',{attrs:{\"id\":\"nav\"}},_vm._l((_vm.links),function(link,index){return _c('router-link',{key:index,staticClass:\"nav-item\",attrs:{\"to\":link.path,\"href\":link.path,\"target\":_vm.isUrl(link.path) ? '_blank' : '',\"rel\":\"noopener noreferrer\"}},[_vm._v(_vm._s(link.title))])}),1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"nav-outer\">\n <IconBurger\n :class=\"`burger ${!navVisible ? 'visible' : ''}`\"\n @click=\"navVisible = !navVisible\"\n />\n <nav id=\"nav\" v-if=\"navVisible\">\n <router-link\n v-for=\"(link, index) in links\"\n :key=\"index\"\n :to=\"link.path\"\n :href=\"link.path\"\n :target=\"isUrl(link.path) ? '_blank' : ''\"\n rel=\"noopener noreferrer\"\n class=\"nav-item\"\n >{{link.title}}</router-link>\n </nav>\n </div>\n</template>\n\n<script>\nimport IconBurger from '@/assets/interface-icons/burger-menu.svg';\n\nexport default {\n name: 'Nav',\n components: {\n IconBurger,\n },\n props: {\n links: Array,\n },\n data: () => ({\n navVisible: true,\n isMobile: false,\n }),\n created() {\n this.navVisible = !this.detectMobile();\n this.isMobile = this.detectMobile();\n },\n methods: {\n detectMobile() {\n const screenWidth = document.body.clientWidth;\n return screenWidth && screenWidth < 600;\n },\n isUrl: (str) => new RegExp(/(http|https):\\/\\/(\\S+)(:[0-9]+)?/).test(str),\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n\n.nav-outer {\n nav {\n display: flex;\n align-items: center;\n .nav-item {\n display: inline-block;\n padding: 0.75rem 0.5rem;\n margin: 0.5rem;\n min-width: 5rem;\n text-align: center;\n outline: none;\n border: none;\n border-radius: var(--curve-factor);\n box-shadow: var(--nav-link-shadow);\n color: var(--nav-link-text-color);\n background: var(--nav-link-background-color);\n border: 1px solid var(--nav-link-border-color);\n text-decoration: none;\n &.router-link-active, &:hover {\n color: var(--nav-link-text-color-hover);\n background: var(--nav-link-background-color-hover);\n border: 1px solid var(--nav-link-border-color-hover);\n box-shadow: var(--nav-link-shadow-hover);\n }\n }\n }\n /* Mobile and Burger-Menu Styles */\n @extend .svg-button;\n @include phone {\n width: 100%;\n nav { flex-wrap: wrap; }\n }\n .burger {\n display: none;\n &.visible { display: block; }\n @include phone { display: block; }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Nav.vue?vue&type=template&id=0cb96044&scoped=true&\"\nimport script from \"./Nav.vue?vue&type=script&lang=js&\"\nexport * from \"./Nav.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Nav.vue?vue&type=style&index=0&id=0cb96044&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0cb96044\",\n null\n \n)\n\nexport default component.exports","import { hideFurnitureOn } from '@/utils/defaults';\n\n/* Returns false if page furniture should be hidden on said route */\nexport const shouldBeVisible = (routeName) => !hideFurnitureOn.includes(routeName);\n\n/* Very rudimentary hash function for generative icons */\nexport const asciiHash = (input) => {\n const str = (!input || input.length === 0) ? Math.random().toString() : input;\n const reducer = (previousHash, char) => (previousHash || 0) + char.charCodeAt(0);\n const asciiSum = str.split('').reduce(reducer).toString();\n const shortened = asciiSum.slice(0, 30) + asciiSum.slice(asciiSum.length - 30);\n return window.btoa(shortened);\n};\n\n/* Encode potentially malicious characters from string */\nexport const sanitize = (string) => {\n const map = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#x27;',\n '/': '&#x2F;',\n };\n const reg = /[&<>\"'/]/ig;\n return string.replace(reg, (match) => (map[match]));\n};\n\n/* Based on section title, item name and index, return a string value for ID */\nconst makeItemId = (sectionStr, itemStr, index) => {\n const charSum = sectionStr.split('').map((a) => a.charCodeAt(0)).reduce((x, y) => x + y);\n const itemTitleStr = itemStr.replace(/\\s+/g, '-').replace(/[^a-zA-Z ]/g, '').toLowerCase();\n return `${index}_${charSum}_${itemTitleStr}`;\n};\n\n/* Given an array of sections, apply a unique ID to each item, and return modified array */\nexport const applyItemId = (inputSections) => {\n const sections = inputSections || [];\n sections.forEach((sec, secIdx) => {\n if (sec.items) {\n sec.items.forEach((item, itemIdx) => {\n sections[secIdx].items[itemIdx].id = makeItemId(sec.name, item.title, itemIdx);\n // TODO: Check if ID already exists, and if so, modify it\n });\n }\n });\n return sections;\n};\n","<template>\n <header v-if=\"componentVisible\">\n <PageTitle\n v-if=\"titleVisible\"\n :title=\"pageInfo.title\"\n :description=\"pageInfo.description\"\n :logo=\"pageInfo.logo\"\n />\n <Nav v-if=\"navVisible\" :links=\"pageInfo.navLinks\" class=\"nav\" />\n </header>\n</template>\n\n<script>\nimport PageTitle from '@/components/PageStrcture/PageTitle.vue';\nimport Nav from '@/components/PageStrcture/Nav.vue';\nimport { shouldBeVisible } from '@/utils/MiscHelpers';\n\nexport default {\n name: 'Header',\n components: {\n PageTitle,\n Nav,\n },\n props: {\n pageInfo: Object,\n },\n computed: {\n componentVisible() {\n return shouldBeVisible(this.$route.name);\n },\n visibleComponents() {\n return this.$store.getters.visibleComponents;\n },\n titleVisible() {\n return this.visibleComponents.pageTitle;\n },\n navVisible() {\n return this.visibleComponents.navigation;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n header {\n margin: 0;\n padding: 0.5rem;\n display: flex;\n justify-content: space-between;\n background: var(--background-darker);\n align-items: center;\n align-content: flex-start;\n @include phone {\n flex-direction: column-reverse;\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Header.vue?vue&type=template&id=68e7510c&scoped=true&\"\nimport script from \"./Header.vue?vue&type=script&lang=js&\"\nexport * from \"./Header.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Header.vue?vue&type=style&index=0&id=68e7510c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"68e7510c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.text && _vm.text !== '' && _vm.visible)?_c('footer',{domProps:{\"innerHTML\":_vm._s(_vm.text)}}):(_vm.visible)?_c('footer',[_vm._v(\" Developed by \"),_c('a',{attrs:{\"href\":_vm.authorUrl}},[_vm._v(_vm._s(_vm.authorName))]),_vm._v(\". Licensed under \"),_c('a',{attrs:{\"href\":_vm.licenseUrl}},[_vm._v(_vm._s(_vm.license))]),_vm._v(\" \"+_vm._s(_vm.showCopyright? '©': '')+\" \"+_vm._s(_vm.date)+\". Get the \"),_c('a',{attrs:{\"href\":_vm.repoUrl}},[_vm._v(\"Source Code\")]),_vm._v(\". \")]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <!-- User Footer -->\n <footer v-if=\"text && text !== '' && visible\" v-html=\"text\"></footer>\n <!-- Default Footer -->\n <footer v-else-if=\"visible\">\n Developed by <a :href=\"authorUrl\">{{authorName}}</a>.\n Licensed under <a :href=\"licenseUrl\">{{license}}</a>\n {{ showCopyright? '©': '' }} {{date}}.\n Get the <a :href=\"repoUrl\">Source Code</a>.\n </footer>\n</template>\n\n<script>\n\nimport { shouldBeVisible } from '@/utils/MiscHelpers';\n\nexport default {\n name: 'Footer',\n props: {\n text: String,\n authorName: { type: String, default: 'Alicia Sykes' },\n authorUrl: { type: String, default: 'https://aliciasykes.com' },\n license: { type: String, default: 'MIT' },\n licenseUrl: { type: String, default: 'https://gist.github.com/Lissy93/143d2ee01ccc5c052a17' },\n date: { type: String, default: `${new Date().getFullYear()}` },\n showCopyright: { type: Boolean, default: true },\n repoUrl: { type: String, default: 'https://github.com/lissy93/dashy' },\n },\n computed: {\n visible() {\n return shouldBeVisible(this.$route.name);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\nfooter {\n width: calc(100% - 0.5rem);\n bottom: 0;\n padding: 0.25rem;\n text-align: center;\n color: var(--medium-grey);\n opacity: var(--dimming-factor);\n background: var(--footer-background);\n margin-top: 1.5rem;\n border-top: 1px solid var(--outline-color);\n @include tablet-down {\n display: none;\n }\n}\n\nfooter a{\n color: var(--footer-text-color);\n &:hover {\n color: var(--footer-text-color-link);\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Footer.vue?vue&type=template&id=d162889c&scoped=true&\"\nimport script from \"./Footer.vue?vue&type=script&lang=js&\"\nexport * from \"./Footer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Footer.vue?vue&type=style&index=0&id=d162889c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d162889c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _vm._m(0)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"edit-mode-top-banner\"},[_c('span',[_vm._v(\"Edit Mode Enabled\")])])}]\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./EditModeTopBanner.vue?vue&type=template&id=3cb5bf99&scoped=true&\"\nvar script = {}\nimport style0 from \"./EditModeTopBanner.vue?vue&type=style&index=0&id=3cb5bf99&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3cb5bf99\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide-fade\"}},[(_vm.isLoading)?_c('div',{class:_vm.c,attrs:{\"id\":\"loading\"},on:{\"click\":function($event){_vm.c = 'hide'}}},[_c('h2',[_vm._v(\"Dashy\")]),_c('div',{staticClass:\"inner-container\"},[_c('p',[_vm._v(\"Loading\")]),_c('span',{staticClass:\"dots-cont\"},[_c('span',{staticClass:\"dot dot-1\"}),_c('span',{staticClass:\"dot dot-2\"}),_c('span',{staticClass:\"dot dot-3\"}),_c('span',{staticClass:\"dot dot-4\"})])])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide-fade\">\n <div id=\"loading\" v-if=\"isLoading\" :class=\"c\" @click=\"c = 'hide'\">\n <h2>Dashy</h2>\n <div class=\"inner-container\">\n <p>Loading</p>\n <span class=\"dots-cont\">\n <span class=\"dot dot-1\"></span>\n <span class=\"dot dot-2\"></span>\n <span class=\"dot dot-3\"></span>\n <span class=\"dot dot-4\"></span>\n </span>\n </div>\n </div>\n </transition>\n</template>\n\n<script>\nexport default {\n name: 'LoadingScreen',\n props: {\n isLoading: { type: Boolean, default: false },\n },\n data: () => ({\n c: '',\n }),\n};\n</script>\n\n<style scoped lang=\"scss\">\ndiv#loading {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n position: absolute;\n height: 100%;\n width: 100%;\n z-index: 7;\n background: var(--loading-screen-background);\n color: var(--loading-screen-color);\n\n &.hide { display: none; }\n\n .inner-container {\n text-align: center;\n }\n\n p {\n font-size: 6vw;\n display: inline;\n margin: 0 auto;\n }\n h2 {\n opacity: 0.35;\n font-size: 16vw;\n margin: 0;\n }\n\n .dots-cont {\n display: inline;\n .dot {\n width: 4px;\n height: 4px;\n background: var(--loading-screen-color);\n display: inline-block;\n border-radius: 35%;\n right: 0px;\n bottom: 0px;\n margin: 0px 2.5px;\n position: relative;\n animation: jump 1s infinite;\n &.dot-1 {\n -webkit-animation-delay: 100ms;\n animation-delay: 100ms;\n }\n &.dot-2 {\n -webkit-animation-delay: 200ms;\n animation-delay: 200ms;\n }\n &.dot-3 {\n -webkit-animation-delay: 300ms;\n animation-delay: 300ms;\n }\n &.dot-4 {\n -webkit-animation-delay: 400ms;\n animation-delay: 400ms;\n }\n }\n }\n\n @keyframes jump {\n 0% {\n bottom: 0px;\n }\n\n 20% {\n bottom: 5px;\n }\n\n 40% {\n bottom: 0px;\n }\n }\n}\n\n.slide-fade-leave-active {\n transition: all .2s cubic-bezier(1, 0.9, 0.7, 0.4);\n}\n.slide-fade-enter, .slide-fade-leave-to {\n transform: translateY(-200px);\n opacity: 0;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LoadingScreen.vue?vue&type=template&id=a7bc1de6&scoped=true&\"\nimport script from \"./LoadingScreen.vue?vue&type=script&lang=js&\"\nexport * from \"./LoadingScreen.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LoadingScreen.vue?vue&type=style&index=0&id=a7bc1de6&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"a7bc1de6\",\n null\n \n)\n\nexport default component.exports","/* eslint no-console: [\"error\", { allow: [\"log\", \"info\"] }] */\n\n/* Prints the app name and version, helpful for debugging */\nexport const welcomeMsg = () => {\n const v = process.env.VUE_APP_VERSION ? `V${process.env.VUE_APP_VERSION}` : '';\n console.log(`\\n%cDashy ${v} 🚀`, 'color:#0dd8d8; background:#0b1021; font-size:1.5rem; padding:0.15rem 0.25rem; margin: 1rem auto; font-family: Rockwell; border: 2px solid #0dd8d8; border-radius: 4px;font-weight: bold; text-shadow: 1px 1px 1px #00af87bf;');\n};\n\n/* Prints warning message, usually when there is a configuration error */\nexport const warningMsg = (message) => {\n console.info(\n `\\n%c⚠ Warning ⚠️%c \\n${message} \\n\\n%cThis is likely not an issue with Dashy, but rather your configuration. If you think it is a bug, please open a ticket on GitHub: https://git.io/JukXk`,\n \"color:#ceb73f; background: #ceb73f33; font-size:1.5rem; padding:0.15rem; margin: 1rem auto; font-family: Rockwell, Tahoma, 'Trebuchet MS', Helvetica; border: 2px solid #ceb73f; border-radius: 4px; font-weight: bold; text-shadow: 1px 1px 1px #000000bf;\",\n 'font-weight: bold; font-size: 1rem;color: #ceb73f;',\n \"color: #ceb73f; font-size: 0.75rem; font-family: Tahoma, 'Trebuchet MS', Helvetica;\",\n );\n};\n\n/* Prints status message */\nexport const statusMsg = (title, msg) => {\n console.log(\n `%c${title || ''}\\n%c${msg}`,\n 'font-weight: bold; color: #0dd8d8; text-decoration: underline;',\n 'color: #ceb73f;',\n );\n};\n\n/* Prints status message, with a stack trace */\nexport const statusErrorMsg = (title, msg, errorLog) => {\n console.log(\n `%c${title || ''}\\n%c${msg} \\n%c${errorLog || ''}`,\n 'font-weight: bold; color: #0dd8d8; text-decoration: underline;',\n 'color: #ff025a',\n 'color: #ff025a80;',\n );\n};\n","import * as Sentry from '@sentry/vue';\nimport { warningMsg, statusMsg, statusErrorMsg } from '@/utils/CoolConsole';\nimport { sessionStorageKeys } from '@/utils/defaults';\n\n/* Makes the current time, like hh:mm:ss */\nconst makeTime = () => {\n const now = new Date();\n const pad = (digit) => String(digit).padStart(2, '0');\n return `${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;\n};\n\n/* Appends recent errors to local storage, for viewing in the UI */\nconst appendToErrorLog = (msg) => {\n let errorLog = sessionStorage.getItem(sessionStorageKeys.ERROR_LOG) || '';\n errorLog += `[${makeTime()}] ${msg}\\n`;\n sessionStorage.setItem(sessionStorageKeys.ERROR_LOG, errorLog);\n};\n\n/**\n * Function called when an error happens\n * Will call to function which prints helpful message to console\n * If error reporting is enabled, will also log the message to Sentry\n * If you wish to use your own error logging service, put code for it here\n */\nconst ErrorHandler = function handler(msg) {\n warningMsg(msg); // Print to console\n appendToErrorLog(msg); // Save to local storage\n Sentry.captureMessage(`[USER-WARN] ${msg}`); // Report to bug tracker (if enabled)\n};\n\n/* Similar to error handler, but for recording general info */\nexport const InfoHandler = (msg, title) => {\n statusMsg(title || 'Info', msg);\n};\n\n/* Outputs warnings caused by the user, such as missing field */\nexport const WarningInfoHandler = (msg, title, log) => {\n statusErrorMsg(title || 'Warning', msg, log);\n};\n\n/* Titles for info logging */\nexport const InfoKeys = {\n AUTH: 'Authentication',\n CLOUD_BACKUP: 'Cloud Backup & Restore',\n EDITOR: 'Interactive Editor',\n RAW_EDITOR: 'Raw Config Editor',\n VISUAL: 'Layout & Styles',\n};\n\nexport default ErrorHandler;\n","<template>\n <div id=\"dashy\">\n <EditModeTopBanner v-if=\"isEditMode\" />\n <LoadingScreen :isLoading=\"isLoading\" v-if=\"shouldShowSplash\" />\n <Header :pageInfo=\"pageInfo\" />\n <router-view />\n <Footer :text=\"footerText\" v-if=\"visibleComponents.footer\" />\n </div>\n</template>\n<script>\n\nimport Header from '@/components/PageStrcture/Header.vue';\nimport Footer from '@/components/PageStrcture/Footer.vue';\nimport EditModeTopBanner from '@/components/InteractiveEditor/EditModeTopBanner.vue';\nimport LoadingScreen from '@/components/PageStrcture/LoadingScreen.vue';\nimport { welcomeMsg } from '@/utils/CoolConsole';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport Keys from '@/utils/StoreMutations';\nimport {\n localStorageKeys,\n splashScreenTime,\n visibleComponents as defaultVisibleComponents,\n language as defaultLanguage,\n} from '@/utils/defaults';\n\nexport default {\n name: 'app',\n components: {\n Header,\n Footer,\n LoadingScreen,\n EditModeTopBanner,\n },\n data() {\n return {\n isLoading: true, // Set to false after mount complete\n };\n },\n computed: {\n /* If the user has specified custom text for footer - get it */\n footerText() {\n return this.pageInfo && this.pageInfo.footerText ? this.pageInfo.footerText : '';\n },\n /* Determine if splash screen should be shown */\n shouldShowSplash() {\n return (this.visibleComponents || defaultVisibleComponents).splashScreen;\n },\n config() {\n return this.$store.state.config;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n sections() {\n return this.$store.getters.pageInfo;\n },\n visibleComponents() {\n return this.$store.getters.visibleComponents;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n created() {\n this.$store.dispatch(Keys.INITIALIZE_CONFIG);\n },\n methods: {\n /* Injects the users custom CSS as a style tag */\n injectCustomStyles(usersCss) {\n const style = document.createElement('style');\n style.textContent = usersCss;\n document.head.append(style);\n },\n /* Hide splash screen, either after 2 seconds, or immediately based on user preference */\n hideSplash() {\n if (this.shouldShowSplash) {\n setTimeout(() => { this.isLoading = false; }, splashScreenTime || 1500);\n } else {\n this.isLoading = false;\n }\n },\n\n /* Auto-detects users language from browser/ os, when not specified */\n autoDetectLanguage(availibleLocales) {\n const isLangSupported = (languageList, userLang) => languageList\n .map(lang => lang.toLowerCase()).find((lang) => lang === userLang.toLowerCase());\n\n const usersBorwserLang1 = window.navigator.language || ''; // e.g. en-GB or or ''\n const usersBorwserLang2 = usersBorwserLang1.split('-')[0]; // e.g. en or undefined\n const usersSpairLangs = window.navigator.languages; // e.g [en, en-GB, en-US]\n return isLangSupported(availibleLocales, usersBorwserLang1)\n || isLangSupported(availibleLocales, usersBorwserLang2)\n || usersSpairLangs.find((spair) => isLangSupported(availibleLocales, spair))\n || defaultLanguage;\n },\n\n /* Get users language, if not available then call auto-detect */\n getLanguage() {\n const availibleLocales = this.$i18n.availableLocales; // All available locales\n const usersLang = localStorage[localStorageKeys.LANGUAGE] || this.appConfig.language;\n if (usersLang) {\n if (availibleLocales.includes(usersLang)) {\n return usersLang;\n } else {\n ErrorHandler(`Unsupported Language: '${usersLang}'`);\n }\n }\n return this.autoDetectLanguage(availibleLocales);\n },\n\n /* Fetch or detect users language, then apply it */\n applyLanguage() {\n const language = this.getLanguage();\n this.$store.commit(Keys.SET_LANGUAGE, language);\n this.$i18n.locale = language;\n document.getElementsByTagName('html')[0].setAttribute('lang', language);\n },\n hideLoader() {\n const loader = document.getElementById('loader');\n if (loader) loader.style.display = 'none';\n },\n },\n /* When component mounted, hide splash and initiate the injection of custom styles */\n mounted() {\n this.applyLanguage();\n this.hideSplash();\n if (this.appConfig.customCss) {\n const cleanedCss = this.appConfig.customCss.replace(/<\\/?[^>]+(>|$)/g, '');\n this.injectCustomStyles(cleanedCss);\n this.hideLoader();\n }\n welcomeMsg();\n },\n};\n</script>\n\n<style lang=\"scss\">\n/* Import styles used globally throughout the app */\n@import '@/styles/global-styles.scss';\n@import '@/styles/color-palette.scss';\n@import '@/styles/dimensions.scss';\n@import '@/styles/color-themes.scss';\n@import '@/styles/typography.scss';\n@import '@/styles/user-defined-themes.scss';\n\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--12-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=9f8f59ca&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home\",style:(_vm.getBackgroundImage())},[_c('SettingsContainer',{ref:\"filterComp\",staticClass:\"settings-outer\",attrs:{\"displayLayout\":_vm.layout,\"iconSize\":_vm.itemSizeBound,\"externalThemes\":_vm.getExternalCSSLinks(),\"modalOpen\":_vm.modalOpen},on:{\"user-is-searchin\":_vm.searching,\"change-modal-visibility\":_vm.updateModalVisibility}}),(_vm.singleSectionView)?_c('div',[_c('router-link',{staticClass:\"back-to-all-link\",attrs:{\"to\":\"/home\"}},[_c('BackIcon'),_c('span',[_vm._v(\"Back to All\")])],1)],1):_vm._e(),(_vm.checkTheresData(_vm.sections))?_c('div',{class:\"item-group-container \"\n + \"orientation-\" + _vm.layout + \" \"\n + \"item-size-\" + _vm.itemSizeBound + \" \"\n + (_vm.isEditMode ? 'edit-mode ' : '')\n + (_vm.singleSectionView ? 'single-section-view ' : '')\n + (this.colCount ? (\"col-count-\" + (this.colCount) + \" \") : '')},[_vm._l((_vm.filteredTiles),function(section,index){return _c('Section',{key:index,class:(_vm.searchValue && _vm.filterTiles(section.items, _vm.searchValue).length === 0) ? 'no-results' : '',attrs:{\"index\":index,\"title\":section.name,\"icon\":section.icon || undefined,\"displayData\":_vm.getDisplayData(section),\"groupId\":(\"section-\" + index),\"items\":_vm.filterTiles(section.items, _vm.searchValue),\"searchTerm\":_vm.searchValue,\"itemSize\":_vm.itemSizeBound},on:{\"itemClicked\":function($event){return _vm.finishedSearching()},\"change-modal-visibility\":_vm.updateModalVisibility}})}),(_vm.isEditMode)?_c('AddNewSection'):_vm._e()],2):_vm._e(),(_vm.checkIfResults())?_c('div',{staticClass:\"no-data\"},[_vm._v(\" \"+_vm._s(_vm.searchValue ? _vm.$t('home.no-results') : _vm.$t('home.no-data'))+\" \")]):_vm._e(),(_vm.isEditMode)?_c('EditModeSaveMenu'):_vm._e(),_c('ExportConfigMenu')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('section',[(_vm.searchVisible)?_c('SearchBar',{ref:\"SearchBar\",on:{\"user-is-searchin\":_vm.userIsTypingSomething}}):_vm._e(),_c('div',{staticClass:\"options-outer\"},[_c('div',{class:(\"options-container \" + (!_vm.settingsVisible ? 'hide' : ''))},[_c('ThemeSelector'),_c('LayoutSelector',{attrs:{\"displayLayout\":_vm.displayLayout}}),_c('ItemSizeSelector',{attrs:{\"iconSize\":_vm.iconSize}}),_c('ConfigLauncher'),(_vm.userState != 'noone')?_c('AuthButtons',{attrs:{\"userType\":_vm.userState}}):_vm._e()],1),_c('div',{class:(\"show-hide-container \" + (_vm.settingsVisible? 'hide-btn' : 'show-btn'))},[_c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(((_vm.settingsVisible? 'Hide' : 'Open') + \" Settings Menu\")),expression:\"`${settingsVisible? 'Hide' : 'Open'} Settings Menu`\"}],attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.toggleSettingsVisibility()}}},[(_vm.settingsVisible)?_c('IconClose'):_c('IconOpen')],1)])]),_c('KeyboardShortcutInfo'),_c('AppInfoModal')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('form',{class:_vm.minimalSearch ? 'minimal' : 'normal',on:{\"submit\":function($event){$event.preventDefault();return _vm.searchSubmitted.apply(null, arguments)}}},[_c('label',{attrs:{\"for\":\"filter-tiles\"}},[_vm._v(_vm._s(_vm.$t('search.search-label')))]),_c('div',{staticClass:\"search-wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.input),expression:\"input\"}],ref:\"filter\",attrs:{\"id\":\"filter-tiles\",\"placeholder\":_vm.$t('search.search-placeholder')},domProps:{\"value\":(_vm.input)},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.input=$event.target.value},_vm.userIsTypingSomething],\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.clearFilterInput.apply(null, arguments)}}}),((!_vm.searchPrefs.disableWebSearch) && _vm.input.length > 0)?_c('p',{staticClass:\"web-search-note\"},[_vm._v(\" \"+_vm._s(_vm.$t('search.enter-to-search-web'))+\" \")]):_vm._e()]),(_vm.input.length > 0)?_c('i',{staticClass:\"clear-search\",attrs:{\"title\":_vm.$t('search.clear-search-tooltip')},on:{\"click\":_vm.clearFilterInput}},[_vm._v(\"x\")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/**\n * Class encapsulating the functionality that enables the user to\n * navigate through tiles/ search result grid using the arrow keys\n * This code is very hacky, it's best not to look at it for too long\n */\nexport default class ArrowKeyNavigation {\n constructor(index) {\n this.index = index;\n }\n\n resetIndex() {\n this.index = 0;\n }\n\n /* Figures out which element is next, based on the key pressed *\n * current index and total number of items. Then calls focus function */\n arrowNavigation(key) {\n if (this.index === undefined) this.index = 0; // Start at beginning\n else if (key === 37) { // Left --> Previous\n this.index -= 1;\n } else if (key === 38) { // Up --> Previous\n this.index = ArrowKeyNavigation.goToPrevious(this.index);\n } else if (key === 39) { // Right --> Next\n this.index += 1;\n } else if (key === 40) { // Down --> Next\n this.index = ArrowKeyNavigation.goToNext(this.index);\n }\n /* Ensure the index is within bounds, then focus element */\n this.index = ArrowKeyNavigation.getSafeElementIndex(this.index);\n ArrowKeyNavigation.selectItemByIndex(this.index).focus();\n }\n\n /* Returns the number of visible items / results */\n static getNumResults() {\n return document.getElementsByClassName('item').length;\n }\n\n /* Returns the index for an element, ensuring that it's within bounds */\n static getSafeElementIndex(index) {\n const numResults = ArrowKeyNavigation.getNumResults();\n if (index < 0) return numResults - 1;\n else if (index >= numResults) return 0;\n return index;\n }\n\n /* Selects a given element, by it's ID. If out of bounds, returns element 0 */\n static selectItemByIndex(index) {\n return (index >= 0 && index <= ArrowKeyNavigation.getNumResults())\n ? document.getElementsByClassName('item')[index] : [document.getElementsByClassName('item')];\n }\n\n /* Returns the index of the first cell in the previous/ above row */\n static findPreviousRow(startingIndex) {\n const isSameRow = (indx, pos) => ArrowKeyNavigation.selectItemByIndex(indx).offsetTop === pos;\n const checkPreviousIndex = (currentIndex, yPos) => {\n if (currentIndex >= ArrowKeyNavigation.getNumResults()) return checkPreviousIndex(0, yPos);\n else if (isSameRow(currentIndex, yPos)) return checkPreviousIndex(currentIndex - 1, yPos);\n return currentIndex;\n };\n const position = ArrowKeyNavigation.selectItemByIndex(startingIndex).offsetTop;\n return checkPreviousIndex(startingIndex, position);\n }\n\n /* Moves to the cell directly above the current */\n static goToPrevious(startingIndex) {\n const isBelow = (start, end) => (ArrowKeyNavigation.selectItemByIndex(start).offsetTop\n < ArrowKeyNavigation.selectItemByIndex(end).offsetTop);\n const nextIndex = ArrowKeyNavigation.findPreviousRow(startingIndex);\n const count = nextIndex - startingIndex;\n const rowLen = nextIndex - ArrowKeyNavigation.findNextRow(startingIndex) + 1;\n const adjustment = isBelow(startingIndex, nextIndex) ? 0 : rowLen - count;\n return nextIndex + adjustment;\n }\n\n /* Returns the index of the first cell in the next/ below row */\n static findNextRow(startingIndex) {\n const isSameRow = (indx, pos) => ArrowKeyNavigation.selectItemByIndex(indx).offsetTop === pos;\n const checkNextIndex = (currentIndex, yPos) => {\n if (currentIndex >= ArrowKeyNavigation.getNumResults()) return checkNextIndex(0, yPos);\n else if (isSameRow(currentIndex, yPos)) return checkNextIndex(currentIndex + 1, yPos);\n return currentIndex;\n };\n const position = ArrowKeyNavigation.selectItemByIndex(startingIndex).offsetTop;\n return checkNextIndex(startingIndex, position);\n }\n\n /* Moves to the cell directly below the current */\n static goToNext(startingIndex) {\n const isAbove = (start, end) => (ArrowKeyNavigation.selectItemByIndex(start).offsetTop\n > ArrowKeyNavigation.selectItemByIndex(end).offsetTop);\n const nextIndex = ArrowKeyNavigation.findNextRow(startingIndex);\n const count = nextIndex - startingIndex;\n const rowLen = nextIndex - ArrowKeyNavigation.findPreviousRow(startingIndex) - 1;\n const adjustment = isAbove(startingIndex, nextIndex) ? 0 : rowLen - count;\n return nextIndex + adjustment;\n }\n}\n","/**\n * Reads the users config from `conf.yml`, and combines it with any local preferences\n * Also ensures that any missing attributes are populated with defaults, and the\n * object is structurally sound, to avoid any error if the user is missing something\n * The main config object is made up of three parts: appConfig, pageInfo and sections\n * For anything other than these three sections, please see @utils/ConfigHelpers.js\n */\nimport {\n localStorageKeys,\n appConfig as defaultAppConfig,\n pageInfo as defaultPageInfo,\n iconSize as defaultIconSize,\n layout as defaultLayout,\n} from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { applyItemId } from '@/utils/MiscHelpers';\nimport conf from '../../public/conf.yml';\n\nexport default class ConfigAccumulator {\n constructor() {\n this.conf = conf;\n }\n\n /* App Config */\n appConfig() {\n let appConfigFile = {};\n // Set app config from file\n if (this.conf) appConfigFile = this.conf.appConfig || {};\n // Fill in defaults if anything missing\n let usersAppConfig = defaultAppConfig;\n if (localStorage[localStorageKeys.APP_CONFIG]) {\n usersAppConfig = JSON.parse(localStorage[localStorageKeys.APP_CONFIG]);\n } else if (appConfigFile !== {}) {\n usersAppConfig = appConfigFile;\n }\n // Some settings have their own local storage keys, apply them here\n usersAppConfig.layout = localStorage[localStorageKeys.LAYOUT_ORIENTATION]\n || appConfigFile.layout || defaultLayout;\n usersAppConfig.iconSize = localStorage[localStorageKeys.ICON_SIZE]\n || appConfigFile.iconSize || defaultIconSize;\n // Don't let users modify users locally\n if (appConfigFile.auth) usersAppConfig.auth = appConfigFile.auth;\n // All done, return final appConfig object\n return usersAppConfig;\n }\n\n /* Page Info */\n pageInfo() {\n let localPageInfo = {};\n if (localStorage[localStorageKeys.PAGE_INFO]) {\n // eslint-disable-next-line brace-style\n try { localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]); }\n catch (e) { ErrorHandler('Malformed pageInfo data in local storage'); }\n }\n const filePageInfo = this.conf ? this.conf.pageInfo || {} : {};\n return { ...defaultPageInfo, ...filePageInfo, ...localPageInfo };\n }\n\n /* Sections */\n sections() {\n let sections = [];\n // If the user has stored sections in local storage, return those\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n if (localSections) {\n try {\n const json = JSON.parse(localSections);\n if (json.length >= 1) sections = json;\n } catch (e) {\n ErrorHandler('Malformed section data in local storage');\n }\n }\n // If sections were not set from local data, then use config file instead\n if (sections.length === 0) {\n sections = this.conf ? this.conf.sections || [] : [];\n }\n // Apply a unique ID to each item\n sections = applyItemId(sections);\n return sections;\n }\n\n /* Complete config */\n config() {\n return {\n appConfig: this.appConfig(),\n pageInfo: this.pageInfo(),\n sections: this.sections(),\n };\n }\n}\n","import sha256 from 'crypto-js/sha256';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { cookieKeys, localStorageKeys, userStateEnum } from '@/utils/defaults';\n\n/* Uses config accumulator to get and return app config */\nconst getAppConfig = () => {\n const Accumulator = new ConfigAccumulator();\n const config = Accumulator.config();\n return config.appConfig || {};\n};\n\n/**\n * Called when the user is still using array for users, prints warning\n * This was a breaking change, implemented in V 1.6.5\n * Support for old user structure will be removed in V 1.7.0\n */\nconst printWarning = () => {\n ErrorHandler('From V 1.6.5 onwards, the structure of the users object has changed.');\n};\n\n/* Returns true if keycloak is enabled */\nexport const isKeycloakEnabled = () => {\n const appConfig = getAppConfig();\n if (!appConfig.auth) return false;\n return appConfig.auth.enableKeycloak || false;\n};\n\n/* Returns the users keycloak config */\nexport const getKeycloakConfig = () => {\n const appConfig = getAppConfig();\n if (!isKeycloakEnabled()) return false;\n const { keycloak } = appConfig.auth;\n const { serverUrl, realm, clientId } = keycloak;\n if (!serverUrl || !realm || !clientId) {\n ErrorHandler('Keycloak config missing- please ensure you specify: serverUrl, realm, clientId');\n return false;\n }\n return keycloak;\n};\n\n/* Returns array of users from appConfig.auth, if available, else an empty array */\nconst getUsers = () => {\n const appConfig = getAppConfig();\n const auth = appConfig.auth || {};\n // Check if the user is still using previous schema type\n if (Array.isArray(auth)) {\n printWarning(); // Print warning message\n return []; // Support for old data structure now removed\n }\n // Otherwise, return the users array, if available\n return auth.users || [];\n};\n\n/**\n * Generates a 1-way hash, in order to be stored in local storage for authentication\n * @param {String} user The username of user\n * @returns {String} The hashed token\n */\nconst generateUserToken = (user) => {\n const strAndUpper = (input) => input.toString().toUpperCase();\n const sha = sha256(strAndUpper(user.user) + strAndUpper(user.hash));\n return strAndUpper(sha);\n};\n\n/**\n * Checks if the user is currently authenticated\n * @param {Array[Object]} users An array of user objects pulled from the config\n * @returns {Boolean} Will return true if the user is logged in, else false\n */\nexport const isLoggedIn = () => {\n const users = getUsers();\n const validTokens = users.map((user) => generateUserToken(user));\n let userAuthenticated = false;\n document.cookie.split(';').forEach((cookie) => {\n if (cookie && cookie.split('=').length > 1) {\n const cookieKey = cookie.split('=')[0].trim();\n const cookieValue = cookie.split('=')[1].trim();\n if (cookieKey === cookieKeys.AUTH_TOKEN) {\n if (validTokens.includes(cookieValue)) {\n userAuthenticated = true;\n }\n }\n }\n });\n return userAuthenticated;\n};\n\n/* Returns true if authentication is enabled */\nexport const isAuthEnabled = () => {\n const users = getUsers();\n return (users.length > 0);\n};\n\n/* Returns true if guest access is enabled */\nexport const isGuestAccessEnabled = () => {\n const appConfig = getAppConfig();\n if (appConfig.auth && typeof appConfig.auth === 'object') {\n return appConfig.auth.enableGuestAccess || false;\n }\n return false;\n};\n\n/**\n * Checks credentials entered by the user against those in the config\n * Returns an object containing a boolean indicating success/ failure\n * along with a message outlining what's not right\n * @param {String} username The username entered by the user\n * @param {String} pass The password entered by the user\n * @param {String[]} users An array of valid user objects\n * @returns {Object} An object containing a boolean result and a message\n */\nexport const checkCredentials = (username, pass, users, messages) => {\n let response; // Will store an object containing boolean and message\n if (!username) {\n response = { correct: false, msg: messages.missingUsername };\n } else if (!pass) {\n response = { correct: false, msg: messages.missingPassword };\n } else {\n users.forEach((user) => {\n if (user.user.toLowerCase() === username.toLowerCase()) { // User found\n if (user.hash.toLowerCase() === sha256(pass).toString().toLowerCase()) {\n response = { correct: true, msg: messages.successMsg }; // Password is correct\n } else { // User found, but password is not a match\n response = { correct: false, msg: messages.incorrectPassword };\n }\n }\n });\n }\n return response || { correct: false, msg: messages.incorrectUsername };\n};\n\n/**\n * Sets the cookie value in order to login the user locally\n * @param {String} username - The users username\n * @param {String} pass - Password, not yet hashed\n * @param {Number} timeout - A desired timeout for the session, in ms\n */\nexport const login = (username, pass, timeout) => {\n const now = new Date();\n const expiry = new Date(now.setTime(now.getTime() + timeout)).toGMTString();\n const userObject = { user: username, hash: sha256(pass).toString().toLowerCase() };\n document.cookie = `authenticationToken=${generateUserToken(userObject)};`\n + `${timeout > 0 ? `expires=${expiry}` : ''}`;\n localStorage.setItem(localStorageKeys.USERNAME, username);\n};\n\n/**\n * Removed the browsers cookie, causing user to be logged out\n */\nexport const logout = () => {\n document.cookie = 'authenticationToken=null';\n localStorage.removeItem(localStorageKeys.USERNAME);\n};\n\n/**\n * If correctly logged in as a valid, authenticated user,\n * then returns the user object for the current user\n * If not logged in, will return false\n * */\nexport const getCurrentUser = () => {\n if (!isLoggedIn()) return false; // User not logged in\n const username = localStorage[localStorageKeys.USERNAME]; // Get username\n if (!username) return false; // No username\n let foundUserObject = false; // Value to return\n getUsers().forEach((user) => {\n // If current logged in user found, then return that user\n if (user.user === username) foundUserObject = user;\n });\n return foundUserObject;\n};\n\n/**\n * Checks if the user is viewing the dashboard as a guest\n * Returns true if guest mode enabled, and user not logged in\n * */\nexport const isLoggedInAsGuest = () => {\n const guestEnabled = isGuestAccessEnabled();\n const notLoggedIn = !isLoggedIn();\n return guestEnabled && notLoggedIn;\n};\n\n/**\n * Checks if the current user has admin privileges.\n * If no users are setup, then function will always return true\n * But if auth is configured, then will verify user is correctly\n * logged in and then check weather they are of type admin, and\n * return false if any conditions fail\n * @param {String[]} - Array of users\n * @returns {Boolean} - True if admin privileges\n */\nexport const isUserAdmin = () => {\n const users = getUsers();\n if (users.length === 0) return true; // Authentication not setup\n if (!isLoggedIn()) return false; // Auth setup, but not signed in as a valid user\n const currentUser = localStorage[localStorageKeys.USERNAME];\n let isAdmin = false;\n users.forEach((user) => {\n if (user.user === currentUser) {\n if (user.type === 'admin') isAdmin = true;\n }\n });\n return isAdmin;\n};\n\n/**\n * Determines which button should display, based on the user type\n * 0 = Auth not configured (don't show anything)\n * 1 = Auth configured, and user logged in (show logout button)\n * 2 = Auth configured, guest access enabled, not logged in (show login)\n * Note that if auth is enabled, but not guest access, and user not logged in,\n * then they will never be able to view the homepage, so no button needed\n */\nexport const getUserState = () => {\n const { notConfigured, loggedIn, guestAccess } = userStateEnum; // Numeric enum options\n if (!isAuthEnabled()) return notConfigured; // No auth enabled\n if (isLoggedIn()) return loggedIn; // User is logged in\n if (isGuestAccessEnabled()) return guestAccess; // Guest is viewing\n return notConfigured;\n};\n","/**\n * A helper function that filters all the sections based on current users permissions\n * Checks each sections displayData for hideForUsers, showForUsers and hideForGuests\n * Returns an array of sections that the current logged in user has permissions for\n */\n\n// Import helper functions from auth, to get current user, and check if guest\nimport { getCurrentUser, isLoggedInAsGuest } from '@/utils/Auth';\n\n/* Helper function, checks if a given username appears in a user array */\nconst determineVisibility = (visibilityList, cUsername) => {\n let isFound = false;\n visibilityList.forEach((userInList) => {\n if (userInList.toLowerCase() === cUsername) isFound = true;\n });\n return isFound;\n};\n\n/* Returns false if this section should not be rendered for the current user/ guest */\nconst isSectionVisibleToUser = (displayData, currentUser, isGuest) => {\n // Checks if user explicitly has access to a certain section\n const checkVisiblity = () => {\n if (!currentUser) return true;\n const hideFor = displayData.hideForUsers || [];\n const cUsername = currentUser.user.toLowerCase();\n return !determineVisibility(hideFor, cUsername);\n };\n // Checks if user is explicitly prevented from viewing a certain section\n const checkHiddenability = () => {\n if (!currentUser) return true;\n const cUsername = currentUser.user.toLowerCase();\n const showForUsers = displayData.showForUsers || [];\n if (showForUsers.length < 1) return true;\n return determineVisibility(showForUsers, cUsername);\n };\n // Checks if the current user is a guest, and if section allows for guests\n const checkIfHideForGuest = () => {\n const hideForGuest = displayData.hideForGuests;\n return !(hideForGuest && isGuest);\n };\n return checkVisiblity() && checkHiddenability() && checkIfHideForGuest();\n};\n\n/* Putting it all together, the function to export */\nconst checkSectionVisibility = (sections) => {\n const currentUser = getCurrentUser(); // Get current user object\n const isGuest = isLoggedInAsGuest(); // Check if current user is a guest\n return sections.filter((currentSection) => {\n const displayData = currentSection.displayData || {};\n return isSectionVisibleToUser(displayData, currentUser, isGuest);\n });\n};\n\nexport default checkSectionVisibility;\n","// Locales - Import translation files here!\nimport en from '@/assets/locales/en.json';\nimport de from '@/assets/locales/de.json';\nimport nl from '@/assets/locales/nl.json';\nimport pl from '@/assets/locales/pl.json';\nimport fr from '@/assets/locales/fr.json';\nimport sl from '@/assets/locales/sl.json';\nimport es from '@/assets/locales/es.json';\nimport it from '@/assets/locales/it.json';\nimport zhCN from '@/assets/locales/zh-CN.json';\nimport ar from '@/assets/locales/ar.json';\nimport hi from '@/assets/locales/hi.json';\nimport ja from '@/assets/locales/ja.json';\nimport pt from '@/assets/locales/pt.json';\nimport ru from '@/assets/locales/ru.json';\nimport nb from '@/assets/locales/nb.json';\nimport pirate from '@/assets/locales/zz-pirate.json';\n\n// Language data - Next register your language by adding it to this list\nexport const languages = [\n {\n name: 'English',\n code: 'en',\n locale: en,\n flag: '🇬🇧',\n },\n { // German\n name: 'Deutsch',\n code: 'de',\n locale: de,\n flag: '🇩🇪',\n },\n {\n name: 'Dutch',\n code: 'nl',\n locale: nl,\n flag: '🇳🇱',\n },\n {\n name: 'polski',\n code: 'pl',\n locale: pl,\n flag: '🇵🇱',\n },\n {\n name: 'Français',\n code: 'fr',\n locale: fr,\n flag: '🇲🇫',\n },\n {\n name: 'Slovenščina',\n code: 'sl',\n locale: sl,\n flag: '🇸🇮',\n },\n { // Spanish\n name: 'Español',\n code: 'es',\n locale: es,\n flag: '🇪🇸',\n },\n { // Italian\n name: 'Italiano',\n code: 'it',\n locale: it,\n flag: '🇮🇹',\n },\n { // Chinese\n name: '简体中文',\n code: 'cn',\n locale: zhCN,\n flag: '🇨🇳',\n },\n { // Arabic\n name: 'العربية',\n code: 'ar',\n locale: ar,\n flag: '🇦🇪',\n },\n { // Hindi\n name: 'नहीं',\n code: 'hi',\n locale: hi,\n flag: '🇮🇳',\n },\n { // Japanese\n name: '日本語',\n code: 'ja',\n locale: ja,\n flag: '🇯🇵',\n },\n { // Portuguese\n name: 'Português',\n code: 'pt',\n locale: pt,\n flag: '🇵🇹',\n },\n { // Russian\n name: 'Русский',\n code: 'ru',\n locale: ru,\n flag: '🇷🇺',\n },\n { // Norwegian\n name: 'Norsk',\n code: 'nb',\n locale: nb,\n flag: '🇳🇴',\n },\n { // Joke Language - Pirate\n name: 'Pirate',\n code: 'pirate',\n locale: pirate,\n flag: '🏴‍☠️',\n },\n];\n\n/**\n * Include the following info:\n * name - Human readable name for your language (e.g German)\n * code - ISO language code (e.g. de)\n * locale - The file that you imported above\n * flag - A nice emoji flag (optional, e.g. 🇩🇪)\n */\n\n// All done :)\n// You can also add your language to /README.md and credit yourself if you like\n\n// Prepare each language for export\nconst i18nMessages = {};\nlanguages.forEach((lang) => {\n i18nMessages[lang.code] = lang.locale;\n});\nexport const messages = i18nMessages;\n","import ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport filterUserSections from '@/utils/CheckSectionVisibility';\nimport { languages } from '@/utils/languages';\nimport {\n visibleComponents,\n localStorageKeys,\n theme as defaultTheme,\n language as defaultLanguage,\n} from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport ConfigSchema from '@/utils/ConfigSchema.json';\n\n/**\n * Initiates the Accumulator class and generates a complete config object\n * Self-executing function, returns the full user config as a JSON object\n */\nexport const config = (() => {\n const Accumulator = new ConfigAccumulator();\n return {\n appConfig: Accumulator.appConfig(),\n pageInfo: Accumulator.pageInfo(),\n sections: filterUserSections(Accumulator.sections()),\n };\n})();\n\n/**\n * Generates an object containing booleans indicating which\n * components should be hidden. This enables the user to hide\n * parts of the page and disable functionality that they don't need/ want\n * All options fallback on the values defined in the defaults\n * @param {object} appConfig The full app config\n * @returns {object} result\n */\nexport const componentVisibility = (appConfig) => {\n // Get users choice from app config\n const usersChoice = appConfig.hideComponents || {};\n // Checks if value is defined, and is a boolean\n const isThere = (userValue) => typeof userValue === 'boolean';\n // For each option, return users choice (if specified), else use the default\n return {\n pageTitle: isThere(usersChoice.hideHeading)\n ? !usersChoice.hideHeading : visibleComponents.pageTitle,\n navigation: isThere(usersChoice.hideNav)\n ? !usersChoice.hideNav : visibleComponents.navigation,\n searchBar: isThere(usersChoice.hideSearch)\n ? !usersChoice.hideSearch : visibleComponents.searchBar,\n settings: isThere(usersChoice.hideSettings)\n ? !usersChoice.hideSettings : visibleComponents.settings,\n footer: isThere(usersChoice.hideFooter)\n ? !usersChoice.hideFooter : visibleComponents.footer,\n splashScreen: isThere(usersChoice.hideSplashScreen)\n ? !usersChoice.hideSplashScreen : visibleComponents.splashScreen,\n };\n};\n\n/**\n * Gets the users saved theme, first looks for local storage theme,\n * then looks at user's appConfig, and finally checks the defaults\n * @returns {string} Name of theme to apply\n */\nexport const getTheme = () => {\n const localTheme = localStorage[localStorageKeys.THEME];\n const appConfigTheme = config.appConfig.theme;\n return localTheme || appConfigTheme || defaultTheme;\n};\n\n/**\n * Gets any custom styles the user has applied, wither from local storage, or from the config\n * @returns {object} An array of objects, one for each theme, containing kvps for variables\n */\nexport const getCustomColors = () => {\n const localColors = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}');\n const configColors = config.appConfig.customColors || {};\n return Object.assign(configColors, localColors);\n};\n\n/**\n * Returns a list of items which the user has assigned a hotkey to\n * So that when the hotkey is pressed, the app/ service can be launched\n */\nexport const getCustomKeyShortcuts = () => {\n const results = [];\n const sections = config.sections || [];\n sections.forEach((section) => {\n const itemsWithHotKeys = section.items.filter(item => item.hotkey);\n results.push(itemsWithHotKeys.map(item => ({ hotkey: item.hotkey, url: item.url })));\n });\n return results.flat();\n};\n\n/**\n * Gets the users chosen language. Defaults to English.\n * @returns {object} Language, including code, name and flag\n */\nexport const getUsersLanguage = () => {\n const langCode = localStorage[localStorageKeys.LANGUAGE]\n || config.appConfig.language\n || defaultLanguage;\n const langObj = languages.find(lang => lang.code === langCode);\n return langObj;\n};\n\n/**\n * validator for item target attribute\n * Uses enum values from config schema, and shows warning if invalid\n * @param {String} target\n * @returns {Boolean} isValid\n */\nexport const targetValidator = (target) => {\n const acceptedTargets = ConfigSchema.properties.sections.items\n .properties.items.items.properties.target.enum;\n const isTargetValid = acceptedTargets.indexOf(target) !== -1;\n if (!isTargetValid) ErrorHandler(`Unknown target value: ${target}`);\n return isTargetValid;\n};\n","/* Dashy: Licensed under MIT, (C) Alicia Sykes 2021 <https://aliciasykes.com> */\n\n/* Tile filtering utility */\nimport ErrorHandler from '@/utils/ErrorHandler';\n\n/**\n * Extracts the site name from domain\n * @param {string} url The URL to process\n * @returns {string} The hostname from URL\n */\nconst getDomainFromUrl = (url) => {\n if (!url) return '';\n const urlPattern = /^(?:https?:\\/\\/)?(?:w{3}\\.)?([a-z\\d.-]+)\\.(?:[a-z.]{2,10})(?:[/\\w.-]*)*/;\n const domainPattern = url.match(urlPattern);\n return domainPattern ? domainPattern[1] : '';\n};\n\n/**\n * Compares search term to a given data attribute\n * Ignores case, special characters and order\n * @param {string or other} compareStr The value to compare to\n * @param {string} searchStr The users search term\n * @returns {boolean} true if a match, otherwise false\n */\nconst filterHelper = (compareStr, searchStr) => {\n if (!compareStr) return false;\n const process = (input) => input && input.toString().toLowerCase().replace(/[^\\w\\s]/gi, '');\n return process(compareStr).includes(process(searchStr));\n};\n\n/**\n * Filter tiles based on users search term, and returns a filtered list\n * Will match based on title, description, provider, hostname from url and tags\n * Ignores case, special characters and other irrelevant things\n * @param {array} allTiles An array of tiles\n * @param {string} searchTerm The users search term\n * @returns A filtered array of tiles\n */\nexport const searchTiles = (allTiles, searchTerm) => {\n if (!searchTerm) return allTiles; // If no search term, then return all\n if (!allTiles) return []; // If no data, then skip\n return allTiles.filter((tile) => {\n const {\n title, description, provider, url, tags,\n } = tile;\n return filterHelper(title, searchTerm)\n || filterHelper(provider, searchTerm)\n || filterHelper(description, searchTerm)\n || filterHelper(tags, searchTerm)\n || filterHelper(getDomainFromUrl(url), searchTerm);\n });\n};\n\n/* From a list of search bangs, return the URL associated with it */\nexport const getSearchEngineFromBang = (searchQuery, bangList) => {\n const bangNames = Object.keys(bangList);\n const foundBang = bangNames.find((bang) => searchQuery.includes(bang));\n return bangList[foundBang];\n};\n\n/* For a given search engine key, return the corresponding URL, or throw error */\nexport const findUrlForSearchEngine = (searchEngine, availableSearchEngines) => {\n // If missing search engine, report error return false\n if (!searchEngine) { ErrorHandler('No search engine specified'); return undefined; }\n // If search engine is already a URL, then return it\n if ((/(http|https):\\/\\/[^]*/).test(searchEngine)) return searchEngine;\n // If search engine was found successfully, return the URL\n if (availableSearchEngines[searchEngine]) return availableSearchEngines[searchEngine];\n // Otherwise, there's been an error, log it and return false\n ErrorHandler(`Specified Search Engine was not Found: '${searchEngine}'`);\n return undefined;\n};\n\n/* Removes all known bangs from a search query */\nexport const stripBangs = (searchQuery, bangList) => {\n const bangNames = Object.keys(bangList || {});\n let q = searchQuery;\n bangNames.forEach((bang) => { q = q.replace(bang, ''); });\n return q.trim();\n};\n","<template>\n <form @submit.prevent=\"searchSubmitted\" :class=\"minimalSearch ? 'minimal' : 'normal'\">\n <label for=\"filter-tiles\">{{ $t('search.search-label') }}</label>\n <div class=\"search-wrap\">\n <input\n id=\"filter-tiles\"\n v-model=\"input\"\n ref=\"filter\"\n :placeholder=\"$t('search.search-placeholder')\"\n v-on:input=\"userIsTypingSomething\"\n @keydown.esc=\"clearFilterInput\" />\n <p v-if=\"(!searchPrefs.disableWebSearch) && input.length > 0\" class=\"web-search-note\">\n {{ $t('search.enter-to-search-web') }}\n </p>\n </div>\n <i v-if=\"input.length > 0\"\n class=\"clear-search\"\n :title=\"$t('search.clear-search-tooltip')\"\n @click=\"clearFilterInput\">x</i>\n </form>\n</template>\n\n<script>\nimport router from '@/router';\nimport ArrowKeyNavigation from '@/utils/ArrowKeyNavigation';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { getCustomKeyShortcuts } from '@/utils/ConfigHelpers';\nimport { getSearchEngineFromBang, findUrlForSearchEngine, stripBangs } from '@/utils/Search';\nimport {\n searchEngineUrls,\n defaultSearchEngine,\n defaultSearchOpeningMethod,\n searchBangs as defaultSearchBangs,\n} from '@/utils/defaults';\n\nexport default {\n name: 'FilterTile',\n props: {\n minimalSearch: Boolean, // If true, then keep it simple\n },\n data() {\n return {\n input: '', // Users current search term\n akn: new ArrowKeyNavigation(), // Class that manages arrow key naviagtion\n getCustomKeyShortcuts,\n };\n },\n computed: {\n active() {\n return !this.$store.state.modalOpen;\n },\n searchPrefs() {\n return this.$store.getters.webSearch || {};\n },\n },\n mounted() {\n window.addEventListener('keydown', this.handleKeyPress);\n },\n beforeDestroy() {\n window.removeEventListener('keydown', this.handleKeyPress);\n },\n methods: {\n /* Call correct function dependending on which key is pressed */\n handleKeyPress(event) {\n const currentElem = document.activeElement.id;\n const { key, keyCode } = event;\n const notAlreadySearching = currentElem !== 'filter-tiles';\n // If a modal is open, then do nothing\n if (!this.active) return;\n if (/^[/:!a-zA-Z]$/.test(key) && notAlreadySearching) {\n // Letter or bang key pressed - start searching\n if (this.$refs.filter) this.$refs.filter.focus();\n this.userIsTypingSomething();\n } else if (/^[0-9]$/.test(key)) {\n // Number key pressed, check if user has a custom binding\n this.handleHotKey(key);\n } else if (keyCode >= 37 && keyCode <= 40) {\n // Arrow key pressed - start navigation\n this.akn.arrowNavigation(keyCode);\n } else if (keyCode === 27) {\n // Esc key pressed - reset form\n this.clearFilterInput();\n }\n },\n /* Emmits users's search term up to parent */\n userIsTypingSomething() {\n this.$emit('user-is-searchin', this.input);\n },\n /* Resets everything to initial state, when user is finished */\n clearFilterInput() {\n this.input = ''; // Clear input model\n this.userIsTypingSomething(); // Emmit new empty value\n document.activeElement.blur(); // Remove focus\n this.akn.resetIndex(); // Reset current element index\n },\n /* If configured, launch specific app when hotkey pressed */\n handleHotKey(key) {\n const usersHotKeys = this.getCustomKeyShortcuts();\n usersHotKeys.forEach((hotkey) => {\n if (hotkey.hotkey === parseInt(key, 10)) {\n if (hotkey.url) window.open(hotkey.url, '_blank');\n }\n });\n },\n /* Launch search results, with users desired opening method */\n launchWebSearch(url, method) {\n switch (method) {\n case 'newtab':\n window.open(url, '_blank');\n break;\n case 'sametab':\n window.open(url, '_self');\n break;\n case 'workspace':\n router.push({ name: 'workspace', query: { url } });\n break;\n default:\n ErrorHandler(`Unknown opening method: ${method}`);\n window.open(url, '_blank');\n }\n },\n\n /* Launch web search, to correct search engine, passing in users query */\n searchSubmitted() {\n // Get search preferences from appConfig\n const { searchPrefs } = this;\n if (!searchPrefs.disableWebSearch) { // Only proceed if user hasn't disabled web search\n const bangList = { ...defaultSearchBangs, ...(searchPrefs.searchBangs || {}) };\n const openingMethod = searchPrefs.openingMethod || defaultSearchOpeningMethod;\n const searchBang = getSearchEngineFromBang(this.input, bangList);\n const searchEngine = searchPrefs.searchEngine || defaultSearchEngine;\n // Use either search bang, or preffered search engine\n const desiredSearchEngine = searchBang || searchEngine;\n const isCustomSearch = (searchPrefs.searchEngine === 'custom' && searchPrefs.customSearchEngine);\n let searchUrl = isCustomSearch\n ? searchPrefs.customSearchEngine\n : findUrlForSearchEngine(desiredSearchEngine, searchEngineUrls);\n if (searchUrl) { // Append search query to URL, and launch\n searchUrl += encodeURIComponent(stripBangs(this.input, bangList));\n this.launchWebSearch(searchUrl, openingMethod);\n this.clearFilterInput();\n }\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n form.normal {\n display: flex;\n align-items: center;\n border-radius: 0 0 var(--curve-factor-navbar) 0;\n padding: 0 0.2rem 0.2rem 0;\n background: var(--search-container-background);\n .search-wrap {\n display: flex;\n flex-direction: column;\n width: 100%;\n p.web-search-note {\n margin: 0 0.5rem;\n font-size: 0.8rem;\n color: var(--minimal-view-search-color);\n opacity: var(--dimming-factor);\n }\n }\n label {\n display: inline;\n color: var(--search-label-color);\n margin: 0.5rem;\n display: inline;\n }\n input {\n display: inline-block;\n width: 200px;\n height: 1rem;\n padding: 0.5rem;\n margin: 0.5rem;\n outline: none;\n border: none;\n border-radius: var(--curve-factor);\n background: var(--search-field-background);\n color: var(--settings-text-color);\n border: 1px solid var(--outline-color);\n &:focus {\n border-color: var(--settings-text-color);\n opacity: var(--dimming-factor);\n }\n }\n .clear-search {\n color: var(--settings-text-color);\n padding: 0 0.3rem 0.1rem 0.3rem;\n font-style: normal;\n font-size: 1rem;\n opacity: var(--dimming-factor);\n border-radius: 50px;\n cursor: pointer;\n right: 0.5rem;\n top: 1rem;\n border: 1px solid var(--settings-text-color);\n margin: 0.25rem;\n &:hover {\n opacity: 1;\n background: var(--background-darker);\n }\n }\n }\n\n @include tablet {\n form.normal {\n display: block;\n text-align: center;\n }\n }\n @include phone {\n form.nomral {\n flex: 1;\n border-radius: 0;\n text-align: center;\n padding: 0.25rem 0;\n display: block;\n }\n }\n\n form.minimal {\n display: flex;\n align-items: center;\n label { display: none; }\n .search-wrap {\n display: flex;\n flex-direction: column;\n align-items: center;\n width: 100%;\n p.web-search-note {\n margin: 0;\n color: var(--minimal-view-search-color);\n opacity: var(--dimming-factor);\n }\n }\n input {\n display: inline-block;\n width: 80%;\n max-width: 400px;\n font-size: 1.2rem;\n padding: 0.5rem 1rem;\n margin: 1rem auto;\n outline: none;\n border: 1px solid var(--outline-color);\n border-radius: var(--curve-factor);\n background: var(--minimal-view-search-background);\n color: var(--minimal-view-search-color);\n &:focus {\n border-color: var(--minimal-view-search-color);\n opacity: var(--dimming-factor);\n }\n }\n .clear-search {\n color: var(--minimal-view-search-color);\n padding: 0.15rem 0.5rem 0.2rem 0.5rem;\n font-style: normal;\n font-size: 1rem;\n opacity: var(--dimming-factor);\n border-radius: 50px;\n cursor: pointer;\n right: 0.5rem;\n top: 1rem;\n border: 1px solid var(--minimal-view-search-color);\n margin: 0.5rem;\n &:hover {\n opacity: 1;\n color: var(--minimal-view-search-background);\n background: var(--minimal-view-search-color);\n }\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SearchBar.vue?vue&type=template&id=3e12dc6e&scoped=true&\"\nimport script from \"./SearchBar.vue?vue&type=script&lang=js&\"\nexport * from \"./SearchBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SearchBar.vue?vue&type=style&index=0&id=3e12dc6e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3e12dc6e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeViewSwitcher),expression:\"closeViewSwitcher\"}],staticClass:\"config-options\"},[_c('span',{staticClass:\"config-label\"},[_vm._v(_vm._s(_vm.$t('settings.config-launcher-label')))]),_c('div',{staticClass:\"config-buttons\"},[_c('IconSpanner',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.config-launcher-tooltip'))),expression:\"tooltip($t('settings.config-launcher-tooltip'))\"}],attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.showEditor()}}}),_c('IconInteractiveEditor',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.enterEditModeTooltip)),expression:\"tooltip(enterEditModeTooltip)\"}],class:_vm.isEditMode ? 'disabled' : '',attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.startInteractiveEditor()}}}),_c('IconViewMode',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('alternate-views.alternate-view-heading'))),expression:\"tooltip($t('alternate-views.alternate-view-heading'))\"}],attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.openChangeViewMenu()}}})],1),_c('modal',{attrs:{\"name\":_vm.modalNames.CONF_EDITOR,\"resizable\":true,\"width\":\"60%\",\"height\":\"85%\",\"classes\":\"dashy-modal\"},on:{\"closed\":_vm.editorClosed}},[_c('ConfigContainer',{attrs:{\"config\":_vm.combineConfig()}})],1),_c('modal',{attrs:{\"name\":_vm.modalNames.LANG_SWITCHER,\"classes\":\"dashy-modal\",\"resizable\":true,\"width\":\"35%\",\"height\":\"60%\"}},[_c('LanguageSwitcher')],1),(_vm.viewSwitcherOpen)?_c('div',{staticClass:\"view-switcher\"},[_c('ul',[_c('li',[_c('router-link',{attrs:{\"to\":\"/home\"}},[_c('IconHome'),_c('span',[_vm._v(_vm._s(_vm.$t('alternate-views.default')))])],1)],1),_c('li',[_c('router-link',{attrs:{\"to\":\"/minimal\"}},[_c('IconMinimalView'),_c('span',[_vm._v(_vm._s(_vm.$t('alternate-views.minimal')))])],1)],1),_c('li',[_c('router-link',{attrs:{\"to\":\"/workspace\"}},[_c('IconWorkspaceView'),_c('span',[_vm._v(_vm._s(_vm.$t('alternate-views.workspace')))])],1)],1)])]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Tabs',{ref:\"tabView\",attrs:{\"navAuto\":true,\"name\":\"Add Item\"}},[_c('TabItem',{staticClass:\"main-tab\",attrs:{\"name\":_vm.$t('config.main-tab')}},[_c('div',{staticClass:\"main-options-container\"},[_c('div',{staticClass:\"config-buttons\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('config.heading')))]),_c('a',{staticClass:\"hyperlink-wrapper\",on:{\"click\":function($event){return _vm.openExportConfigModal()}}},[_c('button',{staticClass:\"config-button center\"},[_c('DownloadIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.download-config-button'))+\" \")],1)]),_c('button',{staticClass:\"config-button center\",on:{\"click\":function () { return _vm.navigateToTab(1); }}},[_c('EditIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.edit-config-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.openLanguageSwitchModal()}}},[_c('LanguageIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.change-language-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function () { return _vm.navigateToTab(3); }}},[_c('CustomCssIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.edit-css-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function () { return _vm.navigateToTab(2); }}},[_c('CloudIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.backupId ? _vm.$t('config.edit-cloud-sync-button') : _vm.$t('config.cloud-sync-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.openRebuildAppModal()}}},[_c('RebuildIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.rebuild-app-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.resetLocalSettings()}}},[_c('DeleteIcon',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.reset-settings-button'))+\" \")],1),_c('button',{staticClass:\"config-button center\",on:{\"click\":function($event){return _vm.openAboutModal()}}},[_c('IconAbout',{staticClass:\"button-icon\"}),_vm._v(\" \"+_vm._s(_vm.$t('config.app-info-button'))+\" \")],1),_c('p',{staticClass:\"small-screen-note\",staticStyle:{\"display\":\"none\"}},[_vm._v(\" You are using a very small screen, and some screens in this menu may not be optimal \")]),_c('p',{staticClass:\"language\"},[_vm._v(_vm._s(_vm.getLanguage()))]),_c('AppVersion')],1),_c('div',{staticClass:\"config-note\"},[_c('span',[_vm._v(_vm._s(_vm.$t('config.backup-note')))])])]),_c('RebuildApp')],1),_c('TabItem',{attrs:{\"name\":_vm.$t('config.edit-config-tab')}},[_c('JsonEditor')],1),_c('TabItem',{attrs:{\"name\":_vm.$t('cloud-sync.title')}},[_c('CloudBackupRestore')],1),_c('TabItem',{attrs:{\"name\":_vm.$t('config.custom-css-tab')}},[_c('CustomCssEditor')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"json-editor-outer\"},[_c('v-jsoneditor',{attrs:{\"options\":_vm.options},model:{value:(_vm.jsonData),callback:function ($$v) {_vm.jsonData=$$v},expression:\"jsonData\"}}),_c('Radio',{staticClass:\"save-options\",attrs:{\"label\":_vm.$t('config-editor.save-location-label'),\"options\":_vm.saveOptions,\"initialOption\":_vm.initialSaveMode,\"disabled\":!_vm.allowWriteToDisk},model:{value:(_vm.saveMode),callback:function ($$v) {_vm.saveMode=$$v},expression:\"saveMode\"}}),_c('div',{class:(\"btn-container \" + (!_vm.isValid ? 'err' : ''))},[_c('Button',{attrs:{\"click\":_vm.save}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.save-button'))+\" \")]),_c('Button',{attrs:{\"click\":_vm.startPreview}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.preview-button'))+\" \")])],1),_c('p',{staticClass:\"errors\"},[_c('ul',[_vm._l((_vm.errorMessages),function(error,index){return _c('li',{key:index,class:(\"type-\" + (error.type))},[_vm._v(\" \"+_vm._s(error.msg)+\" \")])}),(_vm.errorMessages.length < 1)?_c('li',{staticClass:\"type-valid\"},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.valid-label'))+\" \")]):_vm._e()],2)]),(_vm.saveSuccess !== undefined)?_c('p',{class:(\"response-output status-\" + (_vm.saveSuccess ? 'success' : 'fail'))},[_vm._v(\" \"+_vm._s(_vm.saveSuccess ? _vm.$t('config-editor.status-success-msg') : _vm.$t('config-editor.status-fail-msg'))+\" \")]):_vm._e(),(!_vm.allowWriteToDisk)?_c('p',{staticClass:\"no-permission-note\"},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.not-admin-note'))+\" \")]):_vm._e(),_c('p',{staticClass:\"response-output\"},[_vm._v(_vm._s(_vm.responseText))]),(_vm.saveSuccess)?_c('p',{staticClass:\"response-output\"},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.success-note-l1'))+\" \"+_vm._s(_vm.$t('config-editor.success-note-l2'))+\" \")]):_vm._e(),_c('p',{staticClass:\"note\"},[_vm._v(_vm._s(_vm.$t('config.backup-note')))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.hoverText),expression:\"hoverText\"}],class:_vm.disallow ? 'disallowed': '',attrs:{\"type\":_vm.type || 'button',\"disabled\":_vm.disabled,\"title\":_vm.tooltip},on:{\"click\":function($event){_vm.click ? _vm.click() : function () { return null; }}}},[_vm._t(\"default\"),_vm._t(\"text\"),_vm._t(\"icon\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <button\n @click=\"click ? click() : () => null\"\n :class=\"disallow ? 'disallowed': ''\"\n :type=\"type || 'button'\"\n :disabled=\"disabled\"\n v-tooltip=\"hoverText\"\n :title=\"tooltip\"\n >\n <slot></slot>\n <slot name=\"text\"></slot>\n <slot name=\"icon\"></slot>\n </button>\n</template>\n\n<script>\n\nexport default {\n name: 'Button',\n props: {\n text: String, // The text to be displayed in the button\n click: Function, // Function to call when clicked\n disabled: Boolean, // If true, button cannot be clicked\n disallow: Boolean, // Show not-allowed cursor when true\n type: String, // The html button type attribute\n tooltip: String, // Text to be displayed on hover\n },\n computed: {\n /* If tooltip prop specified, then return config for v-tooltip */\n hoverText() {\n const content = this.tooltip;\n const trigger = 'hover focus';\n const delay = { show: 350, hide: 100 };\n return (content) ? { content, trigger, delay } : undefined;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n/* Layout settings */\nbutton {\n display: flex;\n justify-content: center;\n flex-direction: row-reverse;\n align-items: center;\n padding: 0.5rem 0.75rem;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n min-width: 10rem;\n cursor: pointer;\n svg {\n width: 1.2rem;\n margin: 0 0.5rem;\n path, g {\n fill: currentColor;\n }\n }\n &.disallowed {\n cursor: not-allowed !important;\n }\n}\n\n/* Default visual settings, can be overridden when needed */\nbutton {\n color: var(--primary);\n background: var(--background);\n border: 1px solid var(--primary);\n border-radius: var(--curve-factor);\n &:hover:not(:disabled) {\n color: var(--background);\n background: var(--primary);\n border-color: var(--background);\n }\n &:disabled {\n cursor: progress;\n opacity: var(--dimming-factor);\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Button.vue?vue&type=template&id=57605993&scoped=true&\"\nimport script from \"./Button.vue?vue&type=script&lang=js&\"\nexport * from \"./Button.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Button.vue?vue&type=style&index=0&id=57605993&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"57605993\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"radio-container\"},[(_vm.label)?_c('label',{staticClass:\"radio-label\"},[_vm._v(_vm._s(_vm.label))]):_vm._e(),_c('div',{staticClass:\"radio-wrapper\"},_vm._l((_vm.options),function(radio){return _c('div',{key:radio.value,class:(\"radio-option \" + (_vm.disabled ? 'wrap-disabled' : ''))},[_c('label',{staticClass:\"option-label\",attrs:{\"for\":(\"id-\" + (radio.value))}},[_vm._v(_vm._s(radio.label))]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.selectedRadio),expression:\"selectedRadio\"}],staticClass:\"radio-input\",attrs:{\"type\":\"radio\",\"id\":(\"id-\" + (radio.value)),\"name\":_vm.makeGroupName,\"disabled\":_vm.disabled || radio.disabled},domProps:{\"value\":radio.value,\"checked\":_vm._q(_vm.selectedRadio,radio.value)},on:{\"input\":function($event){return _vm.updateValue($event.target.value)},\"change\":function($event){_vm.selectedRadio=radio.value}}})])}),0),(_vm.description)?_c('p',{staticClass:\"radio-description\"},[_vm._v(_vm._s(_vm.description))]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"radio-container\">\n <label v-if=\"label\" class=\"radio-label\">{{ label }}</label>\n <div class=\"radio-wrapper\">\n <div v-for=\"radio in options\" :key=\"radio.value\"\n :class=\"`radio-option ${disabled ? 'wrap-disabled' : ''}`\">\n <label :for=\"`id-${radio.value}`\" class=\"option-label\">{{ radio.label }}</label>\n <input type=\"radio\" class=\"radio-input\"\n :id=\" `id-${radio.value}`\"\n :name=\"makeGroupName\"\n :value=\"radio.value\"\n :disabled=\"disabled || radio.disabled\"\n v-model=\"selectedRadio\"\n v-on:input=\"updateValue($event.target.value)\"\n />\n </div>\n </div>\n <p v-if=\"description\" class=\"radio-description\">{{ description }}</p>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Radio',\n components: {},\n props: {\n options: Array, // Array of objects for available options\n initialOption: String, // Optional default option\n label: String, // Form label for element\n description: String, // Optional description text\n disabled: Boolean, // Disable all radio buttons\n },\n data() {\n return {\n selectedRadio: '', // The currently radio val\n };\n },\n created() {\n if (this.initialOption) {\n this.updateValue(this.initialOption);\n }\n },\n computed: {\n makeGroupName() {\n return this.label.toLowerCase().replace(/[^a-z]+/, '');\n },\n },\n methods: {\n updateValue(value) {\n this.$emit('input', value);\n this.selectedRadio = value;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\ndiv.radio-container {\n margin: 0.25rem auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n label.radio-label,\n .radio-wrapper,\n p.radio-description {\n margin: 0.25rem;\n flex-basis: 8rem;\n flex-grow: 1;\n }\n label.radio-label {\n text-transform: capitalize;\n }\n p.radio-description {\n flex-grow: 3;\n opacity: var(--dimming-factor);\n }\n .radio-wrapper {\n display: flex;\n flex-grow: 2;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n color: var(--primary);\n background: var(--background);;\n border-radius: var(--curve-factor);\n min-width: 8rem;\n .radio-option {\n margin: 0.2rem;\n padding: 0.2rem;\n cursor: pointer;\n border: 1px solid transparent;\n border-radius: var(--curve-factor);\n &:hover:not(.wrap-disabled) {\n border: 1px solid var(--primary);\n }\n &:disabled {\n opacity: var(--dimming-factor);\n }\n label.option-label, input.radio-input {\n cursor: pointer;\n text-transform: capitalize;\n margin: 0.2rem;\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Radio.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Radio.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Radio.vue?vue&type=template&id=0ff870ef&scoped=true&\"\nimport script from \"./Radio.vue?vue&type=script&lang=js&\"\nexport * from \"./Radio.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Radio.vue?vue&type=style&index=0&id=0ff870ef&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"0ff870ef\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"json-editor-outer\">\n <!-- Main JSON editor -->\n <v-jsoneditor v-model=\"jsonData\" :options=\"options\" />\n <!-- Options raido, and save button -->\n <Radio class=\"save-options\"\n v-model=\"saveMode\"\n :label=\"$t('config-editor.save-location-label')\"\n :options=\"saveOptions\"\n :initialOption=\"initialSaveMode\"\n :disabled=\"!allowWriteToDisk\"\n />\n <!-- Save Buttons -->\n <div :class=\"`btn-container ${!isValid ? 'err' : ''}`\">\n <Button :click=\"save\">\n {{ $t('config-editor.save-button') }}\n </Button>\n <Button :click=\"startPreview\">\n {{ $t('config-editor.preview-button') }}\n </Button>\n </div>\n <!-- List validation warnings -->\n <p class=\"errors\">\n <ul>\n <li v-for=\"(error, index) in errorMessages\" :key=\"index\" :class=\"`type-${error.type}`\">\n {{error.msg}}\n </li>\n <li v-if=\"errorMessages.length < 1\" class=\"type-valid\">\n {{ $t('config-editor.valid-label') }}\n </li>\n </ul>\n </p>\n <!-- Information notes -->\n <p v-if=\"saveSuccess !== undefined\"\n :class=\"`response-output status-${saveSuccess ? 'success' : 'fail'}`\">\n {{saveSuccess\n ? $t('config-editor.status-success-msg') : $t('config-editor.status-fail-msg') }}\n </p>\n <p v-if=\"!allowWriteToDisk\" class=\"no-permission-note\">\n {{ $t('config-editor.not-admin-note') }}\n </p>\n <p class=\"response-output\">{{ responseText }}</p>\n <p v-if=\"saveSuccess\" class=\"response-output\">\n {{ $t('config-editor.success-note-l1') }}\n {{ $t('config-editor.success-note-l2') }}\n </p>\n <p class=\"note\">{{ $t('config.backup-note') }}</p>\n </div>\n</template>\n\n<script>\n\nimport axios from 'axios';\nimport ProgressBar from 'rsup-progress';\nimport VJsoneditor from 'v-jsoneditor';\nimport jsYaml from 'js-yaml';\nimport ErrorHandler, { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';\nimport configSchema from '@/utils/ConfigSchema.json';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { localStorageKeys, serviceEndpoints, modalNames } from '@/utils/defaults';\nimport { isUserAdmin } from '@/utils/Auth';\nimport Button from '@/components/FormElements/Button';\nimport Radio from '@/components/FormElements/Radio';\n\nexport default {\n name: 'JsonEditor',\n components: {\n VJsoneditor,\n Button,\n Radio,\n },\n data() {\n return {\n jsonData: {},\n errorMessages: [],\n saveMode: '',\n options: {\n schema: configSchema,\n mode: 'tree',\n modes: ['tree', 'code', 'preview'],\n name: 'config',\n onValidationError: this.validationErrors,\n },\n responseText: '',\n saveSuccess: undefined,\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n saveOptions: [\n { label: this.$t('config-editor.location-disk-label'), value: 'file' },\n { label: this.$t('config-editor.location-local-label'), value: 'local' },\n ],\n };\n },\n computed: {\n config() {\n return this.$store.state.config;\n },\n isValid() {\n return this.errorMessages.length < 1;\n },\n allowWriteToDisk() {\n const { appConfig } = this.config;\n return appConfig.allowConfigEdit !== false && isUserAdmin();\n },\n initialSaveMode() {\n return this.allowWriteToDisk ? 'file' : 'local';\n },\n },\n mounted() {\n this.jsonData = this.config;\n if (!this.allowWriteToDisk) this.saveMode = 'local';\n },\n methods: {\n /* Calls appropriate save method, based on save-type radio selected */\n save() {\n if (this.saveMode === 'local' || !this.allowWriteToDisk) {\n this.saveConfigLocally();\n } else if (this.saveMode === 'file') {\n this.writeConfigToDisk();\n } else {\n this.$toasted.show(this.$t('config-editor.error-msg-save-mode'));\n }\n },\n /* Applies changes to the local state, begins edit mode and closes modal */\n startPreview() {\n InfoHandler('Applying changes to local state...', InfoKeys.RAW_EDITOR);\n const data = this.jsonData;\n this.$store.commit(StoreKeys.SET_APP_CONFIG, data.appConfig);\n this.$store.commit(StoreKeys.SET_PAGE_INFO, data.pageInfo);\n this.$store.commit(StoreKeys.SET_SECTIONS, data.sections);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n this.$modal.hide(modalNames.CONF_EDITOR);\n },\n /* Converts config to YAML, and writes it to disk */\n writeConfigToDisk() {\n // 1. Convert JSON into YAML\n const yaml = jsYaml.dump(this.config);\n // 2. Prepare the request\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}${serviceEndpoints.save}`;\n const headers = { 'Content-Type': 'text/plain' };\n const body = { config: yaml, timestamp: new Date() };\n const request = axios.post(endpoint, body, headers);\n // 3. Make the request, and handle response\n this.progress.start();\n request.then((response) => {\n this.saveSuccess = response.data.success || false;\n this.responseText = response.data.message;\n if (this.saveSuccess) {\n this.carefullyClearLocalStorage();\n this.showToast(this.$t('config-editor.success-msg-disk'), true);\n } else {\n this.showToast(this.$t('config-editor.error-msg-cannot-save'), false);\n }\n InfoHandler('Config has been written to disk succesfully', InfoKeys.RAW_EDITOR);\n this.$store.commit(StoreKeys.SET_CONFIG, this.jsonData);\n this.progress.end();\n })\n .catch((error) => {\n this.saveSuccess = false;\n this.responseText = error;\n this.showToast(error, false);\n ErrorHandler(`Failed to save config. ${error}`);\n this.progress.end();\n });\n },\n /* Saves config to local browser storage */\n saveConfigLocally() {\n const data = this.jsonData;\n if (data.sections) {\n localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(data.sections));\n }\n if (data.pageInfo) {\n localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(data.pageInfo));\n }\n if (data.appConfig) {\n data.appConfig.auth = this.config.appConfig.auth || {};\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(data.appConfig));\n }\n if (data.appConfig.theme) {\n localStorage.setItem(localStorageKeys.THEME, data.appConfig.theme);\n }\n InfoHandler('Config has succesfully been saved in browser storage', InfoKeys.RAW_EDITOR);\n this.showToast(this.$t('config-editor.success-msg-local'), true);\n },\n /* Clears config from browser storage, only removing relevant items */\n carefullyClearLocalStorage() {\n localStorage.removeItem(localStorageKeys.PAGE_INFO);\n localStorage.removeItem(localStorageKeys.APP_CONFIG);\n localStorage.removeItem(localStorageKeys.CONF_SECTIONS);\n },\n /* Convert error messages into readable format for UI */\n validationErrors(errors) {\n const errorMessages = [];\n errors.forEach((error) => {\n switch (error.type) {\n case 'validation':\n errorMessages.push({\n type: 'validation',\n msg: `${this.$t('config-editor.warning-msg-validation')}: `\n + `${error.error.keyword} ${error.error.message}`,\n });\n break;\n case 'error':\n errorMessages.push({\n type: 'parse',\n msg: error.message,\n });\n break;\n default:\n errorMessages.push({\n type: 'editor',\n msg: this.$t('config-editor.error-msg-bad-json'),\n });\n break;\n }\n });\n this.errorMessages = errorMessages;\n },\n /* Shows toast message */\n showToast(message, success) {\n this.$toasted.show(message, { className: `toast-${success ? 'success' : 'error'}` });\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\n.json-editor-outer {\n text-align: center;\n}\np.note {\n font-size: 0.8rem;\n color: var(--medium-grey);\n margin: 0.2rem;\n}\np.errors {\n text-align: left;\n margin: 0.5rem auto;\n width: 95%;\n ul {\n list-style: none;\n padding: 0;\n margin: 0;\n li {\n &.type-validation {\n color: var(--warning);\n &::before { content: \"⚠️\"; }\n }\n &.type-parse {\n color: var(--danger);\n &::before { content: \"❌\"; }\n }\n &.type-valid {\n color: var(--success);\n &::before { content: \"✅\"; }\n }\n }\n }\n}\np.response-output {\n font-size: 0.8rem;\n text-align: left;\n margin: 0.5rem auto;\n width: 95%;\n color: var(--config-settings-color);\n &.status-success {\n font-weight: bold;\n color: var(--success);\n }\n &.status-fail {\n font-weight: bold;\n color: var(--danger);\n }\n}\n\np.no-permission-note {\n color: var(--config-settings-color);\n}\n\n.btn-container {\n display: flex;\n align-items: center;\n justify-content: center;\n button {\n padding: 0.5rem 1rem;\n margin: 0.25rem;\n font-size: 1.2rem;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n &:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n border-color: var(--config-settings-background);\n }\n }\n &.err button {\n opacity: 0.8;\n cursor: default;\n &:hover {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-color: var(--danger);\n }\n }\n}\n\ndiv.save-options.radio-container {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n border-top: 2px solid var(--config-settings-background);\n background: var(--code-editor-background);\n label.radio-label {\n font-size: 1rem;\n flex-grow: revert;\n flex-basis: revert;\n color: var(--code-editor-color);\n padding-left: 1rem;\n }\n .radio-wrapper {\n margin: 0;\n font-size: 1rem;\n justify-content: space-around;\n background: var(--code-editor-background);\n color: var(--code-editor-color);\n .radio-option:hover:not(.wrap-disabled) {\n border: 1px solid var(--code-editor-color);\n }\n }\n}\n\n.jsoneditor-container.min-box {\n height: 58vh;\n}\n\n.jsoneditor, .jsoneditor-menu {\n border-color: var(--primary);\n}\n.jsoneditor {\n border-bottom: none;\n}\n\n.jsoneditor-menu, .pico-modal-header {\n background: var(--config-settings-background) !important;\n color: var(--config-settings-color) !important;\n}\n.jsoneditor-contextmenu .jsoneditor-menu li button {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n &.jsoneditor-selected, &.jsoneditor-selected:focus, &.jsoneditor-selected:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n }\n}\ndiv.jsoneditor-search div.jsoneditor-frame {\n border-radius: var(--curve-factor);\n}\n.jsoneditor-poweredBy {\n display: none;\n}\n.jsoneditor-tree, pre.jsoneditor-preview {\n background: var(--code-editor-background);\n text-align: left;\n}\n\n.jsoneditor-jmespath-label {\n color: var(--config-settings-color) !important;\n}\n.jsoneditor-jmespath-block.jsoneditor-modal-actions input {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n border: 1px solid var(--config-settings-background);\n border-radius: var(--curve-factor);\n &:hover {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-color: var(--config-settings-color);\n }\n}\ntextarea.jsoneditor-transform-preview, div.jsoneditor-jmespath-block textarea#query {\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./JsonEditor.vue?vue&type=template&id=ed982e82&\"\nimport script from \"./JsonEditor.vue?vue&type=script&lang=js&\"\nexport * from \"./JsonEditor.vue?vue&type=script&lang=js&\"\nimport style0 from \"./JsonEditor.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"css-editor-outer\"},[_c('div',{staticClass:\"style-section css-wrapper\"},[_c('h3',[_vm._v(\"Custom CSS\")]),_c('textarea',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.customCss),expression:\"customCss\"}],staticClass:\"css-editor\",domProps:{\"value\":(_vm.customCss)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.customCss=$event.target.value}}}),_vm._v(\" \"),_c('Button',{staticClass:\"save-button\",attrs:{\"click\":_vm.save}},[_vm._v(_vm._s(_vm.$t('config.css-save-btn')))]),_c('p',{staticClass:\"quick-note\"},[_c('b',[_vm._v(_vm._s(_vm.$t('config.css-note-label'))+\":\")]),_vm._v(\" \"+_vm._s(_vm.$t('config.css-note-l1'))+\" \"+_vm._s(_vm.$t('config.css-note-l2'))+\" \"+_vm._s(_vm.$t('config.css-note-l3'))+\" \")])],1),_c('div',{staticClass:\"style-section base-theme-wrapper\"},[_c('h3',[_vm._v(\"Base Theme\")]),_c('ThemeSelector',{attrs:{\"hidePallete\":true}})],1),_c('div',{staticClass:\"style-section\"},[_c('CustomThemeMaker',{staticClass:\"color-config\",attrs:{\"themeToEdit\":_vm.currentTheme}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"theme-configurator-wrapper \" + (_vm.showingAllVars ? 'showing-all' : ''))},[_c('h3',{staticClass:\"configurator-title\"},[_vm._v(_vm._s(_vm.$t('theme-maker.title')))]),_c('div',{staticClass:\"color-row-container\"},_vm._l((Object.keys(_vm.customColors)),function(colorName){return _c('div',{key:colorName,staticClass:\"color-row\"},[_c('label',{staticClass:\"color-name\",attrs:{\"for\":(\"color-input-\" + colorName)}},[_vm._v(\" \"+_vm._s(colorName.replaceAll('-', ' '))+\" \")]),(_vm.isColor(colorName, _vm.customColors[colorName]))?_c('v-swatches',{attrs:{\"show-fallback\":\"\",\"fallback-input-type\":\"color\",\"popover-x\":\"left\",\"swatches\":_vm.swatches},on:{\"input\":function($event){return _vm.setVariable(colorName, _vm.customColors[colorName])}},model:{value:(_vm.customColors[colorName]),callback:function ($$v) {_vm.$set(_vm.customColors, colorName, $$v)},expression:\"customColors[colorName]\"}},[_c('input',{staticClass:\"swatch-input form__input__element\",style:(_vm.makeSwatchStyles(colorName)),attrs:{\"slot\":\"trigger\",\"id\":(\"color-input-\" + colorName),\"readonly\":\"\"},domProps:{\"value\":_vm.customColors[colorName]},slot:\"trigger\"})]):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.customColors[colorName]),expression:\"customColors[colorName]\"}],class:(\"misc-input \" + (_vm.isTextual(colorName, _vm.customColors[colorName]) ? 'long-input' : '')),attrs:{\"id\":(\"color-input-\" + colorName)},domProps:{\"value\":(_vm.customColors[colorName])},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.$set(_vm.customColors, colorName, $event.target.value)},function($event){return _vm.setVariable(colorName, _vm.customColors[colorName])}]}})],1)}),0),_c('p',{staticClass:\"action-text-btn show-all-vars-btn\",on:{\"click\":_vm.showFontVariables}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.change-fonts-button'))+\" \")]),_c('p',{staticClass:\"action-text-btn show-all-vars-btn\",on:{\"click\":_vm.findAllVariableNames}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.show-all-button'))+\" \")]),_c('p',{staticClass:\"action-text-btn\",on:{\"click\":_vm.exportToClipboard}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.export-button'))+\" \")]),_c('p',{staticClass:\"action-text-btn\",on:{\"click\":_vm.resetAndSave}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.reset-button'))+\" '\"+_vm._s(_vm.themeToEdit)+\"' \")]),_c('div',{staticClass:\"action-buttons\"},[_c('Button',{attrs:{\"click\":_vm.saveChanges}},[_c('SaveIcon'),_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.save-button'))+\" \")],1),_c('Button',{attrs:{\"click\":_vm.resetUnsavedColors}},[_c('CancelIcon'),_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.cancel-button'))+\" \")],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`theme-configurator-wrapper ${showingAllVars ? 'showing-all' : ''}`\">\n <h3 class=\"configurator-title\">{{ $t('theme-maker.title') }}</h3>\n <div class=\"color-row-container\">\n <!-- Show color swatch input for each color -->\n <div class=\"color-row\" v-for=\"colorName in Object.keys(customColors)\" :key=\"colorName\">\n <label :for=\"`color-input-${colorName}`\" class=\"color-name\">\n {{colorName.replaceAll('-', ' ')}}\n </label>\n <v-swatches\n v-if=\"isColor(colorName, customColors[colorName])\"\n v-model=\"customColors[colorName]\"\n show-fallback\n fallback-input-type=\"color\"\n popover-x=\"left\"\n :swatches=\"swatches\"\n @input=\"setVariable(colorName, customColors[colorName])\"\n >\n <input\n :id=\"`color-input-${colorName}`\"\n slot=\"trigger\"\n :value=\"customColors[colorName]\"\n class=\"swatch-input form__input__element\"\n readonly\n :style=\"makeSwatchStyles(colorName)\"\n />\n </v-swatches>\n <input v-else\n :id=\"`color-input-${colorName}`\"\n v-model=\"customColors[colorName]\"\n :class=\"`misc-input ${isTextual(colorName, customColors[colorName]) ? 'long-input' : ''}`\"\n @input=\"setVariable(colorName, customColors[colorName])\"\n />\n </div> <!-- End of color list -->\n </div>\n <!-- More options: Export, Reset, Show all -->\n <p @click=\"showFontVariables\" class=\"action-text-btn show-all-vars-btn\">\n {{ $t('theme-maker.change-fonts-button') }}\n </p>\n <p @click=\"findAllVariableNames\" class=\"action-text-btn show-all-vars-btn\">\n {{ $t('theme-maker.show-all-button') }}\n </p>\n <p @click=\"exportToClipboard\" class=\"action-text-btn\">\n {{ $t('theme-maker.export-button') }}\n </p>\n <p @click=\"resetAndSave\" class=\"action-text-btn\">\n {{ $t('theme-maker.reset-button') }} '{{ themeToEdit }}'\n </p>\n <!-- Save and cancel buttons -->\n <div class=\"action-buttons\">\n <Button :click=\"saveChanges\">\n <SaveIcon /> {{ $t('theme-maker.save-button') }}\n </Button>\n <Button :click=\"resetUnsavedColors\">\n <CancelIcon /> {{ $t('theme-maker.cancel-button') }}\n </Button>\n </div>\n </div>\n</template>\n\n<script>\nimport VSwatches from 'vue-swatches';\nimport 'vue-swatches/dist/vue-swatches.css';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { localStorageKeys, mainCssVars, swatches } from '@/utils/defaults';\nimport Button from '@/components/FormElements/Button';\nimport SaveIcon from '@/assets/interface-icons/save-config.svg';\nimport CancelIcon from '@/assets/interface-icons/config-cancel.svg';\n\nexport default {\n name: 'ThemeMaker',\n components: {\n VSwatches,\n Button,\n SaveIcon,\n CancelIcon,\n },\n data() {\n return {\n customColors: this.makeInitialData(mainCssVars),\n showingAllVars: false,\n swatches,\n };\n },\n props: {\n themeToEdit: String,\n },\n methods: {\n /* Finds the current dominent value for a given CSS variable */\n getCssVariableValue(cssVar) {\n return getComputedStyle(document.documentElement).getPropertyValue(cssVar).trim() || 'inherit';\n },\n /* Sets the value to a given variable in the DOM */\n setVariable(variable, value) {\n document.documentElement.style.setProperty(`--${variable}`, value);\n },\n /* Updates browser storage, and srore with new color settings, and shows success msg */\n saveChanges() {\n const priorSettings = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}');\n priorSettings[this.themeToEdit] = this.customColors;\n localStorage.setItem(localStorageKeys.CUSTOM_COLORS, JSON.stringify(priorSettings));\n this.$store.commit(StoreKeys.SET_CUSTOM_COLORS, priorSettings);\n this.$toasted.show(this.$t('theme-maker.saved-toast', { theme: this.themeToEdit }));\n this.$emit('closeThemeConfigurator');\n },\n /* Itterates over available variables, removing them from the DOM */\n resetUnsavedColors() {\n const variables = Object.keys(this.customColors);\n variables.forEach((variable) => {\n document.documentElement.style.removeProperty(`--${variable}`);\n });\n this.customColors = this.makeInitialData(mainCssVars);\n this.$emit('closeThemeConfigurator');\n },\n /* Resets styles, and removes data for current theme from local storage */\n resetAndSave() {\n const priorSettings = JSON.parse(localStorage[localStorageKeys.CUSTOM_COLORS] || '{}');\n delete priorSettings[this.themeToEdit];\n localStorage.setItem(localStorageKeys.CUSTOM_COLORS, JSON.stringify(priorSettings));\n this.resetUnsavedColors();\n this.$toasted.show(this.$t('theme-maker.reset-toast', { theme: this.themeToEdit }));\n },\n /* Generates CSS for the currently applied variables, and copys to users clipboard */\n exportToClipboard() {\n const themeName = this.themeToEdit.replace(/^\\w/, c => c.toUpperCase());\n let clipboardText = `// Custom Colors for ${themeName}\\n`;\n Object.keys(this.customColors).forEach((customVar) => {\n clipboardText += (`--${customVar}: ${this.customColors[customVar]};\\n`);\n });\n navigator.clipboard.writeText(clipboardText);\n this.$toasted.show(this.$t('theme-maker.copied-toast', { theme: themeName }));\n },\n /* Returns a JSON object, with the variable name as key, and color as value */\n makeInitialData(variableArray) {\n const data = {};\n const hasDash = (colorVar) => (/^--/.exec(colorVar));\n const addDash = (colorVar) => (hasDash(colorVar) ? colorVar : `--${colorVar}`);\n const removeDash = (colorVar) => (hasDash(colorVar) ? colorVar.replace('--', '') : colorVar);\n variableArray.forEach((colorName) => {\n data[removeDash(colorName)] = this.getCssVariableValue(addDash(colorName));\n });\n return data;\n },\n /* Adds font variables to list */\n showFontVariables() {\n const currentVariables = this.customColors;\n const fonts = ['font-headings', 'font-body', 'font-monospace'];\n const fontVariables = this.makeInitialData(fonts);\n this.customColors = { ...currentVariables, ...fontVariables };\n },\n /* Find all available CSS variables for the current applied theme */\n findAllVariableNames() {\n const availableVariables = Array.from(document.styleSheets)\n .filter(sheet => sheet.href === null || sheet.href.startsWith(window.location.origin))\n .reduce(\n ((acc, sheet) => ([\n ...acc,\n ...Array.from(sheet.cssRules).reduce(\n (def, rule) => (rule.selectorText === ':root' || rule.selectorText === 'html'\n ? [...def, ...Array.from(rule.style).filter(name => name.startsWith('--'))] : def),\n [],\n ),\n ])),\n [],\n );\n this.customColors = this.makeInitialData(availableVariables);\n this.showingAllVars = true;\n },\n /* Returns a complmenting text color for the palete input foreground */\n /* White if the color is dark, otherwise black */\n getForegroundColor(colorHex) {\n /* Converts a 3-digit hex code to a 6-digit hex code (e.g. #f01 --> #ff0011) */\n const threeToSix = (hex) => {\n let digit = hex;\n digit = digit.split('').map((item) => (item === '#' ? item : item + item)).join('');\n return digit;\n };\n /* Converts hex code to RGB (e.g. #ff0011 --> rgb(255,0,0) ) */\n const hexToRgb = (hex) => {\n let hexCode = hex.slice(0, 7);\n if (hex.startsWith('#') && hex.length === 4) hexCode = threeToSix(hexCode);\n const colorParts = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hexCode);\n if (!colorParts || colorParts.length < 3) return 'black';\n const parse = (index) => parseInt(colorParts[index], 16);\n return colorParts ? { r: parse(1), g: parse(2), b: parse(3) } : null;\n };\n /* Given an RGB value, return the lightness ratio */\n const getLightness = (rgb) => (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n if (!colorHex.startsWith('#')) return 'white'; // Not a hex, do nothing\n // Convert hex to RGB obj, get lightness, and return opposing color\n return getLightness(hexToRgb(colorHex.trim())) < 100 ? 'white' : 'black';\n },\n /* The contents of the style attribute, to set background and text color of swatch */\n makeSwatchStyles(colorName) {\n const contrastingColor = this.getForegroundColor(this.customColors[colorName]);\n return `background:${this.customColors[colorName]};`\n + `color:${contrastingColor}; border: 1px solid ${contrastingColor}`;\n },\n /* Determines if a given variable should NOT use the color picker component */\n isColor(variableName, variableValue) {\n // If value is a dimension, then it aint a color\n if ((/rem|px|%/.exec(variableValue))) return false;\n const nonColorVariables = [ // Known non-color variables\n '--font-headings', '--font-body', '--font-monospace',\n '--curve-factor', '--curve-factor-navbar', '--curve-factor-small',\n '--dimming-factor', '--scroll-bar-width', '--header-height', '--footer-height',\n '--item-group-padding', '--item-shadow', '--item-hover-shadow:', '--item-icon-transform',\n '--item-icon-transform-hover', '--item-group-shadow', '--context-menu-shadow',\n '--settings-container-shadow', '--side-bar-width',\n ];\n // If the variable name is known to not be a color (in above list)\n if (nonColorVariables.includes(`--${variableName}`)) return false;\n return true; // It must be a color, we'll use the color picker\n },\n /* Determine if a given key is that of a known font variable, or has a long value */\n isTextual(varName, varValue) {\n return varName.startsWith('font-') || (varValue && varValue.length > 12);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\ndiv.theme-configurator-wrapper {\n position: absolute;\n top: 4rem;\n right: 1rem;\n width: 16rem;\n min-height: 12rem;\n max-height: 32rem;\n padding: 0.5rem;\n z-index: 5;\n overflow-y: visible;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-radius: var(--curve-factor);\n box-shadow: 0 8px 10px -2px rgba(0, 0, 0, 0.6), 1px 1px 6px var(--primary);\n\n h3.configurator-title {\n text-align: center;\n font-weight: normal;\n margin: 0.4rem;\n }\n\n div.color-row-container {\n max-height: 20rem;\n overflow-y: visible;\n @extend .scroll-bar;\n div.color-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.25rem 0;\n border-bottom: 1px dashed var(--primary);\n label.color-name {\n text-transform: capitalize;\n }\n }\n }\n\n input.swatch-input, input.misc-input {\n border: none;\n margin: 0.2rem;\n padding: 0.5rem;\n width: 4rem;\n border-radius: var(--curve-factor);\n font-family: var(--font-monospace);\n color: var(--black);\n font-weight: bold;\n cursor: pointer;\n &:hover {\n box-shadow: inset 0 0 4px 4px #00000033;\n }\n &:active {\n box-shadow: inset 0 0 4px 4px #00000080;\n outline: none;\n }\n &.long-input {\n cursor: text;\n font-style: italic;\n font-weight: 200;\n padding: 0.5rem 0.2rem;\n font-size: 0.75rem;\n width: 9rem;\n &:hover { box-shadow: none; }\n }\n }\n}\n\np.action-text-btn {\n cursor: pointer;\n margin: 0.5rem auto 0;\n padding: 0.2rem 0.4rem;\n width: fit-content;\n text-align: center;\n text-decoration: underline;\n border-radius: var(--curve-factor);\n border: 1px solid var(--background-darker);\n &:hover {\n background: var(--background);\n border-color: var(--primary);\n text-decoration: none;\n }\n &:active {\n background: var(--primary);\n color: var(--background);\n }\n &.hide {\n display: none;\n }\n}\n\ndiv.action-buttons {\n display: flex;\n justify-content: center;\n button {\n min-width: 6rem;\n padding: 0.25rem 0.5rem;\n margin: 1rem 0.5rem 0.5rem;\n }\n}\n\ndiv.theme-configurator-wrapper.showing-all {\n overflow: auto;\n div.color-row-container {\n overflow: auto;\n }\n p.show-all-vars-btn {\n display: none;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomThemeMaker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomThemeMaker.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CustomThemeMaker.vue?vue&type=template&id=67a8b583&\"\nimport script from \"./CustomThemeMaker.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomThemeMaker.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomThemeMaker.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeThemeConfigurator),expression:\"closeThemeConfigurator\"}],staticClass:\"theme-selector-section\"},[_c('div',[_c('span',{staticClass:\"theme-label\"},[_vm._v(_vm._s(_vm.$t('settings.theme-label')))]),_c('v-select',{staticClass:\"theme-dropdown\",attrs:{\"options\":_vm.themeNames,\"value\":_vm.$store.getters.theme,\"tabindex\":-2},on:{\"input\":_vm.themeChanged},model:{value:(_vm.selectedTheme),callback:function ($$v) {_vm.selectedTheme=$$v},expression:\"selectedTheme\"}})],1),(!_vm.hidePallete)?_c('IconPalette',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.$t('theme-maker.title')),expression:\"$t('theme-maker.title')\"}],staticClass:\"color-button\",on:{\"click\":_vm.openThemeConfigurator}}):_vm._e(),(_vm.themeConfiguratorOpen)?_c('CustomThemeMaker',{attrs:{\"themeToEdit\":_vm.selectedTheme},on:{\"closeThemeConfigurator\":function($event){return _vm.closeThemeConfigurator()}}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import ErrorHandler from '@/utils/ErrorHandler';\nimport { getTheme, getCustomColors } from '@/utils/ConfigHelpers';\nimport { mainCssVars } from '@/utils/defaults';\n\n/* Returns users current theme */\nexport const GetTheme = () => getTheme();\n\n/* Gets user custom color preferences for current theme, and applies to DOM */\nexport const ApplyCustomVariables = (theme) => {\n mainCssVars.forEach((vName) => { document.documentElement.style.removeProperty(`--${vName}`); });\n const themeColors = getCustomColors()[theme];\n if (themeColors) {\n Object.keys(themeColors).forEach((customVar) => {\n document.documentElement.style.setProperty(`--${customVar}`, themeColors[customVar]);\n });\n }\n};\n\n/* Sets the theme, by updating data-theme attribute on the html tag */\nexport const ApplyLocalTheme = (newTheme) => {\n const htmlTag = document.getElementsByTagName('html')[0];\n if (htmlTag.hasAttribute('data-theme')) htmlTag.removeAttribute('data-theme');\n htmlTag.setAttribute('data-theme', newTheme);\n};\n\n/**\n * A function for pre-loading, and easy switching of external stylesheets\n * External CSS is preloaded to avoid FOUC\n */\nexport const LoadExternalTheme = function th() {\n /* Preload selected external theme */\n const preloadTheme = (href) => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n document.head.appendChild(link);\n return new Promise((resolve, reject) => {\n link.onload = e => {\n const { sheet } = e.target;\n sheet.disabled = true;\n resolve(sheet);\n };\n link.onerror = reject;\n });\n };\n\n /* Check theme is selected, and it exists */\n const checkTheme = (themes, name) => {\n if ((!name) || (name !== 'custom' && !themes[name])) {\n ErrorHandler(`Theme: '${name || '[not selected]'}' does not exist.`);\n return false;\n }\n return true;\n };\n\n /* Disable all but selected theme */\n const selectTheme = (themes, name) => {\n if (checkTheme(themes, name)) {\n const t = themes; // To avoid ESLint complaining about mutating a param\n Object.keys(themes).forEach(n => { t[n].disabled = (n !== name); });\n }\n };\n\n const themes = {};\n\n return {\n add(name, href) { return preloadTheme(href).then(s => { themes[name] = s; }); },\n set theme(name) { selectTheme(themes, name); },\n get theme() { return Object.keys(themes).find(n => !themes[n].disabled); },\n };\n};\n","<template>\n <div class=\"theme-selector-section\" v-click-outside=\"closeThemeConfigurator\">\n <div>\n <span class=\"theme-label\">{{ $t('settings.theme-label') }}</span>\n <v-select\n :options=\"themeNames\"\n v-model=\"selectedTheme\"\n :value=\"$store.getters.theme\"\n class=\"theme-dropdown\"\n :tabindex=\"-2\"\n @input=\"themeChanged\"\n />\n </div>\n <IconPalette\n v-if=\"!hidePallete\"\n class=\"color-button\"\n @click=\"openThemeConfigurator\"\n v-tooltip=\"$t('theme-maker.title')\"\n />\n <CustomThemeMaker\n v-if=\"themeConfiguratorOpen\"\n :themeToEdit=\"selectedTheme\"\n @closeThemeConfigurator=\"closeThemeConfigurator()\"\n />\n </div>\n</template>\n\n<script>\n\nimport CustomThemeMaker from '@/components/Settings/CustomThemeMaker';\nimport {\n LoadExternalTheme,\n ApplyLocalTheme,\n ApplyCustomVariables,\n} from '@/utils/ThemeHelper';\nimport Defaults, { localStorageKeys } from '@/utils/defaults';\nimport Keys from '@/utils/StoreMutations';\nimport IconPalette from '@/assets/interface-icons/config-color-palette.svg';\n\nexport default {\n name: 'ThemeSelector',\n props: {\n hidePallete: Boolean,\n },\n components: {\n CustomThemeMaker,\n IconPalette,\n },\n watch: {\n /* When theme in VueX store changes, then update theme */\n themeFromStore(newTheme) {\n this.selectedTheme = newTheme;\n this.updateTheme(newTheme);\n },\n },\n data() {\n return {\n selectedTheme: '',\n themeConfiguratorOpen: false, // Control the opening of theme config popup\n themeHelper: new LoadExternalTheme(),\n ApplyLocalTheme,\n ApplyCustomVariables,\n };\n },\n computed: {\n /* Get appConfig from store */\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* Get users theme from store */\n themeFromStore() {\n return this.$store.getters.theme;\n },\n /* Combines all theme names (builtin and user defined) together */\n themeNames: function themeNames() {\n const externalThemeNames = Object.keys(this.externalThemes);\n const specialThemes = ['custom'];\n return [...externalThemeNames, ...Defaults.builtInThemes, ...specialThemes];\n },\n extraThemeNames() {\n const userThemes = this.appConfig.cssThemes || [];\n if (typeof userThemes === 'string') return [userThemes];\n return userThemes;\n },\n /* Returns an array of links to external CSS from the Config */\n externalThemes() {\n const availibleThemes = {};\n if (this.appConfig) {\n if (this.appConfig.externalStyleSheet) {\n const externals = this.appConfig.externalStyleSheet;\n if (Array.isArray(externals)) {\n externals.forEach((ext, i) => {\n availibleThemes[`External Stylesheet ${i + 1}`] = ext;\n });\n } else {\n availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;\n }\n }\n }\n availibleThemes.Default = '#';\n return availibleThemes;\n },\n },\n mounted() {\n const initialTheme = this.getInitialTheme();\n this.selectedTheme = initialTheme;\n // Pass all user custom stylesheets to the themehelper\n const added = Object.keys(this.externalThemes).map(\n name => this.themeHelper.add(name, this.externalThemes[name]),\n );\n // Quicker loading, if the theme is local we can apply it immidiatley\n if (this.isThemeLocal(initialTheme)) {\n this.updateTheme(initialTheme);\n // If it's an external stylesheet, then wait for promise to resolve\n } else if (initialTheme !== Defaults.theme) {\n Promise.all(added).then(() => {\n this.updateTheme(initialTheme);\n });\n }\n },\n methods: {\n /* Called when dropdown changed\n * Updates store, which will in turn update theme through watcher\n */\n themeChanged() {\n this.$store.commit(Keys.SET_THEME, this.selectedTheme);\n },\n /* Returns the initial theme */\n getInitialTheme() {\n const localTheme = localStorage[localStorageKeys.THEME];\n if (localTheme && localTheme !== 'undefined') return localTheme;\n return this.appConfig.theme || Defaults.theme;\n },\n /* Determines if a given theme is local / not a custom user stylesheet */\n isThemeLocal(themeToCheck) {\n const localThemes = [...Defaults.builtInThemes, ...this.extraThemeNames];\n return localThemes.includes(themeToCheck);\n },\n /* Opens the theme color configurator popup */\n openThemeConfigurator() {\n this.$store.commit(Keys.SET_MODAL_OPEN, true);\n this.themeConfiguratorOpen = true;\n },\n /* Closes the theme color configurator popup */\n closeThemeConfigurator() {\n if (this.themeConfiguratorOpen) {\n this.$store.commit(Keys.SET_MODAL_OPEN, false);\n this.themeConfiguratorOpen = false;\n }\n },\n /* Updates theme. Checks if the new theme is local or external,\n and calls appropirate updating function. Updates local storage */\n updateTheme(newTheme) {\n if (newTheme === 'Default') {\n this.resetToDefault();\n this.themeHelper.theme = 'Default';\n } else if (this.isThemeLocal(newTheme)) {\n this.ApplyLocalTheme(newTheme);\n } else {\n this.themeHelper.theme = newTheme;\n }\n this.ApplyCustomVariables(newTheme);\n localStorage.setItem(localStorageKeys.THEME, newTheme);\n },\n /* Removes any applied themes */\n resetToDefault() {\n document.getElementsByTagName('html')[0].removeAttribute('data-theme');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n@import 'vue-select/src/scss/vue-select.scss';\n@import '@/styles/style-helpers.scss';\n\n.theme-dropdown {\n div.vs__dropdown-toggle {\n border-color: var(--settings-text-color);\n border-radius: var(--curve-factor);\n min-width: 8rem;\n max-width: 16rem;\n height: 1.8rem;\n font-size: 0.85rem;\n cursor: pointer;\n }\n span.vs__selected, li.vs__dropdown-option {\n color: var(--settings-text-color);\n text-transform: capitalize;\n }\n svg.vs__open-indicator {\n fill: var(--settings-text-color);\n }\n ul.vs__dropdown-menu {\n width: auto;\n z-index: 12;\n max-width: 13rem;\n overflow-x: hidden;\n @extend .scroll-bar;\n background: var(--background);\n border-radius: var(--curve-factor);\n border-top: 1px solid var(--settings-text-color);\n }\n li.vs__dropdown-option--highlight {\n background: var(--settings-text-color);\n color: var(--background);\n }\n button.vs__clear {\n display: none;\n }\n}\n\n.theme-selector-section {\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n justify-content: center;\n height: 100%;\n span.theme-label {\n font-size: 1rem;\n color: var(--settings-text-color);\n margin: 1px 0 2px 0;\n }\n}\n\nsvg.color-button {\n path {\n fill: var(--settings-text-color);\n }\n width: 1rem;\n height: 1rem;\n padding: 0.2rem;\n margin: 0.5rem;\n align-self: flex-end;\n text-align: center;\n background: var(--background);\n border: 1px solid var(--settings-text-color);;\n border-radius: var(--curve-factor);\n cursor: pointer;\n &:hover, &.selected {\n background: var(--settings-text-color);\n path { fill: var(--background); }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ThemeSelector.vue?vue&type=template&id=2562c2e8&\"\nimport script from \"./ThemeSelector.vue?vue&type=script&lang=js&\"\nexport * from \"./ThemeSelector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ThemeSelector.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"css-editor-outer\">\n <!-- Add raw custom CSS -->\n <div class=\"style-section css-wrapper\">\n <h3>Custom CSS</h3>\n <textarea class=\"css-editor\" v-model=\"customCss\" />\n <Button class=\"save-button\" :click=\"save\">{{ $t('config.css-save-btn') }}</Button>\n <p class=\"quick-note\">\n <b>{{ $t('config.css-note-label') }}:</b>\n {{ $t('config.css-note-l1') }} {{ $t('config.css-note-l2') }} {{ $t('config.css-note-l3') }}\n </p>\n </div>\n <!-- Theme Selector -->\n <div class=\"style-section base-theme-wrapper\">\n <h3>Base Theme</h3>\n <ThemeSelector :hidePallete=\"true\" />\n </div>\n <!-- UI color configurator -->\n <div class=\"style-section\">\n <CustomThemeMaker :themeToEdit=\"currentTheme\" class=\"color-config\" />\n </div>\n </div>\n</template>\n\n<script>\n\nimport CustomThemeMaker from '@/components/Settings/CustomThemeMaker';\nimport ThemeSelector from '@/components/Settings/ThemeSelector';\nimport Button from '@/components/FormElements/Button';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { localStorageKeys, theme as defaultTheme } from '@/utils/defaults';\n\nexport default {\n name: 'StyleEditor',\n components: {\n Button,\n ThemeSelector,\n CustomThemeMaker,\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n currentTheme() {\n return this.appConfig.theme || defaultTheme;\n },\n },\n data() {\n return {\n customCss: '',\n };\n },\n mounted() {\n // Get existing custom styles (if present) from appConfig\n this.customCss = this.appConfig.customCss || '\\n\\n';\n },\n methods: {\n /* Sanitizes input, saves to browser and store, applies to page and shows message */\n save() {\n const css = this.customCss.replace(/<\\/?[^>]+(>|$)/g, '');\n this.$store.commit(StoreKeys.UPDATE_CUSTOM_CSS, css);\n this.saveToBrowser(css);\n this.injectToPage(css);\n this.showSuccessMsg();\n if (css === '') this.reloadPage();\n },\n /* Formats CSS, and applies it to page */\n injectToPage(userStyles) {\n const cleanedCss = userStyles.replace(/<\\/?[^>]+(>|$)/g, '');\n const style = document.createElement('style');\n style.textContent = cleanedCss;\n document.head.append(style);\n },\n /* Saves custom CSS local storage */\n saveToBrowser(css) {\n const localAppConfig = JSON.parse(localStorage.getItem(localStorageKeys.APP_CONFIG) || '{}');\n localAppConfig.customCss = css;\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(localAppConfig));\n },\n /* Reload the page (only called if removing styles) */\n reloadPage() {\n setTimeout(() => { location.reload(); }, 1500); // eslint-disable-line no-restricted-globals\n },\n /* Show success toast and lot update */\n showSuccessMsg() {\n this.$toasted.show('Changes saved successfully');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n// Main layout\ndiv.css-editor-outer {\n text-align: center;\n padding-bottom: 1rem;\n display: flex;\n flex-direction: column;\n\n .style-section {\n padding: 1rem;\n &:not(:last-child) { border-bottom: 1px dashed var(--config-settings-color); }\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem 0 0.2rem;\n }\n }\n\n div.css-wrapper {\n display: flex;\n flex-direction: column;\n }\n}\n\n// Save button\nbutton.save-button {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n &:hover:not(:disabled) {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n }\n}\n\n// CSS textarea input\n.css-editor {\n margin: 1rem auto;\n padding: 0.5rem;\n width: 80%;\n height: 8rem;\n max-height: 16rem;\n min-height: 4rem;\n resize: vertical;\n outline: none;\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n background: var(--transparent-50);\n color: var(--config-settings-color);\n &:focus {\n box-shadow: 0 40px 70px -2px rgba(0, 0, 0, 0.6), 1px 1px 6px var(--config-settings-color);\n }\n}\n\n// Info note\np.quick-note {\n text-align: left;\n width: 80%;\n margin: 1rem auto;\n padding: 0.5rem;\n font-size: 0.9rem;\n opacity: var(--dimming-factor);\n border-radius: var(--curve-factor);\n}\n\n// Base Theme Selector\n.base-theme-wrapper {\n span.theme-label {\n display: none;\n }\n div.vs__dropdown-toggle {\n border-color: var(--config-settings-color);\n min-width: 16rem;\n max-width: 32rem;\n height: 2.4rem;\n font-size: 1rem;\n margin: 0.5rem;\n }\n ul.vs__dropdown-menu {\n min-width: 16rem;\n max-width: 32rem;\n background: var(--config-settings-background);\n border-top: 1px solid var(--config-settings-color);\n }\n li.vs__dropdown-option--highlight {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n }\n}\n\n// Theme editor\n.color-config.theme-configurator-wrapper {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n position: relative;\n width: 80%;\n max-width: 32rem;\n margin: 1rem auto;\n box-shadow: none;\n right: 0;\n top: 0;\n max-height: unset;\n .color-row-container {\n text-align: left;\n max-height: unset;\n }\n .misc-input {\n width: 6rem;\n }\n .misc-input.long-input {\n width: 18rem;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomCss.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomCss.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CustomCss.vue?vue&type=template&id=89206b6e&\"\nimport script from \"./CustomCss.vue?vue&type=script&lang=js&\"\nexport * from \"./CustomCss.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CustomCss.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"cloud-backup-restore-wrapper\"},[_c('div',{staticClass:\"section intro\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('cloud-sync.title')))]),_c('p',{staticClass:\"intro\"},[_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.intro-l1'))+\" \"),_c('br'),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.intro-l2'))+\" \"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.intro-l3'))+\" \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/docs/backup-restore.md\"}},[_vm._v(\"docs\")])])]),_c('div',{staticClass:\"section backup-section\"},[(_vm.backupId)?_c('h3',[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-title-setup')))]):_c('h3',[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-title-setup')))]),_c('Input',{attrs:{\"name\":\"backup-password\",\"label\":_vm.backupId\n ? _vm.$t('cloud-sync.password-label-update') : _vm.$t('cloud-sync.password-label-setup'),\"layout\":\"vertical\",\"type\":\"password\"},model:{value:(_vm.backupPassword),callback:function ($$v) {_vm.backupPassword=$$v},expression:\"backupPassword\"}}),_c('Button',{attrs:{\"click\":_vm.checkPass}},[_vm._v(\" \"+_vm._s(_vm.backupId ? _vm.$t('cloud-sync.backup-button-update') : _vm.$t('cloud-sync.backup-button-setup'))+\" \"),_c('IconBackup')],1),(_vm.backupId)?_c('div',{staticClass:\"results-view\"},[_c('span',{staticClass:\"backup-id-label\"},[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-id-label'))+\": \")]),_c('pre',{staticClass:\"backup-id-value\"},[_vm._v(_vm._s(_vm.backupId))]),_c('span',{staticClass:\"backup-id-note\"},[_vm._v(_vm._s(_vm.$t('cloud-sync.backup-id-note')))])]):_vm._e()],1),_c('div',{staticClass:\"section restore-section\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('cloud-sync.restore-title')))]),_c('Input',{attrs:{\"name\":\"restore-code\",\"label\":_vm.$t('cloud-sync.restore-id-label')},model:{value:(_vm.restoreCode),callback:function ($$v) {_vm.restoreCode=$$v},expression:\"restoreCode\"}}),_c('Input',{attrs:{\"name\":\"restore-password\",\"label\":_vm.$t('cloud-sync.restore-password-label'),\"type\":\"password\"},model:{value:(_vm.restorePassword),callback:function ($$v) {_vm.restorePassword=$$v},expression:\"restorePassword\"}}),_c('Button',{attrs:{\"click\":_vm.restoreBackup}},[_vm._v(\" \"+_vm._s(_vm.$t('cloud-sync.restore-button'))+\" \"),_c('IconRestore')],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"input-container \" + _vm.layout)},[(_vm.label)?_c('label',{staticClass:\"input-label\",attrs:{\"for\":\"name\"}},[_vm._v(\" \"+_vm._s(_vm.label)+\" \")]):_vm._e(),_c('input',{staticClass:\"input-field\",attrs:{\"type\":_vm.type,\"name\":_vm.name,\"id\":_vm.name,\"placeholder\":_vm.placeholder},domProps:{\"value\":_vm.value},on:{\"input\":function($event){return _vm.updateValue($event.target.value)}}}),(_vm.description)?_c('p',{staticClass:\"input-description\"},[_vm._v(\" \"+_vm._s(_vm.description)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`input-container ${layout}`\">\n <label\n v-if=\"label\"\n for=\"name\"\n class=\"input-label\"\n >\n {{label}}\n </label>\n <input\n :type=\"type\"\n :value=\"value\"\n v-on:input=\"updateValue($event.target.value)\"\n :name=\"name\"\n :id=\"name\"\n :placeholder=\"placeholder\"\n class=\"input-field\"\n />\n <p\n v-if=\"description\"\n class=\"input-description\"\n >\n {{ description }}\n </p>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Input',\n props: {\n value: [String, Number], // The value bound to v-model\n label: String, // An optional label to display above\n name: String, // Required unique ID value, for accessibility\n placeholder: String, // Optional placeholder value\n description: String, // Optional info paragraph\n type: {\n default: 'text', // Input type, e.g. text, password, number\n type: String,\n },\n layout: { // Layout alignment direction, either horizonal or verical\n validator: (value) => ['horizontal', 'vertical'].indexOf(value) !== -1,\n type: String,\n default: 'vertical',\n },\n },\n methods: {\n updateValue(value) {\n this.$emit('input', value);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\ndiv.input-container {\n margin: 0.25rem auto;\n display: flex;\n align-items: baseline;\n &.vertical {\n flex-direction: column;\n }\n &.horizontal {\n @include tablet-up {\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n label.input-label,\n input.input-field,\n p.input-description {\n margin: 0.25rem;\n flex-basis: 8rem;\n flex-grow: 1;\n }\n input.input-field { flex-grow: 2; }\n p.input-description { flex-grow: 3; }\n }\n }\n\n input.input-field {\n min-width: 10rem;\n padding: 0.5rem 0.75rem;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n box-sizing: border-box;\n color: var(--primary);\n background: var(--background);;\n border: 1px solid var(--primary);\n border-radius: var(--curve-factor);\n &:focus {\n box-shadow: 1px 1px 6px var(--config-settings-color);\n outline: none;\n }\n }\n\n label.input-label {\n text-transform: capitalize;\n }\n\n p.input-description {\n opacity: var(--dimming-factor);\n }\n\n @include tablet-down {\n flex-direction: column;\n align-items: start;\n input.input-field {\n margin: 0.5rem;\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Input.vue?vue&type=template&id=dd5e343e&scoped=true&\"\nimport script from \"./Input.vue?vue&type=script&lang=js&\"\nexport * from \"./Input.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Input.vue?vue&type=style&index=0&id=dd5e343e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"dd5e343e\",\n null\n \n)\n\nexport default component.exports","import sha256 from 'crypto-js/sha256';\nimport aes from 'crypto-js/aes';\nimport Utf8 from 'crypto-js/enc-utf8';\nimport axios from 'axios';\nimport { backupEndpoint } from '@/utils/defaults';\n\nconst ENDPOINT = backupEndpoint; // 'https://dashy-sync-service.as93.net';\n\n/* Stringify, encrypt and encode data for transmission */\nconst encryptData = (data, password) => {\n const stringifiedData = JSON.stringify(data);\n const encryptedData = aes.encrypt(stringifiedData, password);\n return encryptedData.toString();\n};\n\n/* Decrypt, decode and parse received data */\nconst decryptData = (data, password) => aes.decrypt(data, password).toString(Utf8);\n\n/* Returns a splice of the hash of the users password */\nconst makeSubHash = (pass) => sha256(pass).toString().slice(0, 14);\n\n/* Makes the backup */\nexport const backup = (data, password) => axios.post(ENDPOINT, {\n userData: encryptData(data, password),\n subHash: makeSubHash(password),\n});\n\n/* Updates and existing backup */\nexport const update = (data, password, backupId) => axios.put(ENDPOINT, {\n backupId,\n userData: encryptData(data, password),\n subHash: makeSubHash(password),\n});\n\nconst encodeGetParams = p => Object.entries(p).map(kv => kv.map(encodeURIComponent).join('=')).join('&');\n\n/* Restores the backup */\nexport const restore = (backupId, password) => {\n const params = encodeGetParams({ backupId, subHash: makeSubHash(password) });\n const url = `${ENDPOINT}/?${params}`;\n return new Promise((resolve, reject) => {\n axios.get(url).then((response) => {\n if (!response.data || response.data.errorMsg) {\n reject(response.data.errorMsg || 'Error');\n } else {\n const decryptedData = decryptData(response.data.userData.userData, password);\n try { resolve(JSON.parse(decryptedData)); } catch (e) { reject(e); }\n }\n });\n });\n};\n","<template>\n <div class=\"cloud-backup-restore-wrapper\">\n <!-- Intro text -->\n <div class=\"section intro\">\n <h2>{{ $t('cloud-sync.title') }}</h2>\n <p class=\"intro\">\n {{ $t('cloud-sync.intro-l1') }}\n <br><br>\n {{ $t('cloud-sync.intro-l2') }}\n <br>\n {{ $t('cloud-sync.intro-l3') }}\n <a href=\"https://github.com/Lissy93/dashy/blob/master/docs/backup-restore.md\">docs</a>\n </p>\n </div>\n <!-- Create or update a backup form -->\n <div class=\"section backup-section\">\n <h3 v-if=\"backupId\">{{ $t('cloud-sync.backup-title-setup') }}</h3>\n <h3 v-else>{{ $t('cloud-sync.backup-title-setup') }}</h3>\n <Input\n v-model=\"backupPassword\"\n name=\"backup-password\"\n :label=\"backupId\n ? $t('cloud-sync.password-label-update') : $t('cloud-sync.password-label-setup')\"\n layout=\"vertical\"\n type=\"password\"\n />\n <Button :click=\"checkPass\">\n {{backupId\n ? $t('cloud-sync.backup-button-update') : $t('cloud-sync.backup-button-setup')}}\n <IconBackup />\n </Button>\n <div class=\"results-view\" v-if=\"backupId\">\n <span class=\"backup-id-label\">{{ $t('cloud-sync.backup-id-label') }}: </span>\n <pre class=\"backup-id-value\">{{ backupId }}</pre>\n <span class=\"backup-id-note\">{{ $t('cloud-sync.backup-id-note') }}</span>\n </div>\n </div>\n <!-- Restore from backup form -->\n <div class=\"section restore-section\">\n <h3>{{ $t('cloud-sync.restore-title') }}</h3>\n <Input\n v-model=\"restoreCode\"\n name=\"restore-code\"\n :label=\"$t('cloud-sync.restore-id-label')\"\n />\n <Input\n v-model=\"restorePassword\"\n name=\"restore-password\"\n :label=\"$t('cloud-sync.restore-password-label')\"\n type=\"password\"\n />\n <Button :click=\"restoreBackup\">\n {{ $t('cloud-sync.restore-button') }}\n <IconRestore />\n </Button>\n </div>\n </div>\n</template>\n\n<script>\n// Import libraries\nimport sha256 from 'crypto-js/sha256';\nimport ProgressBar from 'rsup-progress';\n// Import form elements\nimport Button from '@/components/FormElements/Button';\nimport Input from '@/components/FormElements/Input';\n// Import utils and constants\nimport StoreKeys from '@/utils/StoreMutations';\nimport { backup, update, restore } from '@/utils/CloudBackup';\nimport { localStorageKeys } from '@/utils/defaults';\nimport { InfoHandler, WarningInfoHandler, InfoKeys } from '@/utils/ErrorHandler';\n// Import Icons\nimport IconBackup from '@/assets/interface-icons/config-backup.svg';\nimport IconRestore from '@/assets/interface-icons/config-restore.svg';\n\nexport default {\n name: 'CloudBackupRestore',\n computed: {\n config() { // Users config from store\n return this.$store.state.config;\n },\n },\n data() {\n return { // Store current form data (temp)\n backupPassword: '',\n restorePassword: '',\n restoreCode: '',\n backupId: localStorage[localStorageKeys.BACKUP_ID] || '',\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n };\n },\n components: { // UI components / icons\n Button,\n Input,\n IconBackup,\n IconRestore,\n },\n methods: {\n /* Make request to server-side, then either show error, or proceed to restore */\n restoreBackup() {\n this.progress.start();\n restore(this.restoreCode, this.restorePassword)\n .then((response) => {\n this.applyRestoredData(response, this.restoreCode);\n this.progress.end();\n }).catch((msg) => {\n this.showErrorMsg(msg);\n this.progress.end();\n });\n },\n /* Send request to backup server, to upload a new backup */\n makeBackup() {\n this.progress.start();\n backup(this.config, this.backupPassword)\n .then((response) => {\n if (!response.data || response.data.errorMsg || !response.data.backupId) {\n this.showErrorMsg(response.data.errorMsg || 'Error');\n } else { // All clear, no error\n this.updateUiAfterBackup(response.data.backupId, false);\n }\n this.progress.end();\n }).catch(() => {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-unknown'));\n this.progress.end();\n });\n },\n /* Send request to backup server, to update an existing backup */\n makeUpdate() {\n this.progress.start();\n update(this.config, this.backupPassword, this.backupId)\n .then((response) => {\n if (!response.data || response.data.errorMsg || !response.data.backupId) {\n this.showErrorMsg(response.data.errorMsg || 'Error');\n } else { // All clear, no error\n this.updateUiAfterBackup(response.data.backupId, true);\n }\n this.progress.end();\n }).catch(() => {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-unknown'));\n this.progress.end();\n });\n },\n /* For create / update a backup- checks pass is valid, then calls makeBackup */\n checkPass() {\n const savedHash = localStorage[localStorageKeys.BACKUP_HASH] || undefined;\n if (!this.backupPassword) {\n this.showErrorMsg(this.$t('cloud-sync.backup-missing-password'));\n } else if (!savedHash) {\n this.makeBackup();\n } else if (savedHash === this.makeHash(this.backupPassword)) {\n this.makeUpdate();\n } else {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-password'));\n }\n },\n /* When restored data is revieved, then save to local storage, and apply it in state */\n applyRestoredData(config, backupId) {\n // Store restored data in local storage\n localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(config.sections));\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(config.appConfig));\n localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(config.pageInfo));\n if (config.appConfig.theme) {\n localStorage.setItem(localStorageKeys.THEME, config.appConfig.theme);\n }\n // Save hashed token in local storage\n this.setBackupIdLocally(backupId, this.restorePassword);\n // Update the current state\n this.$store.commit(StoreKeys.SET_CONFIG, config);\n // Show success message\n this.showSuccessMsg(this.$t('cloud-sync.restore-success-msg'));\n },\n /* After backup/ update is made, then replace 'Make Backup' with 'Update Backup' */\n updateUiAfterBackup(backupId, isUpdate = false) {\n this.setBackupIdLocally(backupId, this.backupPassword);\n this.showSuccessMsg(\n `${isUpdate ? 'Update' : 'Backup'} ${this.$t('cloud-sync.backup-success-msg')}`,\n );\n this.backupPassword = '';\n },\n /* If the server returns a warning, then show to user and log it */\n showErrorMsg(errorMsg) {\n WarningInfoHandler(errorMsg, InfoKeys.CLOUD_BACKUP);\n this.$toasted.show(errorMsg, { className: 'toast-error' });\n },\n /* When server returns success message, then show to user and log it */\n showSuccessMsg(msg) {\n InfoHandler(msg, InfoKeys.CLOUD_BACKUP);\n this.$toasted.show(msg, { className: 'toast-success' });\n },\n /* Call to hash function, to hash the users chosen/ entered password */\n makeHash(pass) {\n return sha256(pass).toString();\n },\n /* After backup is applied, hash the backup ID, and save in browser storage */\n setBackupIdLocally(backupId, pass) {\n this.backupId = backupId;\n const hash = this.makeHash(pass);\n localStorage.setItem(localStorageKeys.BACKUP_ID, backupId);\n localStorage.setItem(localStorageKeys.BACKUP_HASH, hash);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n @import '@/styles/style-helpers.scss';\n div.cloud-backup-restore-wrapper {\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n text-align: center;\n overflow: auto;\n height: 100%;\n color: var(--cloud-backup-color);\n background: var(--cloud-backup-background);\n @extend .scroll-bar;\n\n /* Text styling */\n h2, h3 { font-size: 1.6rem; }\n p.intro {\n text-align: left;\n font-size: 1rem;\n margin: 0.25rem;\n padding: 0.25rem;\n }\n\n /* Main sections */\n .section {\n display: flex;\n flex-direction: column;\n width: fit-content;\n margin: 0 auto 1rem auto;\n padding: 0 0.5rem 1rem 0.5rem;\n }\n /* Intro section */\n .section.intro {\n width: 100%;\n height: fit-content;\n border-bottom: 1px dashed var(--cloud-backup-color);\n a { color: var(--cloud-backup-color); }\n }\n }\n\n /* Container to show backup ID result from server */\n div.results-view {\n width: 16rem;\n margin: 0.5rem auto;\n padding: 0.5rem 0.75rem;\n box-sizing: border-box;\n border: 1px dashed var(--cloud-backup-color);\n border-radius: var(--curve-factor);\n text-align: left;\n .backup-id-label, .backup-id-value {\n display: inline;\n font-size: 1rem;\n margin-right: 0.5rem;\n }\n .backup-id-note {\n font-size: 0.8rem;\n display: block;\n opacity: 0.8;\n margin-top: 0.5rem;\n }\n }\n\n /* Overide form element colors, so that config menu can be themed by user */\n input, button {\n color: var(--cloud-backup-color);\n border: 1px solid var(--cloud-backup-color);\n background: none;\n width: 16rem;\n }\n input:focus {\n box-shadow: 1px 1px 6px var(--cloud-backup-color);\n }\n button:hover {\n color: var(--cloud-backup-background);\n border: 1px solid var(--cloud-backup-background);\n background: var(--cloud-backup-color);\n }\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./CloudBackupRestore.vue?vue&type=template&id=72c986b6&scoped=true&\"\nimport script from \"./CloudBackupRestore.vue?vue&type=script&lang=js&\"\nexport * from \"./CloudBackupRestore.vue?vue&type=script&lang=js&\"\nimport style0 from \"./CloudBackupRestore.vue?vue&type=style&index=0&id=72c986b6&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"72c986b6\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"60%\",\"classes\":\"dashy-modal\"}},[_c('div',{staticClass:\"rebuild-app-container\"},[_c('h3',{staticClass:\"rebuild-app-title\"},[_vm._v(_vm._s(_vm.$t('app-rebuild.title')))]),_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('app-rebuild.rebuild-note-l1'))+\" \"+_vm._s(_vm.$t('app-rebuild.rebuild-note-l2'))),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('app-rebuild.rebuild-note-l3'))+\" \")]),_c('Button',{attrs:{\"click\":_vm.startBuild,\"disabled\":_vm.loading || !_vm.allowRebuild,\"disallow\":!_vm.allowRebuild},scopedSlots:_vm._u([{key:\"text\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.loading ? _vm.$t('app-rebuild.rebuilding-status-1') : _vm.$t('app-rebuild.rebuild-button'))+\" \")]},proxy:true},{key:\"icon\",fn:function(){return [_c('RebuildIcon')]},proxy:true}])}),(!_vm.allowRebuild)?_c('div',[_c('p',{staticClass:\"disallow-rebuild-msg\"},[_vm._v(_vm._s(_vm.$t('app-rebuild.error-permission')))])]):_vm._e(),(_vm.loading)?_c('div',{staticClass:\"loader-info\"},[_c('LoadingAnimation',{staticClass:\"loader\"}),_c('p',{staticClass:\"loading-message\"},[_vm._v(_vm._s(_vm.$t('app-rebuild.rebuilding-status-2'))+\"...\")])],1):_vm._e(),(_vm.success !== undefined)?_c('div',{staticClass:\"rebuild-response\"},[(_vm.success)?_c('p',{staticClass:\"response-status success\"},[_vm._v(\" ✅ \"+_vm._s(_vm.$t('app-rebuild.success-msg'))+\" \")]):_c('p',{staticClass:\"response-status failure\"},[_vm._v(\" ❌ \"+_vm._s(_vm.$t('app-rebuild.fail-msg'))+\" \")]),_c('pre',{staticClass:\"output\"},[_c('code',[_vm._v(_vm._s(_vm.output || _vm.error))])]),_c('p',{staticClass:\"rebuild-message\"},[_vm._v(_vm._s(_vm.message))]),(_vm.success)?_c('p',{staticClass:\"rebuild-message\"},[_vm._v(\" \"+_vm._s(_vm.$t('app-rebuild.reload-note'))+\" \")]):_vm._e(),(_vm.success)?_c('Button',{attrs:{\"click\":_vm.refreshPage},scopedSlots:_vm._u([{key:\"text\",fn:function(){return [_vm._v(_vm._s(_vm.$t('app-rebuild.reload-button')))]},proxy:true},{key:\"icon\",fn:function(){return [_c('ReloadIcon')]},proxy:true}],null,false,3658341317)}):_vm._e()],1):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"modalName\" :resizable=\"true\" width=\"50%\" height=\"60%\" classes=\"dashy-modal\">\n <div class=\"rebuild-app-container\">\n <!-- Title, intro and start button -->\n <h3 class=\"rebuild-app-title\">{{ $t('app-rebuild.title') }}</h3>\n <p>\n {{ $t('app-rebuild.rebuild-note-l1') }}\n {{ $t('app-rebuild.rebuild-note-l2') }}<br>\n {{ $t('app-rebuild.rebuild-note-l3') }}\n </p>\n <Button :click=\"startBuild\" :disabled=\"loading || !allowRebuild\" :disallow=\"!allowRebuild\">\n <template v-slot:text>\n {{ loading ? $t('app-rebuild.rebuilding-status-1') : $t('app-rebuild.rebuild-button') }}\n </template>\n <template v-slot:icon><RebuildIcon /></template>\n </Button>\n <div v-if=\"!allowRebuild\">\n <p class=\"disallow-rebuild-msg\">{{ $t('app-rebuild.error-permission') }}</p>\n </div>\n <!-- Loading animation and text (shown while build is happening) -->\n <div v-if=\"loading\" class=\"loader-info\">\n <LoadingAnimation class=\"loader\" />\n <p class=\"loading-message\">{{ $t('app-rebuild.rebuilding-status-2') }}...</p>\n </div>\n <!-- Build response, and next actions (shown after build is done) -->\n <div class=\"rebuild-response\" v-if=\"success !== undefined\">\n <p v-if=\"success\" class=\"response-status success\">\n ✅ {{ $t('app-rebuild.success-msg') }}\n </p>\n <p v-else class=\"response-status failure\">\n ❌ {{ $t('app-rebuild.fail-msg') }}\n </p>\n <pre class=\"output\"><code>{{ output || error }}</code></pre>\n <p class=\"rebuild-message\">{{ message }}</p>\n <p v-if=\"success\" class=\"rebuild-message\">\n {{ $t('app-rebuild.reload-note') }}\n </p>\n <Button :click=\"refreshPage\" v-if=\"success\">\n <template v-slot:text>{{ $t('app-rebuild.reload-button') }}</template>\n <template v-slot:icon><ReloadIcon /></template>\n </Button>\n </div>\n </div>\n </modal>\n</template>\n\n<script>\nimport axios from 'axios';\nimport ProgressBar from 'rsup-progress';\nimport Button from '@/components/FormElements/Button';\nimport RebuildIcon from '@/assets/interface-icons/application-rebuild.svg';\nimport ReloadIcon from '@/assets/interface-icons/application-reload.svg';\nimport LoadingAnimation from '@/assets/interface-icons/loader.svg';\nimport { modalNames, serviceEndpoints } from '@/utils/defaults';\n\nexport default {\n name: 'RebuildApp',\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n components: {\n Button,\n RebuildIcon,\n ReloadIcon,\n LoadingAnimation,\n },\n data: () => ({\n modalName: modalNames.REBUILD_APP,\n loading: false,\n success: undefined,\n error: '',\n output: '',\n message: '',\n allowRebuild: true,\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n }),\n methods: {\n /* Calls to the rebuild endpoint, to kickoff the app build */\n startBuild() {\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}${serviceEndpoints.rebuild}`;\n this.loading = true;\n this.progress.start();\n axios.get(endpoint)\n .then((response) => {\n this.finished(response.data || false);\n this.progress.end();\n })\n .catch((error) => {\n this.finished({ success: false, error });\n this.progress.end();\n });\n },\n /* Called when rebuild is complete, updates UI with either success or fail message */\n finished(responseData) {\n this.loading = false;\n if (responseData) {\n const {\n success, output, error, message,\n } = responseData;\n this.success = success;\n this.output = output;\n this.message = message;\n this.error = error;\n }\n this.$toasted.show(\n (this.success\n ? `✅ ${this.$t('app-rebuild.success-msg')}` : `❌ ${this.$t('app-rebuild.fail-msg')}`),\n { className: `toast-${this.success ? 'success' : 'error'}` },\n );\n },\n refreshPage() {\n location.reload(); // eslint-disable-line no-restricted-globals\n },\n },\n mounted() {\n if (this.appConfig.allowConfigEdit === false) {\n this.allowRebuild = false;\n }\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.rebuild-app-container {\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 1rem;\n color: var(--config-settings-color);\n background: var(--config-settings-background);\n overflow: auto;\n\n button {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n }\n\n p.disallow-rebuild-msg {\n color: var(--danger);\n font-size: 1.2rem;\n margin: 0.2rem auto;\n text-align: center;\n }\n\n h3.rebuild-app-title {\n text-align: center;\n font-size: 2rem;\n margin: 1rem;\n }\n div.loader-info {\n margin: 0.2rem auto;\n text-align: center;\n svg.loader {\n width: 100px;\n }\n p.loading-message {\n margin: 0;\n font-size: 0.8rem;\n opacity: var(--dimming-factor);\n animation: 3s fadeIn;\n animation-fill-mode: forwards;\n opacity: 0;\n @keyframes fadeIn {\n 90% { opacity: 0; }\n 95% { opacity: 0.8; }\n 100% { opacity: 1; }\n }\n }\n }\n div.rebuild-response {\n width: 80%;\n margin: 0 auto 4rem auto;\n text-align: center;\n p.response-status {\n font-size: 1rem;\n text-align: left;\n &.success {\n color: var(--success);\n }\n &.failure {\n color: var(--danger);\n }\n }\n pre.output {\n padding: 1rem;\n font-size: 0.75rem;\n border-radius: var(--curve-factor-small);\n text-align: left;\n color: var(--white);\n background: var(--black);\n white-space: pre-wrap;\n }\n p.rebuild-message {\n font-size: 1rem;\n text-align: left;\n margin: 0.8rem 0;\n color: var(--config-settings-color);\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RebuildApp.vue?vue&type=template&id=631127b0&scoped=true&\"\nimport script from \"./RebuildApp.vue?vue&type=script&lang=js&\"\nexport * from \"./RebuildApp.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RebuildApp.vue?vue&type=style&index=0&id=631127b0&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"631127b0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isVersionValid())?_c('div',{staticClass:\"app-version\"},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('updates.app-version-note'))+\" \"+_vm._s(_vm.appVersion)+\" \")]),(_vm.checksEnabled)?_c('div',[(!_vm.finished)?_c('p',[_vm._v(\" \"+_vm._s(_vm.error ? 'Error checking for updates.' : 'Chcekcing for Updates...')+\" \")]):_vm._e(),(_vm.finished && _vm.isUpToDate)?_c('p',{staticClass:\"up-to-date\"},[_vm._v(\" ✅ \"+_vm._s(_vm.$t('updates.up-to-date'))+\" \")]):(_vm.finished && !_vm.veryOutOfDate)?_c('p',{staticClass:\"update-availible\"},[_vm._v(\" ⚠️\"+_vm._s(_vm.$t('updates.out-of-date'))+\": \"),_c('b',[_vm._v(_vm._s(_vm.latestVersion))])]):(_vm.finished && _vm.veryOutOfDate)?_c('p',{staticClass:\"big-update-availible\"},[_vm._v(\" ❗ \"+_vm._s(_vm.$t('updates.out-of-date'))+\": \"),_c('b',[_vm._v(_vm._s(_vm.latestVersion))]),_c('span',{staticClass:\"please-update\"},[_vm._v(\" \"+_vm._s(_vm.$t('updates.unsupported-version-l1'))+\".\"),_c('br'),_vm._v(\" \"+_vm._s(_vm.$t('updates.unsupported-version-l2'))+\" \"+_vm._s(_vm.latestVersion)+\" \")])]):_vm._e()]):_vm._e()]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"app-version\" v-if=\"isVersionValid()\">\n <!-- Current Version -->\n <p>\n {{ $t('updates.app-version-note') }} {{ appVersion }}\n </p>\n <div v-if=\"checksEnabled\">\n <!-- Results haven't come in yet, either still checking, or error -->\n <p v-if=\"!finished\">\n {{ error ? 'Error checking for updates.' : 'Chcekcing for Updates...' }}\n </p>\n <!-- App is up-to-date -->\n <p v-if=\"finished && isUpToDate\" class=\"up-to-date\">\n ✅ {{ $t('updates.up-to-date') }}\n </p>\n <!-- An update is available, but not too out-of-date -->\n <p v-else-if=\"finished && !veryOutOfDate\" class=\"update-availible\">\n ⚠️{{ $t('updates.out-of-date') }}: <b>{{ latestVersion }}</b>\n </p>\n <!-- Update available, app is VERY out of date, show some additional info -->\n <p v-else-if=\"finished && veryOutOfDate\" class=\"big-update-availible\">\n ❗ {{ $t('updates.out-of-date') }}: <b>{{ latestVersion }}</b>\n <span class=\"please-update\">\n {{ $t('updates.unsupported-version-l1') }}.<br>\n {{ $t('updates.unsupported-version-l2') }} {{ latestVersion }}\n </span>\n </p>\n </div>\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\nimport ProgressBar from 'rsup-progress';\nimport ErrorHandler from '@/utils/ErrorHandler';\n\nexport default {\n name: 'AppInfoModal',\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n data() {\n return {\n appVersion: process.env.VUE_APP_VERSION, // Current version, from package.json\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n latestVersion: '', // Will store latest version, when request returns\n checksEnabled: true, // Should we check for updates\n isUpToDate: true, // Is current version === latest version\n veryOutOfDate: false, // If the app is more than 5 versions out of date\n finished: false, // Set to true when request is done\n error: false, // Set to true if checkig fails\n };\n },\n mounted() {\n if (!this.appVersion || (this.appConfig && this.appConfig.disableUpdateChecks)) {\n // Either current version isn't found, or user disabled checks\n this.checksEnabled = false;\n } else {\n this.checkVersion(); // Trigger the check\n }\n },\n methods: {\n /* Gets the apps latest version from Dashy's git repo */\n checkVersion() {\n const packageUrl = 'https://raw.githubusercontent.com/Lissy93/dashy/master/package.json';\n this.progress.start();\n axios.get(packageUrl).then((response) => {\n if (response && response.data && response.data.version) {\n this.latestVersion = response.data.version;\n this.isUpToDate = this.checkIfUpToDate(this.appVersion, this.latestVersion);\n this.finished = true;\n this.progress.end();\n }\n }).catch(() => {\n this.error = true;\n this.progress.end();\n });\n },\n /* Compares the current version, with the package.json version */\n checkIfUpToDate(currentVersion, latestVersion) {\n const parse = (version) => parseInt(version.replaceAll('.', ''), 10);\n const difference = parse(latestVersion) - parse(currentVersion);\n if (difference > 5) this.veryOutOfDate = true;\n return difference <= 0;\n },\n /* Checks that the input version is correctly parsed */\n isVersionValid() {\n const isValid = !Number.isNaN(parseInt(this.appVersion.replaceAll('.', ''), 10));\n if (!isValid) { // If invalid, then record an error\n ErrorHandler(\n 'Unable to check for updates, because current version is unavailible.'\n + ` ${this.appVersion} is not a valid version.`,\n );\n }\n return isValid;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\ndiv.app-version {\n color: var(--settings-text-color);\n text-align: center;\n p {\n margin: 0.5rem auto;\n color: var(--transparent-white-50);\n cursor: default;\n &.up-to-date {\n color: var(--success);\n font-weight: bold;\n opacity: 0.8;\n }\n &.update-availible {\n color: var(--warning);\n opacity: 0.8;\n }\n &.big-update-availible {\n color: var(--danger);\n .please-update {\n font-size: 0.8rem;\n color: var(--danger);\n display: block;\n }\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AppVersion.vue?vue&type=template&id=2f975a24&scoped=true&\"\nimport script from \"./AppVersion.vue?vue&type=script&lang=js&\"\nexport * from \"./AppVersion.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppVersion.vue?vue&type=style&index=0&id=2f975a24&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2f975a24\",\n null\n \n)\n\nexport default component.exports","<template>\n <Tabs :navAuto=\"true\" name=\"Add Item\" ref=\"tabView\">\n <TabItem :name=\"$t('config.main-tab')\" class=\"main-tab\">\n <div class=\"main-options-container\">\n <div class=\"config-buttons\">\n <h2>{{ $t('config.heading') }}</h2>\n <a class=\"hyperlink-wrapper\" @click=\"openExportConfigModal()\">\n <button class=\"config-button center\">\n <DownloadIcon class=\"button-icon\"/>\n {{ $t('config.download-config-button') }}\n </button>\n </a>\n <button class=\"config-button center\" @click=\"() => navigateToTab(1)\">\n <EditIcon class=\"button-icon\"/>\n {{ $t('config.edit-config-button') }}\n </button>\n <button class=\"config-button center\" @click=\"openLanguageSwitchModal()\">\n <LanguageIcon class=\"button-icon\"/>\n {{ $t('config.change-language-button') }}\n </button>\n <button class=\"config-button center\" @click=\"() => navigateToTab(3)\">\n <CustomCssIcon class=\"button-icon\"/>\n {{ $t('config.edit-css-button') }}\n </button>\n <button class=\"config-button center\" @click=\"() => navigateToTab(2)\">\n <CloudIcon class=\"button-icon\"/>\n {{backupId ? $t('config.edit-cloud-sync-button') : $t('config.cloud-sync-button') }}\n </button>\n <button class=\"config-button center\" @click=\"openRebuildAppModal()\">\n <RebuildIcon class=\"button-icon\"/>\n {{ $t('config.rebuild-app-button') }}\n </button>\n <button class=\"config-button center\" @click=\"resetLocalSettings()\">\n <DeleteIcon class=\"button-icon\"/>\n {{ $t('config.reset-settings-button') }}\n </button>\n <button class=\"config-button center\" @click=\"openAboutModal()\">\n <IconAbout class=\"button-icon\" />\n {{ $t('config.app-info-button') }}\n </button>\n <p class=\"small-screen-note\" style=\"display: none;\">\n You are using a very small screen, and some screens in this menu may not be optimal\n </p>\n <p class=\"language\">{{ getLanguage() }}</p>\n <AppVersion />\n </div>\n <div class=\"config-note\">\n <span>{{ $t('config.backup-note') }}</span>\n </div>\n </div>\n <!-- Rebuild App Modal -->\n <RebuildApp />\n </TabItem>\n <TabItem :name=\"$t('config.edit-config-tab')\">\n <JsonEditor />\n </TabItem>\n <TabItem :name=\"$t('cloud-sync.title')\">\n <CloudBackupRestore />\n </TabItem>\n <TabItem :name=\"$t('config.custom-css-tab')\">\n <CustomCssEditor />\n </TabItem>\n </Tabs>\n</template>\n\n<script>\n\nimport JsonToYaml from '@/utils/JsonToYaml';\nimport { localStorageKeys, modalNames } from '@/utils/defaults';\nimport { getUsersLanguage } from '@/utils/ConfigHelpers';\nimport StoreKeys from '@/utils/StoreMutations';\nimport JsonEditor from '@/components/Configuration/JsonEditor';\nimport CustomCssEditor from '@/components/Configuration/CustomCss';\nimport CloudBackupRestore from '@/components/Configuration/CloudBackupRestore';\nimport RebuildApp from '@/components/Configuration/RebuildApp';\nimport AppVersion from '@/components/Configuration/AppVersion';\n\nimport DownloadIcon from '@/assets/interface-icons/config-download-file.svg';\nimport DeleteIcon from '@/assets/interface-icons/config-delete-local.svg';\nimport EditIcon from '@/assets/interface-icons/config-edit-json.svg';\nimport CustomCssIcon from '@/assets/interface-icons/config-custom-css.svg';\nimport CloudIcon from '@/assets/interface-icons/cloud-backup-restore.svg';\nimport RebuildIcon from '@/assets/interface-icons/application-rebuild.svg';\nimport LanguageIcon from '@/assets/interface-icons/config-language.svg';\nimport IconAbout from '@/assets/interface-icons/application-about.svg';\n\nexport default {\n name: 'ConfigContainer',\n data() {\n return {\n jsonParser: JsonToYaml,\n backupId: localStorage[localStorageKeys.BACKUP_ID] || '',\n appVersion: process.env.VUE_APP_VERSION,\n latestVersion: '',\n };\n },\n props: {\n config: Object,\n },\n computed: {\n sections: function getSections() {\n return this.config.sections;\n },\n yaml() {\n return this.jsonParser(this.config);\n },\n },\n components: {\n JsonEditor,\n CustomCssEditor,\n CloudBackupRestore,\n RebuildApp,\n AppVersion,\n DownloadIcon,\n DeleteIcon,\n EditIcon,\n CloudIcon,\n CustomCssIcon,\n LanguageIcon,\n RebuildIcon,\n IconAbout,\n },\n methods: {\n /* Progamatically navigates to a given tab by index */\n navigateToTab(tabInxex) {\n const itemToSelect = this.$refs.tabView.navItems[tabInxex];\n this.$refs.tabView.activeTabItem(itemToSelect);\n },\n openRebuildAppModal() {\n this.$modal.show(modalNames.REBUILD_APP);\n },\n openAboutModal() {\n this.$modal.show(modalNames.ABOUT_APP);\n },\n openLanguageSwitchModal() {\n this.$modal.show(modalNames.LANG_SWITCHER);\n },\n openExportConfigModal() {\n this.$modal.show(modalNames.EXPORT_CONFIG_MENU);\n },\n /* Checks that the user is sure, then resets site-wide local storage, and reloads page */\n resetLocalSettings() {\n const msg = `${this.$t('config.reset-config-msg-l1')} `\n + `${this.$t('config.reset-config-msg-l2')}\\n\\n${this.$t('config.reset-config-msg-l3')}`;\n const isTheUserSure = confirm(msg); // eslint-disable-line no-alert, no-restricted-globals\n if (isTheUserSure) {\n localStorage.clear();\n this.$toasted.show(this.$t('config.data-cleared-msg'));\n this.$store.dispatch(StoreKeys.INITIALIZE_CONFIG);\n }\n },\n getLanguage() {\n const lang = getUsersLanguage();\n return lang ? `${lang.flag} ${lang.name}` : '';\n },\n /* If launching menu from editor, navigate to correct starting tab */\n navigateToStartingTab() {\n const navToTab = this.$store.state.navigateConfToTab;\n const isValidTabIndex = (indx) => typeof indx === 'number' && indx >= 0 && indx <= 5;\n if (navToTab && isValidTabIndex(navToTab)) this.navigateToTab(navToTab);\n this.$store.commit(StoreKeys.CONF_MENU_INDEX, undefined);\n },\n },\n mounted() {\n this.navigateToStartingTab();\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n\npre {\n color: var(--config-code-color);\n font-weight: bold !important;\n padding: 0.5rem 1rem;\n}\n\na.config-button, button.config-button {\n display: flex;\n align-items: center;\n padding: 0.5rem 1rem;\n margin: 0.25rem auto;\n font-size: 1.2rem;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n border-radius: var(--curve-factor);\n text-decoration: none;\n cursor: pointer;\n margin: 0.5rem auto;\n min-width: 18rem;\n width: 100%;\n svg.button-icon {\n path {\n fill: var(--config-settings-color);\n }\n width: 1rem;\n height: 1rem;\n padding: 0.2rem;\n margin-right: 0.5rem;\n }\n &:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n svg path {\n fill: var(--config-settings-background);\n }\n }\n}\n\na.hyperlink-wrapper {\n margin: 0 auto;\n text-decoration: none;\n min-width: 18rem;\n width: 100%;\n}\n\np.app-version, p.language {\n margin: 0.5rem auto;\n font-size: 1rem;\n color: var(--transparent-white-50);\n cursor: default;\n}\n\ndiv.code-container {\n background: var(--config-code-background);\n #conf-yaml span {\n font-family: var(--font-monospace), monospace !important;\n &.hljs-attr {\n font-weight: bold !important;\n }\n }\n .yaml-action-buttons {\n position: absolute;\n top: 1.5rem;\n right: 0.5rem;\n display: flex;\n flex-direction: column;\n border: 1px dashed;\n padding: 0.5rem;\n border-radius: 4px;\n h2 {\n margin: 0;\n text-align: center;\n color: var(--config-code-color);\n }\n a.yaml-button {\n padding: 0.25rem 0.5rem;\n font-size: 1rem;\n color: var(--config-code-color);\n border-radius: var(--curve-factor);\n cursor: pointer;\n text-decoration: underline;\n border: 1px solid var(--config-code-background);\n &:hover {\n color: var(--config-code-color);\n border-color: var(--config-code-color);\n text-decoration: none;\n }\n &:active {\n color: var(--config-code-background);\n background-color: var(--config-settings-color);\n text-decoration: none;\n }\n }\n }\n}\n\n.tab-item {\n overflow-y: auto;\n @extend .scroll-bar;\n background: var(--config-settings-background);\n &.main-tab {\n min-height: 500px;\n }\n}\n\n.main-options-container {\n height: 100%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.config-buttons {\n display: flex;\n flex-direction: column;\n background: var(--config-settings-background);\n height: calc(100% - 2rem);\n width: fit-content;\n margin: 0 auto;\n padding: 2rem 1rem 0;\n h2 {\n margin: 0 auto 1rem auto;\n color: var(--config-settings-color);\n }\n}\n\n.config-note {\n width: 80%;\n bottom: 1rem;\n left: 10%;\n margin: 0.5rem auto;\n padding: 0.5rem 0.75rem;\n border: 1px dashed var(--config-settings-color);\n border-radius: var(--curve-factor);\n text-align: left;\n opacity: var(--dimming-factor);\n color: var(--config-settings-color);\n background: var(--config-settings-background);\n cursor: default;\n p.sub-title {\n font-weight: bold;\n margin: 0;\n display: inline;\n }\n &:hover { opacity: 1; }\n display: none;\n @include tablet-up { display: block; }\n}\np.small-screen-note {\n @include phone {\n display: block !important;\n }\n margin: 0.5rem auto;\n padding: 0 0.5rem;\n text-align: center;\n opacity: 0.8;\n font-size: 0.9rem;\n color: var(--warning);\n }\n</style>\n\n<style lang=\"scss\">\n\n.tabs__content {\n height: -webkit-fill-available;\n height: -moz-available;\n height: stretch;\n height: 100%; // Firefox\n}\n\n.tab-item {\n background: var(--config-settings-background) !important;\n}\n\n.tab__pagination {\n background: var(--config-settings-background) !important;\n color: var(--config-settings-color) !important;\n .tab__nav__items .tab__nav__item {\n span {\n color: var(--config-settings-color) !important;\n }\n &:hover {\n background: var(--config-settings-color) !important;\n span {\n color: var(--config-settings-background) !important;\n }\n }\n &.active {\n span {\n font-weight: bold !important;\n color: var(--config-settings-color) !important;\n }\n }\n }\n .tab__nav__items .tab__nav__item.active {\n border-bottom: 2px solid var(--config-settings-color) !important;\n }\n hr.tab__slider {\n background: var(--config-settings-color) !important;\n }\n}\n\n#conf-yaml {\n background: var(--white);\n .hljs-attr {\n color: #9c03f5;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfigContainer.vue?vue&type=template&id=7b4f1c0a&scoped=true&\"\nimport script from \"./ConfigContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfigContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfigContainer.vue?vue&type=style&index=0&id=7b4f1c0a&scoped=true&lang=scss&\"\nimport style1 from \"./ConfigContainer.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"7b4f1c0a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"language-switcher\"},[_c('h3',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.$t('language-switcher.title')))]),_c('p',{staticClass:\"intro\"},[_vm._v(_vm._s(_vm.$t('language-switcher.dropdown-label'))+\":\")]),_c('v-select',{staticClass:\"language-dropdown\",attrs:{\"selectOnTab\":true,\"options\":_vm.languageList,\"label\":\"friendlyName\",\"input\":_vm.applyLanguageLocally()},model:{value:(_vm.language),callback:function ($$v) {_vm.language=$$v},expression:\"language\"}}),_c('Button',{staticClass:\"save-button\",attrs:{\"click\":_vm.saveLanguage,\"disallow\":!_vm.language}},[_vm._v(\" \"+_vm._s(_vm.$t('language-switcher.save-button'))+\" \"),_c('SaveConfigIcon')],1),(_vm.language)?_c('p',{staticClass:\"current-lang\"},[_vm._v(\" 🌐 \"+_vm._s(_vm.language.flag)+\" \"+_vm._s(_vm.language.name)+\" \")]):_vm._e(),(_vm.$i18n.availableLocales.length <= 1)?_c('p',{staticClass:\"sad-times\"},[_vm._v(\" There are not currently any additional languages supported, but stay tuned as more are on their way! \")]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"language-switcher\">\n <h3 class=\"title\">{{ $t('language-switcher.title') }}</h3>\n <p class=\"intro\">{{ $t('language-switcher.dropdown-label') }}:</p>\n <v-select\n v-model=\"language\"\n :selectOnTab=\"true\"\n :options=\"languageList\"\n class=\"language-dropdown\"\n label=\"friendlyName\"\n :input=\"applyLanguageLocally()\"\n />\n <Button class=\"save-button\" :click=\"saveLanguage\" :disallow=\"!language\">\n {{ $t('language-switcher.save-button') }}\n <SaveConfigIcon />\n </Button>\n <p v-if=\"language\" class=\"current-lang\">\n 🌐 {{ language.flag }} {{ language.name }}\n </p>\n <p v-if=\"$i18n.availableLocales.length <= 1\" class=\"sad-times\">\n There are not currently any additional languages supported,\n but stay tuned as more are on their way!\n </p>\n </div>\n</template>\n\n<script>\nimport Button from '@/components/FormElements/Button';\nimport SaveConfigIcon from '@/assets/interface-icons/save-config.svg';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport Keys from '@/utils/StoreMutations';\nimport { languages } from '@/utils/languages';\nimport { localStorageKeys, modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'LanguageSwitcher',\n components: {\n Button,\n SaveConfigIcon,\n },\n data() {\n return {\n language: '', // The currently selected language\n modalName: modalNames.LANG_SWITCHER, // Key for modal\n };\n },\n created() {\n // Initiate the current language, with VueX state\n this.language = this.savedLanguage;\n },\n computed: {\n /* Get appConfig from store */\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* The ISO code for the users language, synced with VueX store */\n savedLanguage: {\n get() {\n return this.getIsoFromLangObj(this.$store.getters.appConfig.lang);\n },\n set(newLang) {\n this.$store.commit(Keys.SET_LANGUAGE, newLang.code);\n },\n },\n /* Return the array of language objects, plus a friends name */\n languageList: () => languages.map((lang) => {\n const newLang = lang;\n newLang.friendlyName = `${lang.flag} ${lang.name}`;\n return newLang;\n }),\n },\n methods: {\n /* Check if language is supported */\n checkLocale(selectedLanguage) {\n if (!selectedLanguage || !selectedLanguage.code) return false;\n const i18nLocales = this.$i18n.availableLocales;\n return i18nLocales.includes(selectedLanguage.code);\n },\n /* Apply language locally */\n applyLanguageLocally() {\n if (this.language && this.language.code) {\n this.$i18n.locale = this.language.code;\n } else {\n ErrorHandler('Error applying language, it\\'s config may be missing of incomplete');\n }\n },\n /* Save language to local storage, show success msg and close modal */\n saveLanguage() {\n const selectedLanguage = this.language;\n if (this.checkLocale(selectedLanguage)) {\n localStorage.setItem(localStorageKeys.LANGUAGE, selectedLanguage.code);\n this.applyLanguageLocally();\n this.savedLanguage = selectedLanguage;\n const successMsg = `${selectedLanguage.flag} `\n + `${this.$t('language-switcher.success-msg')} ${selectedLanguage.name}`;\n this.$toasted.show(successMsg, { className: 'toast-success' });\n this.$modal.hide(this.modalName);\n } else {\n this.$toasted.show('Unable to update language', { className: 'toast-error' });\n ErrorHandler('Unable to apply language');\n }\n },\n /* Gets the ISO code for a given language object */\n getIsoFromLangObj(langObj) {\n const getLanguageFromIso = (iso) => languages.find((lang) => lang.code === iso);\n return getLanguageFromIso(langObj);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n.language-switcher {\n height: 100%;\n margin: 0;\n padding: 1rem;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n h3.title {\n text-align: center;\n }\n p.intro {\n margin: 0;\n }\n button.save-button {\n margin: 0 auto;\n width: 100%;\n }\n p.sad-times {\n color: var(--warning);\n text-align: center;\n }\n p.current-lang {\n color: var(--success);\n opacity: var(--dimming-factor);\n text-align: center;\n position: absolute;\n margin: 1rem auto;\n cursor: default;\n width: 100%;\n bottom: 0;\n }\n}\n\n</style>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n.language-dropdown {\n margin: 1rem auto;\n ul.vs__dropdown-menu {\n max-height: 14rem;\n @extend .scroll-bar;\n }\n div.vs__dropdown-toggle {\n padding: 0.2rem 0;\n }\n div, input {\n cursor: pointer;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LanguageSwitcher.vue?vue&type=template&id=35dfeeb8&scoped=true&\"\nimport script from \"./LanguageSwitcher.vue?vue&type=script&lang=js&\"\nexport * from \"./LanguageSwitcher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LanguageSwitcher.vue?vue&type=style&index=0&id=35dfeeb8&scoped=true&lang=scss&\"\nimport style1 from \"./LanguageSwitcher.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"35dfeeb8\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"config-options\" v-click-outside=\"closeViewSwitcher\">\n <!-- Button and label -->\n <span class=\"config-label\">{{ $t('settings.config-launcher-label') }}</span>\n <div class=\"config-buttons\">\n <IconSpanner @click=\"showEditor()\" tabindex=\"-2\"\n v-tooltip=\"tooltip($t('settings.config-launcher-tooltip'))\" />\n <IconInteractiveEditor @click=\"startInteractiveEditor()\" tabindex=\"-2\"\n v-tooltip=\"tooltip(enterEditModeTooltip)\"\n :class=\"isEditMode ? 'disabled' : ''\" />\n <IconViewMode @click=\"openChangeViewMenu()\" tabindex=\"-2\"\n v-tooltip=\"tooltip($t('alternate-views.alternate-view-heading'))\" />\n </div>\n\n <!-- Modal containing all the configuration options -->\n <modal :name=\"modalNames.CONF_EDITOR\" :resizable=\"true\" width=\"60%\" height=\"85%\"\n @closed=\"editorClosed\" classes=\"dashy-modal\">\n <ConfigContainer :config=\"combineConfig()\" />\n </modal>\n\n <!-- Modal for manually changing locale -->\n <modal :name=\"modalNames.LANG_SWITCHER\" classes=\"dashy-modal\"\n :resizable=\"true\" width=\"35%\" height=\"60%\">\n <LanguageSwitcher />\n </modal>\n\n <!-- Menu for switching view -->\n <div v-if=\"viewSwitcherOpen\" class=\"view-switcher\">\n <ul>\n <li>\n <router-link to=\"/home\">\n <IconHome /><span>{{ $t('alternate-views.default') }}</span>\n </router-link>\n </li>\n <li>\n <router-link to=\"/minimal\">\n <IconMinimalView /><span>{{ $t('alternate-views.minimal') }}</span>\n </router-link>\n <li>\n <router-link to=\"/workspace\">\n <IconWorkspaceView /><span>{{ $t('alternate-views.workspace') }}</span>\n </router-link>\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script>\n// Import components, and store-key identifiers\nimport ConfigContainer from '@/components/Configuration/ConfigContainer';\nimport LanguageSwitcher from '@/components/Settings/LanguageSwitcher';\nimport Keys from '@/utils/StoreMutations';\nimport { topLevelConfKeys, localStorageKeys, modalNames } from '@/utils/defaults';\n// Import icons for config launcher buttons\nimport IconSpanner from '@/assets/interface-icons/config-editor.svg';\nimport IconInteractiveEditor from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\nimport IconViewMode from '@/assets/interface-icons/application-change-view.svg';\nimport IconHome from '@/assets/interface-icons/application-home.svg';\nimport IconWorkspaceView from '@/assets/interface-icons/open-workspace.svg';\nimport IconMinimalView from '@/assets/interface-icons/application-minimal.svg';\n\nexport default {\n name: 'ConfigLauncher',\n data() {\n return {\n modalNames,\n viewSwitcherOpen: false,\n };\n },\n components: {\n ConfigContainer,\n LanguageSwitcher,\n IconSpanner,\n IconInteractiveEditor,\n IconViewMode,\n IconHome,\n IconWorkspaceView,\n IconMinimalView,\n },\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n /* Tooltip text for Edit Mode button, to change depending on it in edit mode */\n enterEditModeTooltip() {\n return this.$t(\n `interactive-editor.menu.${this.isEditMode\n ? 'edit-mode-subtitle' : 'start-editing-tooltip'}`,\n );\n },\n },\n methods: {\n showEditor: function show() {\n this.$modal.show(modalNames.CONF_EDITOR);\n this.$store.commit(Keys.SET_MODAL_OPEN, true);\n },\n editorClosed: function show() {\n this.$store.commit(Keys.SET_MODAL_OPEN, false);\n },\n combineConfig() {\n const conf = {};\n conf[topLevelConfKeys.APP_CONFIG] = this.appConfig;\n conf[topLevelConfKeys.PAGE_INFO] = this.pageInfo;\n conf[topLevelConfKeys.SECTIONS] = this.sections;\n conf[topLevelConfKeys.APP_CONFIG].theme = localStorage[localStorageKeys.THEME]\n || conf[topLevelConfKeys.APP_CONFIG].theme;\n return conf;\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n openChangeViewMenu() {\n this.viewSwitcherOpen = !this.viewSwitcherOpen;\n },\n closeViewSwitcher() {\n this.viewSwitcherOpen = false;\n },\n startInteractiveEditor() {\n if (!this.isEditMode) {\n this.$store.commit(Keys.SET_EDIT_MODE, true);\n }\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\n.config-options {\n @extend .svg-button;\n display: flex;\n flex-direction: column;\n color: var(--settings-text-color);\n min-width: 3.2rem;\n}\n\n.view-switcher {\n position: absolute;\n right: 1rem;\n margin-top: 3rem;\n z-index: 5;\n background: var(--background);\n border: 1px solid var(--settings-text-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--settings-container-shadow);\n ul {\n list-style: none;\n margin: 0;\n padding: 0;\n li {\n cursor: pointer;\n padding: 0.25rem 0.75rem;\n a {\n color: var(--settings-text-color);\n text-decoration: none;\n display: flex;\n align-items: center;\n }\n &:hover {\n background: var(--settings-text-color);\n a { color: var(--background); }\n }\n svg {\n margin: 0 0.25rem 0 0;\n border: none;\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ConfigLauncher.vue?vue&type=template&id=e0bd5110&scoped=true&\"\nimport script from \"./ConfigLauncher.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfigLauncher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfigLauncher.vue?vue&type=style&index=0&id=e0bd5110&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e0bd5110\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',{staticClass:\"options-label\"},[_vm._v(_vm._s(_vm.$t('settings.layout-label')))]),_c('div',{staticClass:\"display-options\"},[_c('IconDeafault',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.layout-auto'))),expression:\"tooltip($t('settings.layout-auto'))\"}],class:(\"layout-icon \" + (_vm.displayLayout === 'auto' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateDisplayLayout('auto')}}}),_c('IconHorizontal',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.layout-horizontal'))),expression:\"tooltip($t('settings.layout-horizontal'))\"}],class:(\"layout-icon \" + (_vm.displayLayout === 'horizontal' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateDisplayLayout('horizontal')}}}),_c('IconVertical',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.layout-vertical'))),expression:\"tooltip($t('settings.layout-vertical'))\"}],class:(\"layout-icon \" + (_vm.displayLayout === 'vertical' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateDisplayLayout('vertical')}}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <span class=\"options-label\">{{ $t('settings.layout-label') }}</span>\n <div class=\"display-options\">\n <IconDeafault\n @click=\"updateDisplayLayout('auto')\"\n v-tooltip=\"tooltip($t('settings.layout-auto'))\"\n :class=\"`layout-icon ${displayLayout === 'auto' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconHorizontal\n @click=\"updateDisplayLayout('horizontal')\"\n v-tooltip=\"tooltip($t('settings.layout-horizontal'))\"\n :class=\"`layout-icon ${displayLayout === 'horizontal' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconVertical\n @click=\"updateDisplayLayout('vertical')\"\n v-tooltip=\"tooltip($t('settings.layout-vertical'))\"\n :class=\"`layout-icon ${displayLayout === 'vertical' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport StoreKeys from '@/utils/StoreMutations';\nimport IconDeafault from '@/assets/interface-icons/layout-default.svg';\nimport IconHorizontal from '@/assets/interface-icons/layout-horizontal.svg';\nimport IconVertical from '@/assets/interface-icons/layout-vertical.svg';\n\nexport default {\n name: 'LayoutSelector',\n props: {\n displayLayout: String,\n },\n components: {\n IconDeafault,\n IconHorizontal,\n IconVertical,\n },\n methods: {\n updateDisplayLayout(layout) {\n this.$store.commit(StoreKeys.SET_ITEM_LAYOUT, layout);\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nspan.options-label {\n color: var(--settings-text-color);\n}\n\n.display-options {\n color: var(--settings-text-color);\n svg {\n path {\n fill: var(--settings-text-color);\n }\n width: 1rem;\n height: 1rem;\n margin: 0.2rem;\n padding: 0.2rem;\n text-align: center;\n background: var(--background);\n border: 1px solid currentColor;\n border-radius: var(--curve-factor);\n cursor: pointer;\n &:hover, &.selected {\n background: var(--settings-text-color);\n path { fill: var(--background); }\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./LayoutSelector.vue?vue&type=template&id=748b80da&scoped=true&\"\nimport script from \"./LayoutSelector.vue?vue&type=script&lang=js&\"\nexport * from \"./LayoutSelector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./LayoutSelector.vue?vue&type=style&index=0&id=748b80da&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"748b80da\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',{staticClass:\"options-label\"},[_vm._v(_vm._s(_vm.$t('settings.item-size-label')))]),_c('div',{staticClass:\"display-options\"},[_c('IconSmall',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.item-size-small'))),expression:\"tooltip($t('settings.item-size-small'))\"}],class:(\"layout-icon \" + (_vm.iconSize === 'small' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateIconSize('small')}}}),_c('IconMedium',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.item-size-medium'))),expression:\"tooltip($t('settings.item-size-medium'))\"}],class:(\"layout-icon \" + (_vm.iconSize === 'medium' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateIconSize('medium')}}}),_c('IconLarge',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.item-size-large'))),expression:\"tooltip($t('settings.item-size-large'))\"}],class:(\"layout-icon \" + (_vm.iconSize === 'large' ? 'selected' : '')),attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.updateIconSize('large')}}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <span class=\"options-label\">{{ $t('settings.item-size-label') }}</span>\n <div class=\"display-options\">\n <IconSmall\n @click=\"updateIconSize('small')\"\n v-tooltip=\"tooltip($t('settings.item-size-small'))\"\n :class=\"`layout-icon ${iconSize === 'small' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconMedium\n @click=\"updateIconSize('medium')\"\n v-tooltip=\"tooltip($t('settings.item-size-medium'))\"\n :class=\"`layout-icon ${iconSize === 'medium' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n <IconLarge\n @click=\"updateIconSize('large')\"\n v-tooltip=\"tooltip($t('settings.item-size-large'))\"\n :class=\"`layout-icon ${iconSize === 'large' ? 'selected' : ''}`\"\n tabindex=\"-2\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport StoreKeys from '@/utils/StoreMutations';\nimport IconSmall from '@/assets/interface-icons/icon-size-small.svg';\nimport IconMedium from '@/assets/interface-icons/icon-size-medium.svg';\nimport IconLarge from '@/assets/interface-icons/icon-size-large.svg';\n\nexport default {\n name: 'IconSizeSelector',\n data() {\n return {\n input: '',\n };\n },\n props: {\n iconSize: String,\n },\n components: {\n IconSmall,\n IconMedium,\n IconLarge,\n },\n methods: {\n updateIconSize(iconSize) {\n this.$store.commit(StoreKeys.SET_ITEM_SIZE, iconSize);\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nspan.options-label {\n color: var(--settings-text-color);\n}\n\n.display-options {\n color: var(--settings-text-color);\n svg {\n path {\n fill: var(--settings-text-color);\n }\n width: 1rem;\n height: 1rem;\n margin: 0.2rem;\n padding: 0.2rem;\n text-align: center;\n background: var(--background);\n border: 1px solid currentColor;\n border-radius: var(--curve-factor);\n cursor: pointer;\n &:hover, &.selected {\n background: var(--settings-text-color);\n path { fill: var(--background); }\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemSizeSelector.vue?vue&type=template&id=499e085c&scoped=true&\"\nimport script from \"./ItemSizeSelector.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemSizeSelector.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemSizeSelector.vue?vue&type=style&index=0&id=499e085c&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"499e085c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('span',{staticClass:\"user-type-note\"},[_vm._v(_vm._s(_vm.makeText()))]),_c('div',{staticClass:\"display-options\"},[(_vm.userType == _vm.userStateEnum.loggedIn)?_c('IconLogout',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.sign-out-tooltip'))),expression:\"tooltip($t('settings.sign-out-tooltip'))\"}],staticClass:\"layout-icon\",attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.logout()}}}):_vm._e(),(_vm.userType == _vm.userStateEnum.guestAccess)?_c('IconLogout',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('settings.sign-in-tooltip'))),expression:\"tooltip($t('settings.sign-in-tooltip'))\"}],staticClass:\"layout-icon\",attrs:{\"tabindex\":\"-2\"},on:{\"click\":function($event){return _vm.goToLogin()}}}):_vm._e()],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <!-- If auth configured, show status text -->\n <span class=\"user-type-note\">{{ makeText() }}</span>\n <div class=\"display-options\">\n <!-- If user logged in, show logout button -->\n <IconLogout\n v-if=\"userType == userStateEnum.loggedIn\"\n @click=\"logout()\"\n v-tooltip=\"tooltip($t('settings.sign-out-tooltip'))\"\n class=\"layout-icon\" tabindex=\"-2\"\n />\n <!-- If not logged in, and gues mode enabled, show login button -->\n <IconLogout\n v-if=\"userType == userStateEnum.guestAccess\"\n @click=\"goToLogin()\"\n v-tooltip=\"tooltip($t('settings.sign-in-tooltip'))\"\n class=\"layout-icon\" tabindex=\"-2\"\n />\n </div>\n </div>\n</template>\n\n<script>\nimport router from '@/router';\nimport { logout as registerLogout } from '@/utils/Auth';\nimport { localStorageKeys, userStateEnum } from '@/utils/defaults';\nimport IconLogout from '@/assets/interface-icons/user-logout.svg';\n\nexport default {\n name: 'AuthButtons',\n components: {\n IconLogout,\n },\n props: {\n userType: Number,\n },\n data() {\n return {\n userStateEnum,\n };\n },\n methods: {\n logout() {\n registerLogout();\n this.$toasted.show(this.$t('login.logout-message'));\n setTimeout(() => {\n router.push({ path: '/login' });\n }, 500);\n },\n goToLogin() {\n router.push({ path: '/login' });\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n makeText() {\n if (this.userType === userStateEnum.loggedIn) {\n const username = localStorage[localStorageKeys.USERNAME];\n return username ? this.$t('settings.sign-in-welcome', { username }) : '';\n }\n if (this.userType === userStateEnum.guestAccess) {\n return this.$t('settings.sign-in-tooltip');\n }\n return '';\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\nspan.user-type-note {\n color: var(--settings-text-color);\n text-transform: capitalize;\n margin-right: 0.5rem;\n}\n\n.display-options {\n @extend .svg-button;\n color: var(--settings-text-color);\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthButtons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthButtons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AuthButtons.vue?vue&type=template&id=67393502&scoped=true&\"\nimport script from \"./AuthButtons.vue?vue&type=script&lang=js&\"\nexport * from \"./AuthButtons.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AuthButtons.vue?vue&type=style&index=0&id=67393502&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"67393502\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide-fade\"}},[(!_vm.shouldHide)?_c('div',{staticClass:\"kb-sc-info\"},[_c('h5',[_vm._v(\"There are keyboard shortcuts! ⌨️🙌\")]),_c('div',{staticClass:\"close\",attrs:{\"title\":\"Hide forever [Esc]\"},on:{\"click\":function($event){return _vm.hideWelcomeHelper()}}},[_vm._v(\"x\")]),_c('p',{attrs:{\"title\":\"Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀\"}},[_vm._v(\" Just start typing to filter. Then use the tab key to cycle through results, and press enter to launch the selected item, or alt + enter to open in a modal. You can hit Esc at anytime to clear the search. Easy 🥳 \")])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide-fade\">\n <div class=\"kb-sc-info\" v-if=\"!shouldHide\">\n <h5>There are keyboard shortcuts! ⌨️🙌</h5>\n <div class=\"close\" title=\"Hide forever [Esc]\" @click=\"hideWelcomeHelper()\">x</div>\n <p title=\"Press [Esc] to hide this tip forever. See there's even a shortcut for that! 🚀\">\n Just start typing to filter. Then use the tab key to cycle through results,\n and press enter to launch the selected item, or alt + enter to open in a modal.\n You can hit Esc at anytime to clear the search. Easy 🥳\n </p>\n </div>\n </transition>\n</template>\n\n<script>\n\nimport { localStorageKeys } from '@/utils/defaults';\n\nexport default {\n name: 'KeyboardShortcutInfo',\n data() {\n return {\n shouldHide: true, // False = show/ true = hide. Intuitive, eh?\n timeDelay: 3000, // Short delay in ms before popup appears\n };\n },\n methods: {\n /**\n * Returns true if the key exists in session storage, otherwise false\n * And the !! just converts 'false' to false, as strings resolve to true\n */\n shouldHideWelcomeMessage() {\n return !!localStorage[localStorageKeys.HIDE_WELCOME_BANNER];\n },\n /**\n * Update session storage, so that it won't be shown again\n * Trigger the hide function, and remove the event listerner\n */\n hideWelcomeHelper() {\n this.shouldHide = true;\n localStorage.setItem(localStorageKeys.HIDE_WELCOME_BANNER, true);\n window.removeEventListener('keyup', this.keyPressEvent);\n },\n /* Passed to window function, to add/ remove event listener */\n keyPressEvent(event) {\n if (event.keyCode === 27) this.hideWelcomeHelper();\n },\n },\n /**\n * Once mounted, if it's the users first time here, then we wait 3 seconds,\n * and show the helpfull little keyboard shortcut dialog.\n * Then we listen for the Esc key to be pressed, and hide the dialog.\n */\n mounted() {\n const shouldHide = this.shouldHideWelcomeMessage();\n if (!shouldHide) {\n window.setTimeout(() => { this.shouldHide = shouldHide; }, this.timeDelay);\n window.addEventListener('keyup', this.keyPressEvent);\n } else { // Meh, component not needed.\n // No point wasting valuable bytes of your 32GB Ram, lets kill it\n this.$destroy();\n }\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n.kb-sc-info {\n position: fixed;\n width: 30em;\n bottom: 0;\n right: 10px;\n margin: 0.5em;\n padding: 0.1em 0.3em;\n z-index: 6;\n border-radius: 12px;\n border: 1px solid var(--welcome-popup-background);\n -webkit-box-shadow: 2px 1px 5px #130f23;\n box-shadow: 2px 1px 5px #130f23;\n border: 1px solid var(--welcome-popup-text-color);\n color: var(--welcome-popup-text-color);\n background: var(--welcome-popup-background);\n cursor: default;\n opacity: 0.94;\n @include phone {\n display: none;\n }\n h5 { /* The dialog title */\n position: absolute;\n top: -35px;\n left: 20px;\n border: 1px solid var(--welcome-popup-text-color);\n color: var(--welcome-popup-text-color);\n background: var(--welcome-popup-background);\n padding: 4px;\n border-radius: var(--curve-factor);\n }\n .close { /* The little exit icon, in top-right */\n float: right;\n border-radius: 20px;\n width: 1em;\n padding: 0 0 6px 6px;\n height: 1em;\n background: var(--transparent-50);\n margin-top: 3px;\n border: 1px solid transparent;\n cursor: pointer;\n &:hover {\n border: 1px solid var(--welcome-popup-text-color);\n opacity: var(--dimming-factor);\n }\n }\n}\n/* Animations, animations everywhere */\n.slide-fade-enter-active {\n transition: all 1s ease;\n}\n.slide-fade-leave-active {\n transition: all .8s cubic-bezier(.93,.01,.89,.5);\n}\n.slide-fade-enter, .slide-fade-leave-to {\n transform: translateY(35em);\n opacity: 0;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./KeyboardShortcutInfo.vue?vue&type=template&id=c5f17d9a&scoped=true&\"\nimport script from \"./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./KeyboardShortcutInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./KeyboardShortcutInfo.vue?vue&type=style&index=0&id=c5f17d9a&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"c5f17d9a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"55%\",\"height\":\"80%\",\"classes\":\"dashy-modal\"}},[_c('div',{staticClass:\"about-modal\"},[_c('router-link',{staticClass:\"title\",attrs:{\"to\":\"/about\"}},[_c('h2',[_vm._v(\"App Info\")])]),_c('h3',[_vm._v(\"Error Log\")]),(_vm.errorLog)?_c('pre',{staticClass:\"logs\"},[_c('code',[_vm._v(_vm._s(_vm.errorLog))])]):_c('p',[_vm._v(\"No recent errors detected :)\")]),_c('hr'),_c('h3',[_vm._v(\"Help & Support\")]),_vm._v(\" For getting support with running or configuring Dashy, see the \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/discussions\"}},[_vm._v(\"Discussions\")]),_c('h3',[_vm._v(\"Supporting Dashy\")]),_vm._v(\" For ways that you can get involved, check out the \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/docs/contributing.md\"}},[_vm._v(\"Contributing\")]),_vm._v(\" page. \"),_c('h3',[_vm._v(\"Report a Bug\")]),_vm._v(\" If you think you've found a bug, then please \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/issues/new/choose\"}},[_vm._v(\"raise an Issue\")]),_vm._v(\". \"),_c('h3',[_vm._v(\"More Info\")]),_vm._v(\" Source: \"),_c('a',{attrs:{\"href\":\"https://github.com/lissy93/dashy\"}},[_vm._v(\"github.com/lissy93/dashy\")]),_c('br'),_vm._v(\" Documentation: \"),_c('a',{attrs:{\"href\":\"https://dashy.to/docs\"}},[_vm._v(\"dashy.to/docs\")]),_c('h3',[_vm._v(\"License\")]),_vm._v(\" Licensed under MIT X11. Copyright \"),_c('a',{attrs:{\"href\":\"https://aliciasykes.com\"}},[_vm._v(\"Alicia Sykes\")]),_vm._v(\" © 2021.\"),_c('br'),_vm._v(\" For licenses for third-party modules, please see \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/.github/LEGAL.md\"}},[_vm._v(\"Legal\")]),_vm._v(\".\"),_c('br'),_vm._v(\" For the full list of contributors and thanks, see \"),_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/blob/master/docs/credits.md\"}},[_vm._v(\"Credits\")]),_vm._v(\". \"),_c('h3',[_vm._v(\"Version\")]),_c('AppVersion',{staticClass:\"app-version\"})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"modalName\" :resizable=\"true\" width=\"55%\" height=\"80%\" classes=\"dashy-modal\">\n <div class=\"about-modal\">\n <router-link to=\"/about\" class=\"title\"><h2>App Info</h2></router-link>\n <!-- Error Log -->\n <h3>Error Log</h3>\n <pre v-if=\"errorLog\" class=\"logs\"><code>{{ errorLog }}</code></pre>\n <p v-else>No recent errors detected :)</p>\n <hr />\n <!-- Help Links -->\n <h3>Help & Support</h3>\n For getting support with running or configuring Dashy, see the <a href=\"https://github.com/Lissy93/dashy/discussions\">Discussions</a>\n <h3>Supporting Dashy</h3>\n For ways that you can get involved, check out the <a href=\"https://github.com/Lissy93/dashy/blob/master/docs/contributing.md\">Contributing</a> page.\n <h3>Report a Bug</h3>\n If you think you've found a bug, then please <a href=\"https://github.com/Lissy93/dashy/issues/new/choose\">raise an Issue</a>.\n <h3>More Info</h3>\n Source: <a href=\"https://github.com/lissy93/dashy\">github.com/lissy93/dashy</a><br>\n Documentation: <a href=\"https://dashy.to/docs\">dashy.to/docs</a>\n <!-- License -->\n <h3>License</h3>\n Licensed under MIT X11. Copyright <a href=\"https://aliciasykes.com\">Alicia Sykes</a> © 2021.<br>\n For licenses for third-party modules, please see <a href=\"https://github.com/Lissy93/dashy/blob/master/.github/LEGAL.md\">Legal</a>.<br>\n For the full list of contributors and thanks, see <a href=\"https://github.com/Lissy93/dashy/blob/master/docs/credits.md\">Credits</a>.\n <!-- App Version -->\n <h3>Version</h3>\n <AppVersion class=\"app-version\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport AppVersion from '@/components/Configuration/AppVersion';\nimport { modalNames, sessionStorageKeys } from '@/utils/defaults';\n\nexport default {\n name: 'AppInfoModal',\n components: {\n AppVersion,\n },\n data() {\n return {\n modalName: modalNames.ABOUT_APP,\n appVersion: process.env.VUE_APP_VERSION,\n errorLog: this.getErrorLog(),\n };\n },\n methods: {\n getErrorLog() {\n return sessionStorage.getItem(sessionStorageKeys.ERROR_LOG) || '';\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nspan.options-label {\n color: var(--settings-text-color);\n}\n\ndiv.about-modal {\n background: var(--about-page-background);\n color: var(--about-page-color);\n overflow-y: auto;\n padding: 0 1rem;\n height: 100%;\n p, ul li, a {\n font-size: 1rem;\n }\n\n a.title {\n text-decoration: none;\n h2 {\n font-size: 1.8rem;\n text-align: center;\n margin: 1rem;\n }\n }\n h3 {\n font-size: 1.2rem;\n margin: 0.75rem 0 0.2rem 0;\n color: var(--about-page-accent);\n }\n a {\n color: var(--about-page-accent);\n }\n a.info {\n text-decoration: underline;\n margin-left: 0.2rem;\n }\n .app-version {\n text-align: left;\n }\n pre.logs {\n max-height: 200px;\n overflow-y: auto;\n padding: 1rem;\n font-size: 0.75rem;\n border-radius: var(--curve-factor-small);\n text-align: left;\n color: var(--white);\n background: var(--black);\n white-space: pre-wrap;\n }\n}\n\n</style>\n\n<style lang=\"scss\">\ndiv.about-modal {\n .app-version {\n text-align: left;\n display: flex;\n align-items: self-end;\n p { margin: 0; }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AppInfoModal.vue?vue&type=template&id=774db33a&scoped=true&\"\nimport script from \"./AppInfoModal.vue?vue&type=script&lang=js&\"\nexport * from \"./AppInfoModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppInfoModal.vue?vue&type=style&index=0&id=774db33a&scoped=true&lang=scss&\"\nimport style1 from \"./AppInfoModal.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"774db33a\",\n null\n \n)\n\nexport default component.exports","<template>\n <section>\n <SearchBar ref=\"SearchBar\"\n @user-is-searchin=\"userIsTypingSomething\"\n v-if=\"searchVisible\"\n />\n <div class=\"options-outer\">\n <div :class=\"`options-container ${!settingsVisible ? 'hide' : ''}`\">\n <ThemeSelector />\n <LayoutSelector :displayLayout=\"displayLayout\" />\n <ItemSizeSelector :iconSize=\"iconSize\" />\n <ConfigLauncher />\n <AuthButtons v-if=\"userState != 'noone'\" :userType=\"userState\" />\n </div>\n <div :class=\"`show-hide-container ${settingsVisible? 'hide-btn' : 'show-btn'}`\">\n <button @click=\"toggleSettingsVisibility()\"\n v-tooltip=\"`${settingsVisible? 'Hide' : 'Open'} Settings Menu`\" tabindex=\"-2\">\n <IconClose v-if=\"settingsVisible\" />\n <IconOpen v-else />\n </button>\n </div>\n </div>\n <KeyboardShortcutInfo />\n <AppInfoModal />\n </section>\n</template>\n\n<script>\nimport SearchBar from '@/components/Settings/SearchBar';\nimport ConfigLauncher from '@/components/Settings/ConfigLauncher';\nimport ThemeSelector from '@/components/Settings/ThemeSelector';\nimport LayoutSelector from '@/components/Settings/LayoutSelector';\nimport ItemSizeSelector from '@/components/Settings/ItemSizeSelector';\nimport AuthButtons from '@/components/Settings/AuthButtons';\nimport KeyboardShortcutInfo from '@/components/Settings/KeyboardShortcutInfo';\nimport AppInfoModal from '@/components/Configuration/AppInfoModal';\nimport IconOpen from '@/assets/interface-icons/config-open-settings.svg';\nimport IconClose from '@/assets/interface-icons/config-close.svg';\nimport {\n localStorageKeys,\n visibleComponents as defaultVisibleComponents,\n} from '@/utils/defaults';\n\nimport { getUserState } from '@/utils/Auth';\n\nexport default {\n name: 'SettingsContainer',\n props: {\n displayLayout: String,\n iconSize: String,\n externalThemes: Object,\n },\n components: {\n SearchBar,\n ConfigLauncher,\n ThemeSelector,\n LayoutSelector,\n ItemSizeSelector,\n AuthButtons,\n KeyboardShortcutInfo,\n AppInfoModal,\n IconOpen,\n IconClose,\n },\n data() {\n return {\n settingsVisible: true,\n };\n },\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n /**\n * Determines which button should display, based on the user type\n * 0 = Auth not configured, don't show anything\n * 1 = Auth condifured, and user logged in, show logout button\n * 2 = Auth configured, guest access enabled, and not logged in, show login\n * Note that if auth is enabled, but not guest access, and user not logged in,\n * then they will never be able to view the homepage, so no button needed\n */\n userState() {\n return getUserState();\n },\n /* Object indicating which components should be hidden, based on user preferences */\n visibleComponents() {\n return this.$store.getters.visibleComponents;\n },\n searchVisible() {\n return this.$store.getters.visibleComponents.searchBar;\n },\n },\n mounted() {\n this.settingsVisible = this.getSettingsVisibility();\n },\n methods: {\n userIsTypingSomething(something) {\n this.$emit('user-is-searchin', something);\n },\n clearFilterInput() {\n this.$refs.SearchBar.clearFilterInput();\n },\n getInitialTheme() {\n return this.appConfig.theme || '';\n },\n /* Gets user themes if available */\n getUserThemes() {\n const userThemes = this.appConfig.cssThemes || [];\n if (typeof userThemes === 'string') return [userThemes];\n return userThemes;\n },\n toggleSettingsVisibility() {\n this.settingsVisible = !this.settingsVisible;\n localStorage.setItem(localStorageKeys.HIDE_SETTINGS, this.settingsVisible);\n },\n getSettingsVisibility() {\n const screenWidth = document.body.clientWidth;\n if (screenWidth && screenWidth < 600) return false;\n return JSON.parse(localStorage[localStorageKeys.HIDE_SETTINGS]\n || (this.visibleComponents || defaultVisibleComponents).settings);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n section {\n display: flex;\n align-items: center;\n align-items: stretch;\n background: linear-gradient(0deg, var(--background) 0%, var(--background-darker) 100%);\n box-shadow: var(--settings-container-shadow);\n }\n .options-outer {\n display: flex;\n position: relative;\n flex: 1;\n background: var(--settings-background);\n border-radius: var(--curve-factor-navbar);\n }\n .options-container {\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n justify-content: flex-end;\n flex: 1;\n padding: 0.5rem 1.5rem 0.5rem 1rem;\n border-radius: var(--curve-factor-navbar) 0 0;\n background: var(--settings-background);\n div {\n margin-left: 0.5rem;\n opacity: var(--dimming-factor);\n opacity: 1;\n &:hover { opacity: 1; }\n }\n &.hide {\n display: none;\n }\n @include very-tiny-phone {\n flex-direction: column;\n align-items: baseline;\n div {\n width: 100%;\n text-align: center;\n .theme-selector-section { justify-content: center; }\n }\n }\n }\n\n .show-hide-container {\n display: flex;\n // align-items: center;\n background: var(--settings-background);\n color: var(--settings-text-color);\n width: 1.5rem;\n position: absolute;\n top: 4px;\n right: 4px;\n &.show-btn {\n width: 2rem;\n top: 0.5rem;\n right: 0.5rem;\n @include phone {\n top: -3rem !important;\n }\n }\n button {\n width: 100%;\n padding: 2px 2px 0 2px;\n margin: 2px;\n border-radius: var(--curve-factor);\n height: fit-content;\n background: none;\n border: none;\n color: var(--settings-text-color);\n cursor: pointer;\n opacity: var(--dimming-factor);\n }\n &:hover button {\n background: var(--settings-text-color);\n color: var(--settings-background);\n }\n }\n\n @include tablet {\n section {\n display: block;\n margin: 0 auto;\n background: none;\n .options-container {\n justify-content: center;\n }\n }\n }\n\n @include phone {\n .options-container, .show-hide-button {\n // display: none;\n }\n }\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SettingsContainer.vue?vue&type=template&id=37c7f086&scoped=true&\"\nimport script from \"./SettingsContainer.vue?vue&type=script&lang=js&\"\nexport * from \"./SettingsContainer.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SettingsContainer.vue?vue&type=style&index=0&id=37c7f086&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"37c7f086\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Collapsable',{attrs:{\"title\":_vm.title,\"icon\":_vm.icon,\"uniqueKey\":_vm.groupId,\"collapsed\":_vm.displayData.collapsed,\"cols\":_vm.displayData.cols,\"rows\":_vm.displayData.rows,\"color\":_vm.displayData.color,\"customStyles\":_vm.displayData.customStyles},on:{\"openEditSection\":_vm.openEditSection,\"openContextMenu\":_vm.openContextMenu}},[((!_vm.items || _vm.items.length < 1) && !_vm.isEditMode)?_c('div',{staticClass:\"no-items\"},[_vm._v(\" No Items to Show Yet \")]):_c('div',{class:(\"there-are-items \" + (_vm.isGridLayout? 'item-group-grid': '') + \" inner-size-\" + _vm.itemSize),style:(_vm.gridStyle),attrs:{\"id\":(\"section-\" + _vm.groupId)}},[_vm._l((_vm.sortedItems),function(item){return _c('Item',{key:item.id,attrs:{\"id\":item.id,\"url\":item.url,\"title\":item.title,\"description\":item.description,\"icon\":item.icon,\"target\":item.target,\"color\":item.color,\"backgroundColor\":item.backgroundColor,\"statusCheckUrl\":item.statusCheckUrl,\"statusCheckHeaders\":item.statusCheckHeaders,\"itemSize\":_vm.newItemSize,\"hotkey\":item.hotkey,\"provider\":item.provider,\"parentSectionTitle\":_vm.title,\"enableStatusCheck\":_vm.shouldEnableStatusCheck(item.statusCheck),\"statusCheckInterval\":_vm.getStatusCheckInterval(),\"statusCheckAllowInsecure\":item.statusCheckAllowInsecure,\"isAddNew\":false},on:{\"itemClicked\":function($event){return _vm.$emit('itemClicked')},\"triggerModal\":_vm.triggerModal}})}),(_vm.isEditMode)?_c('Item',{key:\"add-new\",staticClass:\"add-new-item\",attrs:{\"isAddNew\":true,\"parentSectionTitle\":_vm.title,\"icon\":\":heavy_plus_sign:\",\"id\":\"add-new\",\"title\":\"Add New Item\",\"description\":\"Click to add new item\",\"itemSize\":_vm.newItemSize}}):_vm._e(),_c('div',{ref:\"modalContainer\"})],2),_c('IframeModal',{ref:(\"iframeModal-\" + _vm.groupId),attrs:{\"name\":(\"iframeModal-\" + _vm.groupId)},on:{\"closed\":function($event){return _vm.$emit('itemClicked')}}}),(_vm.editMenuOpen)?_c('EditSection',{attrs:{\"sectionIndex\":_vm.index,\"isAddNew\":false},on:{\"closeEditSection\":_vm.closeEditSection}}):_vm._e(),_c('ContextMenu',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeContextMenu),expression:\"closeContextMenu\"}],attrs:{\"show\":_vm.contextMenuOpen,\"posX\":_vm.contextPos.posX,\"posY\":_vm.contextPos.posY,\"id\":(\"context-menu-\" + _vm.groupId)},on:{\"openEditSection\":_vm.openEditSection,\"navigateToSection\":_vm.navigateToSection,\"removeSection\":_vm.removeSection}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"item-wrapper wrap-size-\" + _vm.itemSize)},[_c('a',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.getTooltipOptions()),expression:\"getTooltipOptions()\"}],class:(\"item \" + _vm.makeClassList),style:((\"--open-icon: \" + (_vm.getUnicodeOpeningIcon()) + \"; \" + _vm.customStyles)),attrs:{\"href\":_vm.hyperLinkHref,\"target\":_vm.anchorTarget,\"rel\":\"noopener noreferrer\",\"tabindex\":\"0\",\"id\":(\"link-\" + _vm.id)},on:{\"click\":_vm.itemOpened,\"mouseup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"right\",39,$event.key,[\"Right\",\"ArrowRight\"])){ return null; }if('button' in $event && $event.button !== 2){ return null; }return _vm.openContextMenu.apply(null, arguments)},\"contextmenu\":function($event){$event.preventDefault();}}},[_c('div',{class:(\"tile-title \" + (!_vm.icon? 'bounce no-icon': '')),attrs:{\"id\":(\"tile-\" + _vm.id)}},[_c('span',{staticClass:\"text\"},[_vm._v(_vm._s(_vm.title))]),_c('p',{staticClass:\"description\"},[_vm._v(_vm._s(_vm.description))])]),_c('Icon',{staticClass:\"bounce\",style:(_vm.customStyles),attrs:{\"icon\":_vm.icon,\"url\":_vm.url,\"size\":_vm.itemSize,\"color\":_vm.color}}),_c('ItemOpenMethodIcon',{staticClass:\"opening-method-icon\",attrs:{\"isSmall\":!_vm.icon || _vm.itemSize === 'small',\"openingMethod\":_vm.accumulatedTarget,\"position\":\"bottom right\",\"hotkey\":_vm.hotkey}}),(_vm.enableStatusCheck)?_c('StatusIndicator',{staticClass:\"status-indicator\",attrs:{\"statusSuccess\":_vm.statusResponse ? _vm.statusResponse.successStatus : undefined,\"statusText\":_vm.statusResponse ? _vm.statusResponse.message : undefined}}):_vm._e(),(_vm.isEditMode)?_c('EditModeIcon',{staticClass:\"edit-mode-item\",on:{\"click\":function($event){return _vm.openItemSettings()}}}):_vm._e()],1),_c('ContextMenu',{directives:[{name:\"click-outside\",rawName:\"v-click-outside\",value:(_vm.closeContextMenu),expression:\"closeContextMenu\"}],attrs:{\"show\":_vm.contextMenuOpen && !_vm.isAddNew,\"posX\":_vm.contextPos.posX,\"posY\":_vm.contextPos.posY,\"id\":(\"context-menu-\" + _vm.id)},on:{\"launchItem\":_vm.launchItem,\"openItemSettings\":_vm.openItemSettings,\"openMoveItemMenu\":_vm.openMoveItemMenu,\"openDeleteItem\":_vm.openDeleteItem}}),(_vm.isEditMode)?_c('MoveItemTo',{attrs:{\"itemId\":_vm.id}}):_vm._e(),(_vm.editMenuOpen)?_c('EditItem',{attrs:{\"itemId\":_vm.id,\"isNew\":_vm.isAddNew,\"parentSectionTitle\":_vm.parentSectionTitle},on:{\"closeEditMenu\":_vm.closeEditMenu}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"item-icon wrapper-\" + _vm.size)},[(_vm.iconType === 'font-awesome')?_c('i',{class:(_vm.icon + \" \" + _vm.size)}):(_vm.iconType === 'emoji')?_c('i',{class:(\"emoji-icon \" + _vm.size)},[_vm._v(_vm._s(_vm.getEmoji(_vm.iconPath)))]):(_vm.iconType === 'mdi')?_c('span',{class:(\"mdi \" + _vm.icon + \" \" + _vm.size)}):(_vm.iconType === 'si')?_c('svg',{class:(\"simple-icons \" + _vm.size),attrs:{\"role\":\"img\",\"viewBox\":\"0 0 24 24\",\"xmlns\":\"http://www.w3.org/2000/svg\"}},[_c('path',{attrs:{\"d\":_vm.getSimpleIcon(_vm.icon)}})]):(_vm.icon)?_c('img',{class:(\"tile-icon \" + _vm.size + \" \" + (_vm.broken ? 'broken' : '')),attrs:{\"src\":_vm.iconPath},on:{\"error\":_vm.imageNotFound}}):_vm._e(),(_vm.broken)?_c('BrokenImage',{staticClass:\"missing-image\"}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`item-icon wrapper-${size}`\">\n <!-- Font-Awesome Icon -->\n <i v-if=\"iconType === 'font-awesome'\" :class=\"`${icon} ${size}`\" ></i>\n <!-- Emoji Icon -->\n <i v-else-if=\"iconType === 'emoji'\" :class=\"`emoji-icon ${size}`\" >{{getEmoji(iconPath)}}</i>\n <!-- Material Design Icon -->\n <span v-else-if=\"iconType === 'mdi'\" :class=\" `mdi ${icon} ${size}`\"></span>\n <!-- Simple-Icons -->\n <svg v-else-if=\"iconType === 'si'\" :class=\"`simple-icons ${size}`\" role=\"img\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path :d=\"getSimpleIcon(icon)\" />\n </svg>\n <!-- Standard image asset icon -->\n <img v-else-if=\"icon\" :src=\"iconPath\" @error=\"imageNotFound\"\n :class=\"`tile-icon ${size} ${broken ? 'broken' : ''}`\"\n />\n <!-- Icon could not load/ broken url -->\n <BrokenImage v-if=\"broken\" class=\"missing-image\" />\n </div>\n</template>\n\n<script>\nimport simpleIcons from 'simple-icons';\nimport BrokenImage from '@/assets/interface-icons/broken-icon.svg';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';\nimport emojiLookup from '@/utils/emojis.json';\nimport { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';\nimport { asciiHash } from '@/utils/MiscHelpers';\n\nexport default {\n name: 'Icon',\n props: {\n icon: String, // Path to icon asset\n url: String, // Used for fetching the favicon\n size: String, // Either small, medium or large\n },\n components: {\n BrokenImage,\n },\n computed: {\n /* Get appConfig from store */\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* Determines the type of icon */\n iconType: function iconType() {\n return this.determineImageType(this.icon);\n },\n /* Gets the icon path, dependent on icon type */\n iconPath: function iconPath() {\n return this.getIconPath(this.icon, this.url);\n },\n },\n data() {\n return {\n broken: false, // If true, was unable to resolve icon\n };\n },\n methods: {\n /* Check if a string is in a URL format. Used to identify tile icon source */\n isUrl(str) {\n const pattern = new RegExp(/(http|https):\\/\\/(\\w+:{0,1}\\w*)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%!\\-/]))?/);\n return pattern.test(str);\n },\n /* Returns true if the input is a path to an image file */\n isImage(img) {\n const fileExtRegex = /(?:\\.([^.]+))?$/;\n const validImgExtensions = ['svg', 'png', 'jpg'];\n const splitPath = fileExtRegex.exec(img);\n if (splitPath.length >= 1) return validImgExtensions.includes(splitPath[1]);\n return false;\n },\n /* Determins if a given string is an emoji, and if so what type it is */\n isEmoji(img) {\n if (EmojiUnicodeRegex.test(img) && img.match(/./gu).length) { // Is a unicode emoji\n return { isEmoji: true, emojiType: 'glyph' };\n } else if (new RegExp(/^:.*:$/).test(img)) { // Is a shortcode emoji\n return { isEmoji: true, emojiType: 'shortcode' };\n } else if (img.substring(0, 2) === 'U+' && img.length === 7) {\n return { isEmoji: true, emojiType: 'unicode' };\n }\n return { isEmoji: false, emojiType: '' };\n },\n /* Formats and gets emoji from unicode or shortcode */\n getEmoji(emojiCode) {\n const { emojiType } = this.isEmoji(emojiCode);\n if (emojiType === 'shortcode') {\n if (emojiLookup[emojiCode]) return emojiLookup[emojiCode];\n } else if (emojiType === 'unicode') {\n return String.fromCodePoint(parseInt(emojiCode.substr(2), 16));\n }\n return emojiCode; // Emoji is a glyph already, just return\n },\n /* Get favicon URL, for items which use the favicon as their icon */\n getFavicon(fullUrl, specificApi) {\n if (this.shouldUseDefaultFavicon(fullUrl)) { // Check if we should use local icon\n const urlParts = fullUrl.split('/');\n if (urlParts.length >= 2) return `${urlParts[0]}/${urlParts[1]}/${urlParts[2]}/${iconCdns.faviconName}`;\n } else if (fullUrl.includes('http')) { // Service is running publicly\n const host = this.getHostName(fullUrl);\n const faviconApi = specificApi || this.appConfig.faviconApi || defaultFaviconApi;\n const endpoint = faviconApiEndpoints[faviconApi];\n return endpoint.replace('$URL', host);\n }\n return '';\n },\n /* Get the URL for a favicon, but using the non-default favicon API */\n getCustomFavicon(fullUrl, faviconIdentifier) {\n const faviconApi = faviconIdentifier.split('favicon-')[1];\n if (!faviconApi) {\n ErrorHandler('Favicon API not specified');\n } else if (!Object.keys(faviconApiEndpoints).includes(faviconApi)) {\n ErrorHandler(`The specified favicon API, '${faviconApi}' cannot be found.`);\n } else {\n return this.getFavicon(fullUrl, faviconApi);\n }\n // Error encountered, favicon service not found\n this.broken = true;\n return undefined;\n },\n /* If using favicon for icon, and if service is running locally (determined by local IP) */\n /* or if user prefers local favicon, then return true */\n shouldUseDefaultFavicon(fullUrl) {\n const isLocalIP = /(127\\.)|(192\\.168\\.)|(10\\.)|(172\\.1[6-9]\\.)|(172\\.2[0-9]\\.)|(172\\.3[0-1]\\.)|(::1$)|([fF][cCdD])|(localhost)/;\n return (isLocalIP.test(fullUrl) || this.appConfig.faviconApi === 'local');\n },\n /* Fetches the path of local images, from Docker container */\n getLocalImagePath(img) {\n return `${iconCdns.localPath}/${img}`;\n },\n /* Formats the URL for fetching the generative icons */\n getGenerativeIcon(url) {\n const host = encodeURI(url) || Math.random().toString();\n return iconCdns.generative.replace('{icon}', asciiHash(host));\n },\n /* Returns the SVG path content */\n getSimpleIcon(img) {\n const imageName = img.replace('si-', '');\n const icon = simpleIcons.Get(imageName);\n return icon.path;\n },\n /* Gets home-lab icon from GitHub */\n getHomeLabIcon(img) {\n const imageName = img.replace('hl-', '').toLocaleLowerCase();\n return iconCdns.homeLabIcons.replace('{icon}', imageName);\n },\n /* Checks if the icon is from a local image, remote URL, SVG or font-awesome */\n getIconPath(img, url) {\n switch (this.determineImageType(img)) {\n case 'url': return img;\n case 'img': return this.getLocalImagePath(img);\n case 'favicon': return this.getFavicon(url);\n case 'custom-favicon': return this.getCustomFavicon(url, img);\n case 'generative': return this.getGenerativeIcon(url);\n case 'mdi': return img; // Material design icons\n case 'simple-icons': return this.getSimpleIcon(img);\n case 'home-lab-icons': return this.getHomeLabIcon(img);\n case 'svg': return img; // Local SVG icon\n case 'emoji': return img; // Emoji/ unicode\n default: return '';\n }\n },\n /* Checks if the icon is from a local image, remote URL, SVG or font-awesome */\n determineImageType(img) {\n let imgType = '';\n if (!img) imgType = 'none';\n else if (this.isUrl(img)) imgType = 'url';\n else if (this.isImage(img)) imgType = 'img';\n else if (img.includes('fa-')) imgType = 'font-awesome';\n else if (img.includes('mdi-')) imgType = 'mdi';\n else if (img.includes('si-')) imgType = 'si';\n else if (img.includes('hl-')) imgType = 'home-lab-icons';\n else if (img.includes('favicon-')) imgType = 'custom-favicon';\n else if (img === 'favicon') imgType = 'favicon';\n else if (img === 'generative') imgType = 'generative';\n else if (this.isEmoji(img).isEmoji) imgType = 'emoji';\n else imgType = 'none';\n return imgType;\n },\n /* For a given URL, return the hostname only. Used for favicon and generative icons */\n getHostName(url) {\n try { return new URL(url).hostname; } catch (e) { return url; }\n },\n /* Called when the path to the image cannot be resolved */\n imageNotFound() {\n this.broken = true;\n ErrorHandler(`The path to '${this.icon}' could not be resolved`);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n/* Icon wraper */\n.item-icon {\n &.wrapper-medium {\n min-height: 2.5rem;\n }\n &.wrapper-large {\n min-width: 3.5rem;\n text-align: center;\n }\n}\n\n /* Default Image Icon */\n .tile-icon {\n min-width: 1rem;\n max-width: 2rem;\n min-height: 1rem;\n max-height: 2rem;\n object-fit: cover;\n filter: var(--item-icon-transform);\n border-radius: var(--curve-factor);\n &.small {\n max-width: 1.5rem;\n max-height: 1.5rem;\n }\n &.large {\n max-width: 3rem;\n max-height: 3rem;\n }\n &.broken {\n display: none;\n }\n }\n /* Font-Awesome and Material Design Icons */\n i.fas, i.fab, i.far, i.fal, i.fad, span.mdi {\n font-size: 2rem;\n color: currentColor;\n margin: 1px 4px;\n &.small {\n font-size: 1.5rem;\n }\n &.large {\n font-size: 2.5rem;\n }\n }\n span.mdi {\n font-size: 2.5rem;\n }\n object.tile-icon {\n width: 55px;\n height: 55px;\n svg, svg g, svg g path {\n fill: currentColor;\n }\n }\n /* Simple Icons */\n .item-icon .simple-icons {\n width: 2rem;\n &.small { width: 1.5rem; }\n &.large { width: 2.5rem; }\n }\n\n .item-icon .simple-icons path {\n fill: currentColor;\n }\n /* Emoji Icons */\n i.emoji-icon {\n font-style: normal;\n font-size: 2rem;\n margin: 0.2rem;\n &.small {\n font-size: 1.5rem;\n }\n &.large {\n font-size: 2.5rem;\n }\n }\n /* Icon Not Found */\n .missing-image {\n width: 3.5rem;\n path {\n fill: currentColor;\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemIcon.vue?vue&type=template&id=d4b15db4&\"\nimport script from \"./ItemIcon.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemIcon.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemIcon.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('div',{class:_vm.makeClass(_vm.position, _vm.isSmall, _vm.isTransparent)},[(_vm.openingMethod === 'newtab')?_c('NewTabOpenIcon'):(_vm.openingMethod === 'sametab')?_c('SameTabOpenIcon'):(_vm.openingMethod === 'modal')?_c('IframeOpenIcon'):(_vm.openingMethod === 'workspace')?_c('WorkspaceOpenIcon'):(_vm.openingMethod === 'parent')?_c('ParentOpenIcon'):(_vm.openingMethod === 'top')?_c('TopOpenIcon'):_c('UnknownIcon')],1),(_vm.hotkey)?_c('div',{class:(\"hotkey-denominator \" + (_vm.makeClass(_vm.position, _vm.isSmall, _vm.isTransparent)))},[_vm._v(\" \"+_vm._s(_vm.hotkey)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <div :class=\"makeClass(position, isSmall, isTransparent)\">\n <NewTabOpenIcon v-if=\"openingMethod === 'newtab'\" />\n <SameTabOpenIcon v-else-if=\"openingMethod === 'sametab'\" />\n <IframeOpenIcon v-else-if=\"openingMethod === 'modal'\" />\n <WorkspaceOpenIcon v-else-if=\"openingMethod === 'workspace'\" />\n <ParentOpenIcon v-else-if=\"openingMethod === 'parent'\" />\n <TopOpenIcon v-else-if=\"openingMethod === 'top'\" />\n <UnknownIcon v-else />\n </div>\n <div v-if=\"hotkey\" :class=\"`hotkey-denominator ${makeClass(position, isSmall, isTransparent)}`\">\n {{ hotkey }}\n </div>\n </div>\n</template>\n\n<script>\n/* This component displays a small icon, indicating opening method */\n\n// Import Icons\nimport NewTabOpenIcon from '@/assets/interface-icons/open-new-tab.svg';\nimport SameTabOpenIcon from '@/assets/interface-icons/open-current-tab.svg';\nimport IframeOpenIcon from '@/assets/interface-icons/open-iframe.svg';\nimport WorkspaceOpenIcon from '@/assets/interface-icons/open-workspace.svg';\nimport ParentOpenIcon from '@/assets/interface-icons/open-parent.svg';\nimport TopOpenIcon from '@/assets/interface-icons/open-top.svg';\nimport UnknownIcon from '@/assets/interface-icons/unknown-icon.svg';\n\nexport default {\n name: 'ItemOpenMethodIcon',\n props: {\n openingMethod: String, // newtab | sametab | parent | top | modal | workspace\n isSmall: Boolean, // If true, will apply small class\n position: String, // Position classes: top, bottom, left, right\n isTransparent: Boolean, // If true, will apply opacity\n hotkey: Number, // Optional hotkey to also display\n },\n methods: {\n /* Returns custom class string, from optional props */\n makeClass(position = 'top right', isSmall = false, transparent = false) {\n return `opening-method-icon\n ${position || 'top right'}\n ${isSmall ? 'short' : ''}\n ${transparent ? 'transparent' : ''}`;\n },\n },\n components: {\n NewTabOpenIcon,\n SameTabOpenIcon,\n IframeOpenIcon,\n WorkspaceOpenIcon,\n ParentOpenIcon,\n TopOpenIcon,\n UnknownIcon,\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.opening-method-icon {\n svg {\n position: absolute;\n width: 1rem;\n margin: 2px;\n path {\n fill: currentColor;\n }\n }\n &.top svg { top: 0; }\n &.bottom svg { bottom: 0; }\n &.left svg { left: 0; }\n &.right svg { right: 0; }\n\n &.short svg {\n width: 0.8rem;\n margin: 0;\n }\n\n &.transparent svg {\n opacity: 0.5;\n }\n}\n\ndiv.hotkey-denominator {\n position: absolute;\n font-size: 0.8rem;\n margin: 2px;\n bottom: 2px;\n color: currentColor;\n border-radius: 18px;\n border: 1px solid currentColor;\n padding: 0.1rem 0.4rem 0.2rem 0.4rem;\n &.top { right: 0; } // Position opposite of opening method icon\n &.bottom { left: 0; }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemOpenMethodIcon.vue?vue&type=template&id=3bd0e154&scoped=true&\"\nimport script from \"./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemOpenMethodIcon.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemOpenMethodIcon.vue?vue&type=style&index=0&id=3bd0e154&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3bd0e154\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:({\n content: _vm.statusText || _vm.otherStatusText,\n classes: ['status-tooltip', (\"tip-\" + (_vm.color()))],\n delay: { show: 0, hide: 150 }\n }),expression:\"{\\n content: statusText || otherStatusText,\\n classes: ['status-tooltip', `tip-${color()}`],\\n delay: { show: 0, hide: 150 }\\n }\"}],staticClass:\"indicator\"},[_c('div',{class:(\"dot dot-\" + (_vm.color()))},[_vm._m(0)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',[_c('span')])}]\n\nexport { render, staticRenderFns }","<template>\n <div class=\"indicator\"\n v-tooltip=\"{\n content: statusText || otherStatusText,\n classes: ['status-tooltip', `tip-${color()}`],\n delay: { show: 0, hide: 150 }\n }\">\n <div :class=\"`dot dot-${color()}`\">\n <span><span></span></span>\n </div>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'StatusIndicator',\n props: {\n statusText: String,\n statusSuccess: Boolean,\n },\n methods: {\n /* Returns a color, based on success status */\n color() {\n switch (this.statusSuccess) {\n case undefined: return ((new Date() - this.startTime) > 2000) ? 'grey' : 'yellow';\n case true: return 'green'; // Success!\n default: return 'red'; // Not success, therefore failure\n }\n },\n },\n data() {\n return {\n startTime: new Date(), // Used for timeout\n otherStatusText: 'Checking...', // Used before server has responded\n };\n },\n mounted() {\n setTimeout(() => {\n if (!this.statusText) this.otherStatusText = 'Request timed out';\n }, 2000);\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n.indicator {\n padding: 5px;\n transition: all .2s ease-in-out;\n cursor: help;\n z-index: 5;\n &:hover {\n transform: scale(1.25);\n filter: saturate(2);\n opacity: 1;\n }\n}\n\n@keyframes pulse {\n 0% { opacity: .75; transform: scale(1); }\n 25% { opacity: 0.75; transform: scale(1); }\n 100% { opacity: 0; transform: scale(1.8); }\n}\n@keyframes applyOpacity {\n 50% { opacity: 0.9; }\n to { opacity: 0.8; }\n}\n\n.dot {\n border-radius: 50%;\n height: 12px;\n width: 12px;\n animation: applyOpacity 1s ease-in 8s forwards;\n > span, > span span, > span span:after {\n animation: pulse 1s linear 0.5s 2;\n border-radius: 50%;\n display: block;\n height: 12px;\n width: 12px;\n content: '';\n }\n &.dot-green {\n background-color: var(--success);\n span, span:after {\n background-color: var(--success);\n opacity: 0.4;\n }\n }\n &.dot-red {\n background-color: var(--danger);\n span, span:after {\n background-color: var(--danger);\n opacity: 0.4;\n }\n }\n &.dot-yellow {\n background-color: var(--warning);\n span, span:after {\n background-color: var(--warning);\n opacity: 0.4;\n }\n }\n &.dot-grey {\n background-color: var(--medium-grey);\n span, span:after {\n background-color: var(--medium-grey);\n opacity: 0.4;\n }\n }\n}\n\n</style>\n\n<style lang=\"scss\">\n.status-tooltip {\n background: var(--status-check-tooltip-background) !important;\n color: var(--status-check-tooltip-color);\n font-size: 1rem;\n z-index: 10;\n &.tip-grey { --status-color: var(--medium-grey); }\n &.tip-green { --status-color: var(--success); }\n &.tip-yellow { --status-color: var(--warning); }\n &.tip-red { --status-color: var(--danger); }\n .tooltip-inner {\n border: 1px solid var(--status-color);\n // color: var(--status-color);\n }\n .tooltip-arrow {\n --description-tooltip-color: var(--status-color);\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./StatusIndicator.vue?vue&type=template&id=d1a6f18c&scoped=true&\"\nimport script from \"./StatusIndicator.vue?vue&type=script&lang=js&\"\nexport * from \"./StatusIndicator.vue?vue&type=script&lang=js&\"\nimport style0 from \"./StatusIndicator.vue?vue&type=style&index=0&id=d1a6f18c&scoped=true&lang=scss&\"\nimport style1 from \"./StatusIndicator.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"d1a6f18c\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-item\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-item-inner\"},[_c('h3',{staticClass:\"title\"},[_vm._v(\"Edit Item\")]),_c('p',{staticClass:\"sub-title\"},[_vm._v(\"Editing \"+_vm._s(_vm.item.title)+\" (ID: \"+_vm._s(_vm.itemId)+\")\")]),(_vm.formData.length === 0)?_c('p',{staticClass:\"warning-note\"},[_vm._v(\" No data configured yet. Click an attribute in the list below to add the field to the form. \")]):_vm._e(),_vm._l((_vm.formData),function(row,index){return _c('div',{key:row.name,staticClass:\"row\"},[(row.type === 'text' || row.type === 'number')?_c('Input',{attrs:{\"description\":row.description,\"label\":row.title || row.name,\"type\":row.type,\"layout\":\"horizontal\"},model:{value:(_vm.formData[index].value),callback:function ($$v) {_vm.$set(_vm.formData[index], \"value\", $$v)},expression:\"formData[index].value\"}}):(row.type === 'boolean')?_c('Radio',{attrs:{\"description\":row.description,\"label\":row.title || row.name,\"options\":[].concat( _vm.boolRadioOptions ),\"initialOption\":_vm.boolToStr(_vm.formData[index].value)},model:{value:(_vm.formData[index].value),callback:function ($$v) {_vm.$set(_vm.formData[index], \"value\", $$v)},expression:\"formData[index].value\"}}):(row.type === 'select')?_c('Select',{staticClass:\"edit-item-select\",attrs:{\"options\":_vm.formData[index].enum,\"description\":row.description,\"initialOption\":_vm.formData[index].value,\"label\":row.title || row.name},model:{value:(_vm.formData[index].value),callback:function ($$v) {_vm.$set(_vm.formData[index], \"value\", $$v)},expression:\"formData[index].value\"}}):_c('div',[_vm._v(\" \"+_vm._s(row.name)+\" cannot currently be edited through the UI. \")]),_c('BinIcon',{on:{\"click\":function () { return _vm.removeField(row.name); }}})],1)}),(_vm.additionalFormData.length > 0)?_c('div',{staticClass:\"add-more-inputs\"},[_c('h4',[_vm._v(\"More Fields\")]),_c('div',{staticClass:\"more-fields\"},_vm._l((_vm.additionalFormData),function(row){return _c('span',{key:row.name,staticClass:\"add-field-tag\",on:{\"click\":function () { return _vm.appendNewField(row.name); }}},[_c('AddIcon'),_vm._v(\" \"+_vm._s(row.title || row.name)+\" \")],1)}),0)]):_vm._e(),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveItem,\"cancelClick\":_vm.modalClosed}})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"save-cancel-btn-container\"},[_c('Button',{staticClass:\"save-app-config-btn\",attrs:{\"click\":_vm.saveClick}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-stage-btn'))+\" \"),_c('SaveIcon')],1),_c('Button',{staticClass:\"save-app-config-btn\",attrs:{\"click\":_vm.cancelClick}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.cancel-stage-btn'))+\" \"),_c('CancelIcon')],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"save-cancel-btn-container\">\n <Button class=\"save-app-config-btn\" :click=\"saveClick\">\n {{ $t('interactive-editor.menu.save-stage-btn') }}\n <SaveIcon />\n </Button>\n <Button class=\"save-app-config-btn\" :click=\"cancelClick\">\n {{ $t('interactive-editor.menu.cancel-stage-btn') }}\n <CancelIcon />\n </Button>\n </div>\n</template>\n\n<script>\n\nimport Button from '@/components/FormElements/Button';\nimport SaveIcon from '@/assets/interface-icons/save-config.svg';\nimport CancelIcon from '@/assets/interface-icons/config-close.svg';\n\nexport default {\n name: 'SaveCancelButton',\n props: {\n saveClick: Function,\n cancelClick: Function,\n },\n components: {\n Button,\n SaveIcon,\n CancelIcon,\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.save-cancel-btn-container {\n display: flex;\n margin: 0.5rem 0;\n justify-content: center;\n border-top: 1px dashed var(--interactive-editor-color);\n button {\n margin: 1rem 0.5rem;\n color: var(--interactive-editor-color);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n svg {\n border: none;\n width: 1.2rem;\n height: 1.2rem;\n }\n &:hover {\n color: var(--interactive-editor-background);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-color);\n svg {\n background: var(--interactive-editor-color);\n path { fill: var(--interactive-editor-background); }\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SaveCancelButtons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SaveCancelButtons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SaveCancelButtons.vue?vue&type=template&id=e813bfa0&scoped=true&\"\nimport script from \"./SaveCancelButtons.vue?vue&type=script&lang=js&\"\nexport * from \"./SaveCancelButtons.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SaveCancelButtons.vue?vue&type=style&index=0&id=e813bfa0&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"e813bfa0\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"select-container\"},[(_vm.label)?_c('label',{staticClass:\"select-label\"},[_vm._v(_vm._s(_vm.label))]):_vm._e(),_c('v-select',{staticClass:\"form-dropdown\",attrs:{\"value\":_vm.selectedOption,\"selectOnTab\":true,\"options\":_vm.options},on:{\"input\":_vm.updateValue}}),(_vm.description)?_c('p',{staticClass:\"select-description\"},[_vm._v(_vm._s(_vm.description))]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"select-container\">\n <label v-if=\"label\" class=\"select-label\">{{ label }}</label>\n <v-select\n @input=\"updateValue\"\n :value=\"selectedOption\"\n :selectOnTab=\"true\"\n :options=\"options\"\n class=\"form-dropdown\"\n />\n <p v-if=\"description\" class=\"select-description\">{{ description }}</p>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Select',\n components: {},\n props: {\n options: Array, // Array of available options\n initialOption: String, // Optional default option\n label: String, // Form label for element\n description: String, // Optional description text\n },\n data() {\n return {\n selectedOption: '', // The currently selected val\n };\n },\n created() {\n if (this.initialOption) {\n this.selectedOption = this.initialOption;\n }\n },\n methods: {\n updateValue(value) {\n this.$emit('input', value);\n this.selectedOption = value;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\ndiv.select-container {\n margin: 0.25rem auto;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n label.select-label,\n .form-dropdown,\n p.select-description {\n margin: 0.25rem;\n flex-basis: 8rem;\n flex-grow: 1;\n }\n label.select-label {\n text-transform: capitalize;\n }\n p.select-description {\n flex-grow: 3;\n opacity: var(--dimming-factor);\n }\n .form-dropdown {\n flex-grow: 2;\n min-width: 12rem;\n margin: 0.5rem auto;\n font-size: 1.2rem;\n box-sizing: border-box;\n color: var(--primary);\n background: var(--background);;\n border-radius: var(--curve-factor);\n &:focus {\n box-shadow: 1px 1px 6px var(--config-settings-color);\n outline: none;\n }\n }\n @include tablet-down {\n flex-direction: column;\n align-items: start;\n label.select-label,\n .form-dropdown,\n p.select-description {\n margin: 0.5rem;\n flex-basis: auto;\n }\n }\n}\n</style>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n\n.form-dropdown {\n margin: 1rem auto;\n ul.vs__dropdown-menu {\n max-height: 14rem;\n @extend .scroll-bar;\n }\n input.vs__search {\n color: var(--primary);\n }\n div.vs__dropdown-toggle {\n padding: 0.2rem 0;\n border-color: var(--primary);\n background: var(--background);\n .vs__actions svg {\n height: 1.2rem;\n width: 1.2rem;\n border: none;\n margin: 0;\n padding: 0.2rem 0 0 0.2rem;\n &:hover {\n background: var(--primary);\n path { fill: var(--background); }\n }\n }\n }\n div, input {\n cursor: pointer;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Select.vue?vue&type=template&id=3921c087&scoped=true&\"\nimport script from \"./Select.vue?vue&type=script&lang=js&\"\nexport * from \"./Select.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Select.vue?vue&type=style&index=0&id=3921c087&scoped=true&lang=scss&\"\nimport style1 from \"./Select.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"3921c087\",\n null\n \n)\n\nexport default component.exports","<template>\n <modal\n :name=\"modalName\"\n :resizable=\"true\"\n width=\"50%\"\n height=\"80%\"\n classes=\"dashy-modal edit-item\"\n @closed=\"modalClosed\"\n >\n <div class=\"edit-item-inner\">\n <!-- Title and Item ID -->\n <h3 class=\"title\">Edit Item</h3>\n <p class=\"sub-title\">Editing {{item.title}} (ID: {{itemId}})</p>\n <!-- If no elements added to form, show info message -->\n <p class=\"warning-note\" v-if=\"formData.length === 0\">\n No data configured yet. Click an attribute in the list below to add the field to the form.\n </p>\n <!-- For each data attribute, render the correct type of input field -->\n <div class=\"row\" v-for=\"(row, index) in formData\" :key=\"row.name\">\n <!-- Text box, for text/ number/ raw input elements -->\n <Input\n v-if=\"row.type === 'text' || row.type === 'number'\"\n v-model=\"formData[index].value\"\n :description=\"row.description\"\n :label=\"row.title || row.name\"\n :type=\"row.type\"\n layout=\"horizontal\"\n />\n <!-- Radio button, used for True or False input -->\n <Radio\n v-else-if=\"row.type === 'boolean'\"\n v-model=\"formData[index].value\"\n :description=\"row.description\"\n :label=\"row.title || row.name\"\n :options=\"[ ...boolRadioOptions ]\"\n :initialOption=\"boolToStr(formData[index].value)\"\n />\n <!-- Select/ dropdown for enum multiple-choice input -->\n <Select\n v-else-if=\"row.type === 'select'\"\n v-model=\"formData[index].value\"\n :options=\"formData[index].enum\"\n :description=\"row.description\"\n :initialOption=\"formData[index].value\"\n :label=\"row.title || row.name\"\n class=\"edit-item-select\"\n />\n <!-- Warning note, for any other data types, that aren't yet supported -->\n <div v-else>\n {{ row.name }} cannot currently be edited through the UI.\n </div>\n <BinIcon @click=\"() => removeField(row.name)\" />\n </div>\n <!-- Show Add chips, for adding more data elements to the form -->\n <div class=\"add-more-inputs\" v-if=\"additionalFormData.length > 0\">\n <h4>More Fields</h4>\n <div class=\"more-fields\">\n <span\n v-for=\"row in additionalFormData\"\n :key=\"row.name\"\n @click=\"() => appendNewField(row.name)\"\n class=\"add-field-tag\">\n <AddIcon /> {{ row.title || row.name }}\n </span>\n </div>\n </div>\n <!-- Save to state button -->\n <SaveCancelButtons :saveClick=\"saveItem\" :cancelClick=\"modalClosed\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport AddIcon from '@/assets/interface-icons/interactive-editor-add.svg';\nimport BinIcon from '@/assets/interface-icons/interactive-editor-remove.svg';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\nimport Input from '@/components/FormElements/Input';\nimport Radio from '@/components/FormElements/Radio';\nimport Select from '@/components/FormElements/Select';\nimport StoreKeys from '@/utils/StoreMutations';\nimport DashySchema from '@/utils/ConfigSchema';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'EditItem',\n data() {\n return {\n modalName: modalNames.EDIT_ITEM,\n schema: DashySchema.properties.sections.items.properties.items.items.properties,\n formData: [], // Array of form fields\n additionalFormData: [], // Array of not-yet-used form fields\n item: {},\n boolRadioOptions: [\n { label: 'true', value: 'true' },\n { label: 'false', value: 'false' },\n ],\n };\n },\n props: {\n itemId: String,\n isNew: Boolean,\n parentSectionTitle: String, // If adding new item, which section to add it under\n },\n computed: {},\n components: {\n Input,\n Radio,\n Select,\n AddIcon,\n BinIcon,\n SaveCancelButtons,\n },\n mounted() {\n if (!this.isNew) { // Get existing item data\n this.item = this.getItemFromState(this.itemId);\n }\n this.formData = this.makeInitialFormData();\n this.$modal.show(modalNames.EDIT_ITEM);\n },\n methods: {\n /* For a given item ID, return the item obj from store */\n getItemFromState(id) {\n return this.$store.getters.getItemById(id);\n },\n /* Using the schema, make data structure for the UI form fields to use */\n makeRowData(property) {\n return {\n name: property,\n description: this.schema[property].description,\n value: this.item[property],\n type: this.getInputType(this.schema[property]),\n enum: this.schema[property].enum,\n title: this.schema[property].title,\n };\n },\n /* Make formatted data structure to be rendered as form elements */\n makeInitialFormData() {\n const formData = [];\n const requiredFields = ['title', 'description', 'url', 'icon', 'target'];\n const unneededFields = ['id'];\n const isPrimaryField = (property) => (\n this.item[property] || requiredFields.includes(property)\n ) && !unneededFields.includes(property);\n Object.keys(this.schema).forEach((property) => {\n const singleRow = this.makeRowData(property);\n if (isPrimaryField(property)) {\n formData.push(singleRow);\n } else {\n this.additionalFormData.push(singleRow);\n }\n });\n return formData;\n },\n /* Convert boolean to string */\n boolToStr(bool) {\n if (bool) return 'true';\n if (bool === false) return 'false';\n return undefined;\n },\n /* Adds field from extras list to main form, then removes from extras list */\n appendNewField(fieldId) {\n Object.keys(this.schema).forEach((property) => {\n if (property === fieldId) {\n this.formData.push(this.makeRowData(property));\n }\n });\n this.additionalFormData.forEach((elem, index) => {\n if (elem.name === fieldId) {\n this.additionalFormData.splice(index, 1);\n }\n });\n },\n /* On Remove Field click, removes field from main form, and adds to chip list */\n removeField(fieldId) {\n this.formData.forEach((elem, index) => {\n if (elem.name === fieldId) {\n this.formData.splice(index, 1);\n this.additionalFormData.push(elem);\n }\n });\n },\n /* Use schema to determine type of form element to render, for a given attribute */\n getInputType(schemaItem) {\n const definedType = schemaItem.type;\n if (definedType === 'text') {\n return 'text';\n } else if (definedType === 'number') {\n return 'number';\n } else if (definedType === 'boolean') {\n return 'boolean';\n } else if (schemaItem.enum) {\n return 'select';\n }\n return 'text';\n },\n /* Saves the updated item to VueX Store */\n saveItem() {\n // Convert form data back into section.item data structure\n const structured = {};\n this.formData.forEach((row) => { structured[row.name] = row.value; });\n // Some attributes need a little extra formatting\n const newItem = this.formatBeforeSave(structured);\n if (this.isNew) { // Insert new item into data store\n newItem.id = `temp_${newItem.title}`;\n const payload = { newItem, targetSection: this.parentSectionTitle };\n this.$store.commit(StoreKeys.INSERT_ITEM, payload);\n } else { // Update existing item from form data, in the store\n this.$store.commit(StoreKeys.UPDATE_ITEM, { newItem, itemId: this.itemId });\n }\n // If we're not already in edit mode, enable it now\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n // Close edit menu\n this.$emit('closeEditMenu');\n },\n /* Some fields require a bit of extra processing before they're saved */\n formatBeforeSave(item) {\n const newItem = item;\n newItem.id = this.itemId;\n if (newItem.hotkey) newItem.hotkey = parseInt(newItem.hotkey, 10);\n const strToTags = (str) => {\n const tagArr = str.split(',');\n return tagArr.map((tag) => tag.trim().toLowerCase().replace(/[^a-z]+/, ''));\n };\n const strToBool = (str) => {\n if (str === undefined) return undefined;\n return str === 'true';\n };\n if (newItem.tags) newItem.tags = strToTags(newItem.tags);\n if (newItem.statusCheck) newItem.statusCheck = strToBool(newItem.statusCheck);\n // if (newItem.hotkey) newItem.hotkey = parseInt(newItem.hotkey, 10);\n return newItem;\n },\n /* Clean up work, triggered when modal closed */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$emit('closeEditMenu');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n\n.edit-item-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .svg-button;\n h3.title {\n font-size: 1.5rem;\n margin: 0.25rem 0;\n }\n p.sub-title {\n margin: 0.25rem 0;\n font-size: 0.8rem;\n font-style: italic;\n opacity: var(--dimming-factor);\n }\n p.warning-note {\n color: var(--warning);\n }\n .row {\n display: flex;\n padding: 0.5rem 0.25rem;\n &:not(:last-child) {\n border-bottom: 1px dotted var(--interactive-editor-color);\n }\n .input-container, .select-container {\n width: 100%;\n input.input-field {\n font-size: 1rem;\n padding: 0.35rem 0.5rem;\n }\n }\n }\n .more-fields {\n display: flex;\n flex-wrap: wrap;\n span.add-field-tag {\n margin: 0.2rem;\n padding: 0.2rem 0.5rem;;\n min-width: 2rem;\n display: flex;\n align-items: center;\n cursor: pointer;\n text-align: center;\n border: 1px solid var(--interactive-editor-color);\n border-radius: var(--curve-factor);\n &:hover {\n background: var(--interactive-editor-color);\n color: var(--interactive-editor-background);\n svg {\n background: var(--interactive-editor-color);\n path { fill: var(--interactive-editor-background); }\n }\n }\n svg {\n margin-right: 0.25rem;\n border: none;\n }\n }\n }\n\n /* Override form element colors, with local CSS variables */\n div.input-container input.input-field,\n .radio-container div.radio-wrapper,\n .form-dropdown div.vs__dropdown-toggle {\n color: var(--interactive-editor-color);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n }\n svg {\n path { fill: var(--interactive-editor-color); }\n background: var(--interactive-editor-background);\n &:hover, &.selected {\n path { fill: var(--interactive-editor-background); }\n background: var(--interactive-editor-color);\n }\n }\n .edit-item-select .v-select {\n input.vs__search { color: var(--interactive-editor-color); }\n div.vs__dropdown-toggle {\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n span.vs__selected { color: var(--interactive-editor-color); }\n .vs__actions svg {\n background: var(--interactive-editor-background);\n path { fill: var(--interactive-editor-color); }\n &:hover {\n background: var(--interactive-editor-color);\n path { fill: var(--interactive-editor-background); }\n }\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditItem.vue?vue&type=template&id=1b4da836&\"\nimport script from \"./EditItem.vue?vue&type=script&lang=js&\"\nexport * from \"./EditItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditItem.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"40%\",\"height\":\"40%\",\"classes\":\"dashy-modal\"},on:{\"closed\":_vm.close}},[_c('div',{staticClass:\"move-menu-inner\"},[_c('h3',{staticClass:\"move-title\"},[_vm._v(\"Move or Copy Item\")]),_c('p',{staticClass:\"item-id\"},[_vm._v(\"Editing \"+_vm._s(_vm.itemId))]),_c('Radio',{attrs:{\"options\":_vm.operationRadioOptions,\"label\":\"Operation Type\",\"initialOption\":_vm.operation},model:{value:(_vm.operation),callback:function ($$v) {_vm.operation=$$v},expression:\"operation\"}}),_c('Select',{attrs:{\"options\":_vm.sectionList,\"initialOption\":_vm.selectedSection,\"label\":\"Destination\"},model:{value:(_vm.selectedSection),callback:function ($$v) {_vm.selectedSection=$$v},expression:\"selectedSection\"}}),_c('Radio',{attrs:{\"options\":_vm.appendToRadioOptions,\"label\":\"Append To\",\"initialOption\":_vm.appendTo},model:{value:(_vm.appendTo),callback:function ($$v) {_vm.appendTo=$$v},expression:\"appendTo\"}}),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.save,\"cancelClick\":_vm.close}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\" @closed=\"close\"\n :resizable=\"true\" width=\"40%\" height=\"40%\" classes=\"dashy-modal\">\n <div class=\"move-menu-inner\">\n <!-- Title and item ID -->\n <h3 class=\"move-title\">Move or Copy Item</h3>\n <p class=\"item-id\">Editing {{ itemId }}</p>\n <!-- Radio, for move or copy -->\n <Radio\n v-model=\"operation\"\n :options=\"operationRadioOptions\"\n label=\"Operation Type\"\n :initialOption=\"operation\"\n />\n <!-- Select destionation section -->\n <Select\n v-model=\"selectedSection\"\n :options=\"sectionList\"\n :initialOption=\"selectedSection\"\n label=\"Destination\"\n />\n <!-- Radio, for choosing append to beginning or end -->\n <Radio\n v-model=\"appendTo\"\n :options=\"appendToRadioOptions\"\n label=\"Append To\"\n :initialOption=\"appendTo\"\n />\n <!-- Save and cancel buttons -->\n <SaveCancelButtons :saveClick=\"save\" :cancelClick=\"close\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport Select from '@/components/FormElements/Select';\nimport Radio from '@/components/FormElements/Radio';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'MoveItemTo',\n components: {\n Select,\n Radio,\n SaveCancelButtons,\n },\n props: {\n itemId: String, // Unique ID for item\n initialSection: String, // The current section\n },\n data() {\n return {\n selectedSection: '',\n operation: 'move',\n appendTo: 'end',\n modalName: `${modalNames.MOVE_ITEM_TO}-${this.itemId}`,\n operationRadioOptions: [\n { label: 'Move', value: 'move' },\n { label: 'Copy', value: 'copy' },\n ],\n appendToRadioOptions: [\n { label: 'Beginning', value: 'beginning' },\n { label: 'End', value: 'end' },\n ],\n };\n },\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n sectionList() {\n return this.sections.map((section) => section.name);\n },\n currentSection() {\n let sectionName = '';\n this.sections.forEach((section) => {\n section.items.forEach((item) => {\n if (item.id === this.itemId) sectionName = section.name;\n });\n });\n return sectionName;\n },\n },\n mounted() {\n this.selectedSection = this.currentSection;\n },\n methods: {\n save() {\n const item = this.$store.getters.getItemById(this.itemId);\n // Copy item to new section\n const copyPayload = { item, toSection: this.selectedSection, appendTo: this.appendTo };\n this.$store.commit(StoreKeys.COPY_ITEM, copyPayload);\n // Remove item from previous section\n if (this.operation === 'move') {\n const payload = { itemId: this.itemId, sectionName: this.currentSection };\n this.$store.commit(StoreKeys.REMOVE_ITEM, payload);\n }\n this.close();\n },\n close() {\n this.$modal.hide(this.modalName);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.move-menu-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n h3.move-title {\n margin: 0.25rem 0;\n }\n p.item-id {\n font-size: 1rem;\n font-style: italic;\n margin: 0.25rem 0;\n opacity: var(--dimming-factor);\n }\n .button-wrapper {\n display: flex;\n width: fit-content;\n margin: 1.5rem auto;\n button {\n margin: 0 0.5rem;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveItemTo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveItemTo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MoveItemTo.vue?vue&type=template&id=00eee648&scoped=true&\"\nimport script from \"./MoveItemTo.vue?vue&type=script&lang=js&\"\nexport * from \"./MoveItemTo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MoveItemTo.vue?vue&type=style&index=0&id=00eee648&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"00eee648\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide\"}},[(_vm.show && !_vm.isMenuDisabled)?_c('div',{staticClass:\"context-menu\",style:(_vm.posX && _vm.posY ? (\"top:\" + _vm.posY + \"px;left:\" + _vm.posX + \"px;\") : '')},[_c('ul',{staticClass:\"menu-section\"},[_c('li',{staticClass:\"section-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('context-menus.item.open-section-title'))+\" \")]),_c('li',{on:{\"click\":function($event){return _vm.launch('sametab')}}},[_c('SameTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.sametab')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('newtab')}}},[_c('NewTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.newtab')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('modal')}}},[_c('IframeOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.modal')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('workspace')}}},[_c('WorkspaceOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.workspace')))])],1)]),_c('ul',{staticClass:\"menu-section\"},[_c('li',{staticClass:\"section-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('context-menus.item.options-section-title'))+\" \")]),_c('li',{on:{\"click\":function($event){return _vm.openSettings()}}},[_c('EditIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.edit-item')))])],1),(_vm.isEditMode)?_c('li',{on:{\"click\":function($event){return _vm.openMoveMenu()}}},[_c('MoveIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.move-item')))])],1):_vm._e(),(_vm.isEditMode)?_c('li',{on:{\"click\":function($event){return _vm.openDeleteItem()}}},[_c('BinIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.item.remove-item')))])],1):_vm._e()])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide\">\n <div class=\"context-menu\" v-if=\"show && !isMenuDisabled\"\n :style=\"posX && posY ? `top:${posY}px;left:${posX}px;` : ''\">\n <!-- Open Options -->\n <ul class=\"menu-section\">\n <li class=\"section-title\">\n {{ $t('context-menus.item.open-section-title') }}\n </li>\n <li @click=\"launch('sametab')\">\n <SameTabOpenIcon />\n <span>{{ $t('context-menus.item.sametab') }}</span>\n </li>\n <li @click=\"launch('newtab')\">\n <NewTabOpenIcon />\n <span>{{ $t('context-menus.item.newtab') }}</span>\n </li>\n <li @click=\"launch('modal')\">\n <IframeOpenIcon />\n <span>{{ $t('context-menus.item.modal') }}</span>\n </li>\n <li @click=\"launch('workspace')\">\n <WorkspaceOpenIcon />\n <span>{{ $t('context-menus.item.workspace') }}</span>\n </li>\n </ul>\n <!-- Edit Options -->\n <ul class=\"menu-section\">\n <li class=\"section-title\">\n {{ $t('context-menus.item.options-section-title') }}\n </li>\n <li @click=\"openSettings()\">\n <EditIcon />\n <span>{{ $t('context-menus.item.edit-item') }}</span>\n </li>\n <li v-if=\"isEditMode\" @click=\"openMoveMenu()\">\n <MoveIcon />\n <span>{{ $t('context-menus.item.move-item') }}</span>\n </li>\n <li v-if=\"isEditMode\" @click=\"openDeleteItem()\">\n <BinIcon />\n <span>{{ $t('context-menus.item.remove-item') }}</span>\n </li>\n </ul>\n </div>\n </transition>\n</template>\n\n<script>\n// Import icons for each element\nimport EditIcon from '@/assets/interface-icons/config-edit-json.svg';\nimport BinIcon from '@/assets/interface-icons/interactive-editor-remove.svg';\nimport MoveIcon from '@/assets/interface-icons/interactive-editor-move-to.svg';\nimport SameTabOpenIcon from '@/assets/interface-icons/open-current-tab.svg';\nimport NewTabOpenIcon from '@/assets/interface-icons/open-new-tab.svg';\nimport IframeOpenIcon from '@/assets/interface-icons/open-iframe.svg';\nimport WorkspaceOpenIcon from '@/assets/interface-icons/open-workspace.svg';\n\nexport default {\n name: 'ContextMenu',\n components: {\n EditIcon,\n MoveIcon,\n BinIcon,\n SameTabOpenIcon,\n NewTabOpenIcon,\n IframeOpenIcon,\n WorkspaceOpenIcon,\n },\n props: {\n posX: Number, // The X coordinate for positioning\n posY: Number, // The Y coordinate for positioning\n show: Boolean, // Should show or hide the menu\n },\n computed: {\n isMenuDisabled() {\n return !!this.$store.getters.appConfig.disableContextMenu;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* Called on item click, emits an event up to Item */\n /* in order to launch the current app to a given target */\n launch(target) {\n this.$emit('launchItem', target);\n },\n openSettings() {\n this.$emit('openItemSettings');\n },\n openMoveMenu() {\n this.$emit('openMoveItemMenu');\n },\n openDeleteItem() {\n this.$emit('openDeleteItem');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\ndiv.context-menu {\n position: absolute;\n margin: 0;\n padding: 0;\n z-index: 8;\n background: var(--context-menu-background);\n color: var(--context-menu-color);\n border: 1px solid var(--context-menu-secondary-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--context-menu-shadow);\n opacity: 0.98;\n\n ul.menu-section {\n list-style-type: none;\n margin: 0;\n padding: 0;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-color);\n }\n li {\n cursor: pointer;\n padding: 0.5rem 1rem;\n display: flex;\n flex-direction: row;\n font-size: 1rem;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-secondary-color);\n }\n &:hover:not(.section-title) {\n background: var(--context-menu-secondary-color);\n }\n &.section-title {\n cursor: default;\n font-weight: bold;\n justify-content: center;\n }\n svg {\n width: 1rem;\n margin-right: 0.5rem;\n path { fill: currentColor; }\n }\n }\n }\n}\n\n// Define enter and leave transitions\n.slide-enter-active { animation: slide-in .1s; }\n.slide-leave-active { animation: slide-in .1s reverse; }\n@keyframes slide-in {\n 0% { transform: scaleY(0.5) scaleX(0.8) translateY(-50px); }\n 100% { transform: scaleY(1) translateY(0) translateY(0); }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemContextMenu.vue?vue&type=template&id=026cc865&\"\nimport script from \"./ItemContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemContextMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemContextMenu.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template ref=\"container\">\n <div :class=\"`item-wrapper wrap-size-${itemSize}`\">\n <a @click=\"itemOpened\"\n @mouseup.right=\"openContextMenu\"\n @contextmenu.prevent\n :href=\"hyperLinkHref\"\n :target=\"anchorTarget\"\n :class=\"`item ${makeClassList}`\"\n v-tooltip=\"getTooltipOptions()\"\n rel=\"noopener noreferrer\" tabindex=\"0\"\n :id=\"`link-${id}`\"\n :style=\"`--open-icon: ${getUnicodeOpeningIcon()}; ${customStyles}`\"\n >\n <!-- Item Text -->\n <div :class=\"`tile-title ${!icon? 'bounce no-icon': ''}`\" :id=\"`tile-${id}`\" >\n <span class=\"text\">{{ title }}</span>\n <p class=\"description\">{{ description }}</p>\n </div>\n <!-- Item Icon -->\n <Icon :icon=\"icon\" :url=\"url\" :size=\"itemSize\" :color=\"color\"\n v-bind:style=\"customStyles\" class=\"bounce\" />\n <!-- Small icon, showing opening method on hover -->\n <ItemOpenMethodIcon class=\"opening-method-icon\" :isSmall=\"!icon || itemSize === 'small'\"\n :openingMethod=\"accumulatedTarget\" position=\"bottom right\"\n :hotkey=\"hotkey\" />\n <!-- Status indicator dot (if enabled) showing weather srevice is availible -->\n <StatusIndicator\n class=\"status-indicator\"\n v-if=\"enableStatusCheck\"\n :statusSuccess=\"statusResponse ? statusResponse.successStatus : undefined\"\n :statusText=\"statusResponse ? statusResponse.message : undefined\"\n />\n <!-- Edit icon (displayed only when in edit mode) -->\n <EditModeIcon v-if=\"isEditMode\" class=\"edit-mode-item\" @click=\"openItemSettings()\" />\n </a>\n <!-- Right-click context menu -->\n <ContextMenu\n :show=\"contextMenuOpen && !isAddNew\"\n v-click-outside=\"closeContextMenu\"\n :posX=\"contextPos.posX\"\n :posY=\"contextPos.posY\"\n :id=\"`context-menu-${id}`\"\n @launchItem=\"launchItem\"\n @openItemSettings=\"openItemSettings\"\n @openMoveItemMenu=\"openMoveItemMenu\"\n @openDeleteItem=\"openDeleteItem\"\n />\n <!-- Edit and move item menu modals -->\n <MoveItemTo v-if=\"isEditMode\" :itemId=\"id\" />\n <EditItem v-if=\"editMenuOpen\" :itemId=\"id\"\n @closeEditMenu=\"closeEditMenu\"\n :isNew=\"isAddNew\" :parentSectionTitle=\"parentSectionTitle\" />\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\nimport router from '@/router';\nimport Icon from '@/components/LinkItems/ItemIcon.vue';\nimport ItemOpenMethodIcon from '@/components/LinkItems/ItemOpenMethodIcon';\nimport StatusIndicator from '@/components/LinkItems/StatusIndicator';\nimport EditItem from '@/components/InteractiveEditor/EditItem';\nimport MoveItemTo from '@/components/InteractiveEditor/MoveItemTo';\nimport ContextMenu from '@/components/LinkItems/ItemContextMenu';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { targetValidator } from '@/utils/ConfigHelpers';\nimport EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\nimport {\n localStorageKeys,\n serviceEndpoints,\n modalNames,\n openingMethod as defaultOpeningMethod,\n} from '@/utils/defaults';\n\nexport default {\n name: 'Item',\n props: {\n id: String, // The unique ID of a tile (e.g. 001)\n title: String, // The main text of tile, required\n subtitle: String, // Optional sub-text\n description: String, // Optional tooltip hover text\n icon: String, // Optional path to icon, within public/img/tile-icons\n color: String, // Optional text and icon color, specified in hex code\n backgroundColor: String, // Optional item background color\n url: String, // URL to the resource, optional but recommended\n provider: String, // Optional provider name, for external apps\n hotkey: Number, // Shortcut for quickly launching app\n target: { // Where resource will open, either 'newtab', 'sametab' or 'modal'\n type: String,\n validator: targetValidator,\n },\n itemSize: String, // Item size: small | medium | large\n enableStatusCheck: Boolean, // Should run status checks\n statusCheckHeaders: Object, // Custom status check headers\n statusCheckUrl: String, // Custom URL for status check endpoint\n statusCheckInterval: Number, // Num seconds beteween repeating checks\n statusCheckAllowInsecure: Boolean, // Status check ignore SSL certs\n parentSectionTitle: String, // Title of parent section (for add new)\n isAddNew: Boolean, // Only set if 'fake' item used as Add New button\n },\n components: {\n Icon,\n ItemOpenMethodIcon,\n StatusIndicator,\n ContextMenu,\n MoveItemTo,\n EditItem,\n EditModeIcon,\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n accumulatedTarget() {\n return this.target || this.appConfig.defaultOpeningMethod || defaultOpeningMethod;\n },\n /* Based on item props, adjust class names */\n makeClassList() {\n const {\n icon, itemSize, isAddNew, isEditMode,\n } = this;\n return `size-${itemSize} ${!icon ? 'short' : ''} `\n + `${isAddNew ? 'add-new' : ''} ${isEditMode ? 'is-edit-mode' : ''}`;\n },\n /* Convert config target value, into HTML anchor target attribute */\n anchorTarget() {\n if (this.isEditMode) return '_self';\n const target = this.accumulatedTarget;\n switch (target) {\n case 'sametab': return '_self';\n case 'newtab': return '_blank';\n case 'parent': return '_parent';\n case 'top': return '_top';\n default: return undefined;\n }\n },\n /* Get href for anchor, if not in edit mode, or opening in modal/ workspace */\n hyperLinkHref() {\n const nothing = '#';\n if (this.isEditMode) return nothing;\n const noAnchorNeeded = ['modal', 'workspace'];\n return noAnchorNeeded.includes(this.accumulatedTarget) ? nothing : this.url;\n },\n },\n data() {\n return {\n contextMenuOpen: false,\n getId: this.id,\n customStyles: {\n color: this.color,\n background: this.backgroundColor,\n },\n statusResponse: undefined,\n contextPos: {\n posX: undefined,\n posY: undefined,\n },\n editMenuOpen: false,\n };\n },\n methods: {\n /* Called when an item is clicked, manages the opening of modal & resets the search field */\n itemOpened(e) {\n if (this.isEditMode) {\n // If in edit mode, open settings, and don't launch app\n this.openItemSettings();\n return;\n }\n if (e.altKey || this.accumulatedTarget === 'modal') {\n e.preventDefault();\n this.$emit('triggerModal', this.url);\n } else if (this.accumulatedTarget === 'workspace') {\n router.push({ name: 'workspace', query: { url: this.url } });\n } else {\n this.$emit('itemClicked');\n }\n // Update the most/ last used ledger, for smart-sorting\n if (!this.appConfig.disableSmartSort) {\n this.incrementMostUsedCount(this.id);\n this.incrementLastUsedCount(this.id);\n }\n },\n /* Open custom context menu, and set position */\n openContextMenu(e) {\n this.contextMenuOpen = !this.contextMenuOpen;\n if (e && window) {\n // Calculate placement based on cursor and scroll position\n this.contextPos = {\n posX: e.clientX + window.pageXOffset,\n posY: e.clientY + window.pageYOffset,\n };\n }\n },\n /* Closes the context menu, called when user clicks literally anywhere */\n closeContextMenu() {\n this.contextMenuOpen = false;\n },\n /* Returns configuration object for the tooltip */\n getTooltipOptions() {\n if (!this.description && !this.provider) return {}; // If no description, then skip\n const description = this.description ? this.description : '';\n const providerText = this.provider ? `<b>Provider</b>: ${this.provider}` : '';\n const lb1 = description && providerText ? '<br>' : '';\n const hotkeyText = this.hotkey ? `<br>Press '${this.hotkey}' to launch` : '';\n const tooltipText = providerText + lb1 + description + hotkeyText;\n const editText = this.$t('interactive-editor.edit-section.edit-tooltip');\n return {\n content: (this.isEditMode ? editText : tooltipText),\n trigger: 'hover focus',\n hideOnTargetClick: true,\n html: true,\n placement: this.statusResponse ? 'left' : 'auto',\n delay: { show: 600, hide: 200 },\n classes: `item-description-tooltip tooltip-is-${this.itemSize}`,\n };\n },\n /* Used by certain themes (material), to show animated CSS icon */\n getUnicodeOpeningIcon() {\n switch (this.accumulatedTarget) {\n case 'newtab': return '\"\\\\f360\"';\n case 'sametab': return '\"\\\\f24d\"';\n case 'parent': return '\"\\\\f3bf\"';\n case 'top': return '\"\\\\f102\"';\n case 'modal': return '\"\\\\f2d0\"';\n case 'workspace': return '\"\\\\f0b1\"';\n default: return '\"\\\\f054\"';\n }\n },\n /* Pulls together all user options, returns URL + Get params for ping endpoint */\n makeApiUrl() {\n const {\n url, statusCheckUrl, statusCheckHeaders, statusCheckAllowInsecure,\n } = this;\n const encode = (str) => encodeURIComponent(str);\n this.statusResponse = undefined;\n // Find base URL, where the API is hosted\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n // Find correct URL to check, and encode\n const urlToCheck = `?&url=${encode(statusCheckUrl || url)}`;\n // Get, stringify and encode any headers\n const headers = statusCheckHeaders\n ? `&headers=${encode(JSON.stringify(statusCheckHeaders))}` : '';\n // Deterimine if user disabled security\n const enableInsecure = statusCheckAllowInsecure ? '&enableInsecure=true' : '';\n // Construct the full API endpoint's URL with GET params\n return `${baseUrl}${serviceEndpoints.statusCheck}/${urlToCheck}${headers}${enableInsecure}`;\n },\n /* Checks if a given service is currently online */\n checkWebsiteStatus() {\n const endpoint = this.makeApiUrl();\n axios.get(endpoint)\n .then((response) => {\n if (response.data) this.statusResponse = response.data;\n })\n .catch(() => { // Something went very wrong.\n this.statusResponse = {\n statusText: 'Failed to make request',\n statusSuccess: false,\n };\n });\n },\n /* Handle navigation options from the context menu */\n launchItem(method) {\n const { url } = this;\n this.contextMenuOpen = false;\n switch (method) {\n case 'newtab':\n window.open(url, '_blank');\n break;\n case 'sametab':\n window.open(url, '_self');\n break;\n case 'modal':\n this.$emit('triggerModal', url);\n break;\n case 'workspace':\n router.push({ name: 'workspace', query: { url } });\n break;\n default: window.open(url, '_blank');\n }\n },\n /* Open the Edit Item moal form */\n openItemSettings() {\n this.editMenuOpen = true;\n this.contextMenuOpen = false;\n this.$modal.show(modalNames.EDIT_ITEM);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n /* Ensure conditional is updated, once menu closed */\n closeEditMenu() {\n this.editMenuOpen = false;\n this.$modal.hide(modalNames.EDIT_ITEM);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* Used for smart-sort when sorting items by most used apps */\n incrementMostUsedCount(itemId) {\n const mostUsed = JSON.parse(localStorage.getItem(localStorageKeys.MOST_USED) || '{}');\n let counter = mostUsed[itemId] || 0;\n counter += 1;\n mostUsed[itemId] = counter;\n localStorage.setItem(localStorageKeys.MOST_USED, JSON.stringify(mostUsed));\n },\n /* Used for smart-sort when sorting by last used apps */\n incrementLastUsedCount(itemId) {\n const lastUsed = JSON.parse(localStorage.getItem(localStorageKeys.LAST_USED) || '{}');\n lastUsed[itemId] = new Date().getTime();\n localStorage.setItem(localStorageKeys.LAST_USED, JSON.stringify(lastUsed));\n },\n /* Open the modal for moving/ copying item to other section */\n openMoveItemMenu() {\n this.$modal.show(`${modalNames.MOVE_ITEM_TO}-${this.id}`);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.closeContextMenu();\n },\n /* Deletes the current item from the state */\n openDeleteItem() {\n const parentSection = this.$store.getters.getParentSectionOfItem(this.id);\n const payload = { itemId: this.id, sectionName: parentSection.name };\n this.$store.commit(StoreKeys.REMOVE_ITEM, payload);\n this.closeContextMenu();\n },\n },\n mounted() {\n // If ststus checking is enabled, then check service status\n if (this.enableStatusCheck) this.checkWebsiteStatus();\n // If continious status checking is enabled, then start ever-lasting loop\n if (this.statusCheckInterval > 0) {\n setInterval(this.checkWebsiteStatus, this.statusCheckInterval * 1000);\n }\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n.item-wrapper {\n flex-grow: 1;\n flex-basis: 6rem;\n &.wrap-size-large {\n flex-basis: 12rem;\n }\n}\n\n.item {\n flex-grow: 1;\n color: var(--item-text-color);\n vertical-align: middle;\n margin: 0.5rem;\n background: var(--item-background);\n text-align: center;\n padding: 2px;\n outline: 2px solid transparent;\n border: 1px solid var(--outline-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--item-shadow);\n cursor: pointer;\n text-decoration: none;\n position: relative;\n transition: all 0.2s ease-in-out 0s;\n &:hover {\n box-shadow: var(--item-hover-shadow);\n background: var(--item-background-hover);\n color: var(--item-text-color-hover);\n // position: relative;\n // .tile-title span.text {\n // white-space: pre-wrap;\n // }\n }\n &:focus {\n outline: 2px solid var(--primary);\n }\n &.short:not(.size-large) {\n height: 2rem;\n }\n &.add-new {\n border: 2px dashed var(--primary) !important;\n }\n}\n\n/* Text in tile */\n.tile-title {\n white-space: nowrap;\n text-overflow: ellipsis;\n min-width: 120px;\n height: 30px;\n position: relative;\n padding: 0;\n z-index: 2;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n word-break: keep-all;\n span.text {\n white-space: nowrap;\n }\n}\n\n/* Colored dot showing service status */\n.status-indicator {\n position: absolute;\n top: 0;\n right: 0;\n}\n\n.opening-method-icon {\n display: none; // Hidden by default, visible on hover\n}\n\n/* Manage hover and focus actions */\n.item:hover, .item:focus {\n /* Show opening-method icon */\n .opening-method-icon {\n display: block;\n }\n\n /* Trigger text-marquee for text that doesn't fit */\n .tile-title.is-overflowing{\n .overflow-dots {\n opacity: 0;\n }\n span.text {\n transform: translateX(calc(100px - 100%));\n }\n }\n\n /* Apply transofmation of icons on hover */\n .tile-icon, .tile-svg {\n filter: var(--item-icon-transform-hover);\n }\n}\n\n/* Edit Mode Icon */\n.item .edit-mode-item {\n width: 1rem;\n height: 1rem;\n position: absolute;\n top: 0.2rem;\n right: 0.2rem;\n}\n\n/* Specify layout for alternate sized icons */\n.item {\n /* Small Tile Specific Themes */\n &.size-small {\n display: flex;\n flex-direction: row-reverse;\n justify-content: flex-end;\n align-items: center;\n height: 2rem;\n padding-top: 4px;\n max-width: 14rem;\n div img, div svg.missing-image {\n width: 2rem;\n }\n .tile-title {\n height: fit-content;\n min-height: 1.2rem;\n text-align: left;\n max-width: 12rem;\n overflow: hidden;\n span.text {\n text-align: left;\n padding-left: 10%;\n }\n }\n }\n /* Medium Tile Specific Themes */\n &.size-medium {\n display: flex;\n flex-direction: column;\n align-items: center;\n height: auto;\n div img, div svg.missing-image {\n width: 2.5rem;\n margin-bottom: 0.25rem;\n }\n .tile-title {\n min-width: 100px;\n max-width: 160px;\n &.no-icon {\n text-align: left;\n width: 100%;\n max-width: inherit;\n margin-left: 0.5rem;\n }\n }\n }\n /* Large Tile Specific Themes */\n &.size-large {\n display: flex;\n flex-direction: row-reverse;\n justify-content: flex-end;\n text-align: left;\n overflow: hidden;\n align-items: center;\n max-height: 6rem;\n margin: 0.2rem;\n padding: 0.5rem;\n img {\n padding: 0.1rem 0.25rem;\n }\n .tile-title {\n height: auto;\n padding: 0.1rem 0.25rem;\n span.text {\n position: relative;\n font-weight: bold;\n font-size: 1.1rem;\n width: 100%;\n }\n p.description {\n margin: 0;\n display: block;\n white-space: pre-wrap;\n text-overflow: ellipsis;\n font-size: .9em;\n line-height: 1rem;\n height: 2rem;\n }\n }\n }\n p.description {\n display: none; // By default, we don't show the description\n }\n &:before { // Certain themes (e.g. material) show css animated fas icon on hover\n display: none;\n font-family: FontAwesome;\n content: var(--open-icon, \"\\f054\") !important;\n }\n}\n\n/* Adjust positioning of status indicator, when in edit mode */\na.item.is-edit-mode {\n &.size-medium .status-indicator { top: 1rem; }\n &.size-small .status-indicator { right: 1rem; }\n &.size-large .status-indicator { top: 1.5rem; }\n}\n\n</style>\n\n<!-- An un-scoped style tag, since tooltip is outside this DOM tree -->\n<style lang=\"scss\">\n.disabled-link {\n pointer-events: none;\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Item.vue?vue&type=template&id=d60e722c&ref=container&\"\nimport script from \"./Item.vue?vue&type=script&lang=js&\"\nexport * from \"./Item.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Item.vue?vue&type=style&index=0&lang=scss&\"\nimport style1 from \"./Item.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"collapsable \" + _vm.rowColSpanClass + \" \" + _vm.collapseClass),style:(((_vm.color ? 'background: '+_vm.color : '') + \"; \" + (_vm.sanitizeCustomStyles(_vm.customStyles)) + \";\"))},[_c('input',{staticClass:\"toggle\",attrs:{\"id\":_vm.sectionKey,\"type\":\"checkbox\",\"tabIndex\":\"-1\"},domProps:{\"checked\":_vm.isExpanded},on:{\"change\":_vm.collapseChanged}}),_c('label',{staticClass:\"lbl-toggle\",attrs:{\"for\":_vm.sectionKey,\"tabindex\":\"-1\"},on:{\"mouseup\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"right\",39,$event.key,[\"Right\",\"ArrowRight\"])){ return null; }if('button' in $event && $event.button !== 2){ return null; }return _vm.openContextMenu.apply(null, arguments)},\"contextmenu\":function($event){$event.preventDefault();}}},[(_vm.icon)?_c('Icon',{staticClass:\"section-icon\",attrs:{\"icon\":_vm.icon,\"size\":\"small\",\"url\":_vm.title}}):_vm._e(),_c('h3',[_vm._v(_vm._s(_vm.title))]),(_vm.isEditMode)?_c('EditModeIcon',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.editTooltip()),expression:\"editTooltip()\"}],staticClass:\"edit-mode-item\",on:{\"click\":_vm.openEditModal}}):_vm._e()],1),_c('div',{staticClass:\"collapsible-content\"},[_c('div',{staticClass:\"content-inner\"},[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n :class=\"`collapsable ${rowColSpanClass} ${collapseClass}`\"\n :style=\"`${color ? 'background: '+color : ''}; ${sanitizeCustomStyles(customStyles)};`\"\n >\n <input\n :id=\"sectionKey\"\n class=\"toggle\"\n type=\"checkbox\"\n :checked=\"isExpanded\"\n @change=\"collapseChanged\"\n tabIndex=\"-1\"\n >\n <label :for=\"sectionKey\" class=\"lbl-toggle\" tabindex=\"-1\"\n @mouseup.right=\"openContextMenu\" @contextmenu.prevent>\n <Icon v-if=\"icon\" :icon=\"icon\" size=\"small\" :url=\"title\" class=\"section-icon\" />\n <h3>{{ title }}</h3>\n <EditModeIcon v-if=\"isEditMode\" @click=\"openEditModal\"\n v-tooltip=\"editTooltip()\" class=\"edit-mode-item\" />\n </label>\n <div class=\"collapsible-content\">\n <div class=\"content-inner\">\n <slot></slot>\n </div>\n </div>\n </div>\n</template>\n\n<script>\n\nimport { localStorageKeys } from '@/utils/defaults';\nimport Icon from '@/components/LinkItems/ItemIcon.vue';\nimport EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';\n\nexport default {\n name: 'CollapsableContainer',\n props: {\n uniqueKey: String, // Generated unique ID\n title: String, // The section title\n icon: String, // An optional section icon\n collapsed: Boolean, // Optional override collapse state\n cols: Number, // Set section horizontal col span / width\n rows: Number, // Set section vertical row span / height\n color: String, // Optional color override\n customStyles: String, // Optional custom stylings\n },\n components: {\n Icon,\n EditModeIcon,\n },\n computed: {\n isEditMode() {\n return this.$store.state.editMode;\n },\n sectionKey() {\n if (this.isEditMode) return undefined;\n return `collapsible-${this.uniqueKey}`;\n },\n collapseClass() {\n return !this.isExpanded ? ' is-collapsed' : 'is-open';\n },\n rowColSpanClass() {\n const { rows, cols, checkSpanNum } = this;\n return `${checkSpanNum(cols, 'col')} ${checkSpanNum(rows, 'row')}`;\n },\n },\n data: () => ({\n isExpanded: false,\n }),\n mounted() {\n this.isExpanded = this.getCollapseState();\n },\n methods: {\n /* Check that row & column span is valid, and not over the max */\n checkSpanNum(span, classPrefix) {\n const maxSpan = 5;\n let numSpan = /^\\d*$/.test(span) ? parseInt(span, 10) : 1;\n numSpan = (numSpan > maxSpan) ? maxSpan : numSpan;\n return `${classPrefix}-${numSpan}`;\n },\n /* Removes all special characters, except those allowed in valid CSS */\n sanitizeCustomStyles(userCss) {\n return userCss ? userCss.replace(/[^a-zA-Z0-9- :;.]/g, '') : '';\n },\n /* Returns local storage collapse state data, and if not yet set then initialized is */\n initialiseStorage() {\n const storageKey = localStorageKeys.COLLAPSE_STATE;\n /* Initialize function will create and set a blank object to storage */\n const initStorage = () => localStorage.setItem(storageKey, JSON.stringify({}));\n // If not yet set, then call initialize\n if (!localStorage[storageKey]) {\n initStorage();\n return {};\n }\n // Otherwise, return value of local storage\n return JSON.parse(localStorage[storageKey]);\n },\n /* If specified by user, return conf collapse state, otherwise check local storage */\n getCollapseState() {\n if (this.collapsed !== undefined) return !this.collapsed; // Check users config\n const collapseStateObject = this.initialiseStorage(); // Check local storage\n if (collapseStateObject[this.uniqueKey] !== undefined) {\n return collapseStateObject[this.uniqueKey];\n }\n // Nothing specified, return Open\n return true;\n },\n /* When section collapsed, update local storage, to remember for next time */\n setCollapseState(id, newState) {\n // Get the current localstorage collapse state object\n const collapseState = JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);\n // Add the new state to it\n collapseState[id] = newState;\n // Stringify, and set the new object into local storage\n localStorage.setItem(localStorageKeys.COLLAPSE_STATE, JSON.stringify(collapseState));\n },\n /* Called when collapse state changes, trigger local storage update if needed */\n collapseChanged(whatChanged) {\n this.isExpanded = whatChanged.srcElement.checked;\n if (this.collapseState === undefined) { // Only run, if user hasn't manually set prop\n this.initialiseStorage();\n this.setCollapseState(this.uniqueKey.toString(), this.isExpanded);\n }\n },\n openEditModal() {\n this.$emit('openEditSection');\n },\n openContextMenu(e) {\n this.$emit('openContextMenu', e);\n },\n editTooltip() {\n const content = this.$t('interactive-editor.edit-section.edit-tooltip');\n return { content, trigger: 'hover focus', delay: { show: 100, hide: 0 } };\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\n@import '@/styles/media-queries.scss';\n\n.collapsable {\n padding: var(--item-group-padding);\n margin: 10px;\n border-radius: var(--curve-factor);\n background: var(--item-group-outer-background);\n box-shadow: var(--item-group-shadow);\n height: fit-content;\n width: 100%;\n width: stretch;\n\n grid-row-start: span 1;\n &.row-2 { grid-row-start: span 2; }\n &.row-3 { grid-row-start: span 3; }\n &.row-4 { grid-row-start: span 4; }\n &.row-5 { grid-row-start: span 5; }\n\n grid-column-start: span 1;\n @include tablet-up {\n &.col-2 { grid-column-start: span 2; }\n &.col-3 { grid-column-start: span 2; }\n &.col-4 { grid-column-start: span 2; }\n &.col-5 { grid-column-start: span 2; }\n }\n @include laptop-up {\n &.col-2 { grid-column-start: span 2; }\n &.col-3 { grid-column-start: span 3; }\n &.col-4 { grid-column-start: span 3; }\n &.col-5 { grid-column-start: span 3; }\n }\n @include monitor-up {\n &.col-2 { grid-column-start: span 2; }\n &.col-3 { grid-column-start: span 3; }\n &.col-4 { grid-column-start: span 4; }\n &.col-5 { grid-column-start: span 5; }\n }\n\n .wrap-collabsible {\n margin-bottom: 1.2rem 0;\n }\n\n input[type='checkbox'] {\n display: none;\n }\n\n label.lbl-toggle {\n outline: none;\n display: block;\n padding: 0.25rem;\n cursor: pointer;\n border-radius: var(--curve-factor);\n transition: all 0.25s ease-out;\n text-align: left;\n color: var(--item-group-heading-text-color);\n h3 {\n margin: 0;\n padding: 0;\n display: inline;\n }\n .section-icon {\n display: inline;\n margin-right: 0.5rem;\n }\n }\n\n .lbl-toggle:hover {\n color: var(--item-group-heading-text-color-hover);\n }\n\n .lbl-toggle::before {\n content: ' ';\n display: inline-block;\n border-top: 5px solid transparent;\n border-bottom: 5px solid transparent;\n border-left: 5px solid currentColor;\n vertical-align: middle;\n margin-right: .7rem;\n transform: translateY(-2px);\n transition: transform .2s ease-out;\n }\n\n .toggle:checked + .lbl-toggle::before {\n transform: rotate(90deg) translateX(-3px);\n }\n\n .collapsible-content {\n max-height: 0px;\n overflow: hidden;\n transition: max-height .25s ease-in-out;\n background: var(--item-group-background);\n border-radius: 0 0 var(--curve-factor) var(--curve-factor);\n }\n\n .toggle:checked + .lbl-toggle + .collapsible-content {\n max-height: 3000px;\n }\n\n .toggle:checked + .lbl-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n }\n\n .collapsible-content .content-inner {\n padding: 0.5rem;\n }\n\n .edit-mode-item {\n width: 1rem;\n height: 1rem;\n float: right;\n right: 0.5rem;\n top: 0.5rem;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Collapsable.vue?vue&type=template&id=6150e7a7&scoped=true&\"\nimport script from \"./Collapsable.vue?vue&type=script&lang=js&\"\nexport * from \"./Collapsable.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Collapsable.vue?vue&type=style&index=0&id=6150e7a7&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"6150e7a7\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.name,\"resizable\":true,\"width\":\"80%\",\"height\":\"80%\",\"classes\":\"dashy-modal\"},on:{\"closed\":function($event){return _vm.modalClosed()}}},[_c('div',{attrs:{\"slot\":\"top-right\"},on:{\"click\":function($event){return _vm.hide()}},slot:\"top-right\"},[_vm._v(\"Close\")]),_c('a',{staticClass:\"close-button\",attrs:{\"title\":\"Close\"},on:{\"click\":function($event){return _vm.hide()}}},[_vm._v(\"x\")]),(_vm.url)?_c('iframe',{staticClass:\"frame\",attrs:{\"src\":_vm.url},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }return _vm.close.apply(null, arguments)}}}):_c('div',{staticClass:\"no-url\"},[_vm._v(\"No URL Specified\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"name\" :resizable=\"true\" width=\"80%\" height=\"80%\" @closed=\"modalClosed()\"\n classes=\"dashy-modal\">\n <div slot=\"top-right\" @click=\"hide()\">Close</div>\n <a @click=\"hide()\" class=\"close-button\" title=\"Close\">x</a>\n <iframe v-if=\"url\" :src=\"url\" @keydown.esc=\"close\" class=\"frame\"/>\n <div v-else class=\"no-url\">No URL Specified</div>\n </modal>\n</template>\n\n<script>\nimport Keys from '@/utils/StoreMutations';\n\nexport default {\n name: 'IframeModal',\n props: {\n name: String,\n },\n data: () => ({\n url: '#',\n }),\n methods: {\n show(url) {\n this.url = url;\n this.$modal.show(this.name);\n this.$store.commit(Keys.SET_MODAL_OPEN, true);\n },\n hide() {\n this.$modal.hide(this.name);\n },\n modalClosed() {\n this.$store.commit(Keys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\n.frame {\n width: 100%;\n height: 100%;\n border: none;\n}\n\n.no-url {\n margin: 4rem auto;\n width: fit-content;\n font-size: 2rem;\n padding: 0.5rem;\n border: 1px dashed #ff0000;\n border-radius: 3px;\n background: #f4f2f2;\n}\n\n.close-button {\n position: absolute;\n right: 0;\n padding: 0.5rem;\n border: 0;\n border-radius: 0 0 0 10px;\n background: var(--primary);\n color: var(--background);\n border-left: 1px solid var(--primary);\n border-bottom: 1px solid var(--primary);\n cursor: pointer;\n &:hover {\n background: var(--background);\n color: var(--primary);\n }\n\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IframeModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IframeModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./IframeModal.vue?vue&type=template&id=9d1b92c8&\"\nimport script from \"./IframeModal.vue?vue&type=script&lang=js&\"\nexport * from \"./IframeModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./IframeModal.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-section\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-section-inner\"},[_c('h3',[_vm._v(\" \"+_vm._s(_vm.$t((\"interactive-editor.edit-section.\" + (_vm.isAddNew ? 'add' : 'edit') + \"-section-title\")))+\" \")]),_c('FormSchema',{staticClass:\"edit-section-form\",attrs:{\"schema\":_vm.customSchema,\"name\":\"editSectionForm\"},model:{value:(_vm.sectionData),callback:function ($$v) {_vm.sectionData=$$v},expression:\"sectionData\"}}),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveSection,\"cancelClick\":_vm.modalClosed}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\" @closed=\"modalClosed\"\n :resizable=\"true\" width=\"50%\" height=\"80%\"\n classes=\"dashy-modal edit-section\"\n >\n <div class=\"edit-section-inner\">\n <h3>\n {{ $t(`interactive-editor.edit-section.${isAddNew ? 'add' : 'edit'}-section-title`) }}\n </h3>\n <FormSchema\n :schema=\"customSchema\"\n v-model=\"sectionData\"\n name=\"editSectionForm\"\n class=\"edit-section-form\"\n />\n <SaveCancelButtons\n :saveClick=\"saveSection\"\n :cancelClick=\"modalClosed\"\n />\n </div>\n </modal>\n</template>\n\n<script>\nimport FormSchema from '@formschema/native';\nimport StoreKeys from '@/utils/StoreMutations';\nimport DashySchema from '@/utils/ConfigSchema';\nimport { modalNames } from '@/utils/defaults';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\n\nexport default {\n name: 'EditSection',\n props: {\n sectionIndex: Number,\n isAddNew: Boolean,\n },\n components: {\n SaveCancelButtons,\n FormSchema,\n },\n data() {\n return {\n modalName: modalNames.EDIT_SECTION,\n schema: DashySchema.properties.sections.items.properties,\n sectionData: {},\n };\n },\n computed: {\n /* Make a custom schema object, using fields from ConfigSchema */\n customSchema() {\n const sectionSchema = this.schema;\n const displayDataSchema = this.schema.displayData.properties;\n return {\n type: 'object',\n properties: {\n name: sectionSchema.name,\n icon: sectionSchema.icon,\n displayData: {\n title: '',\n description: '',\n type: 'object',\n properties: {\n sortBy: displayDataSchema.sortBy,\n rows: displayDataSchema.rows,\n cols: displayDataSchema.cols,\n collapsed: displayDataSchema.collapsed,\n hideForGuests: displayDataSchema.hideForGuests,\n },\n },\n },\n };\n },\n },\n mounted() {\n this.sectionData = this.$store.getters.getSectionByIndex(this.sectionIndex);\n this.$modal.show(modalNames.EDIT_SECTION);\n },\n methods: {\n /* From the current index, return section data */\n getSectionFromState(index) {\n if (this.isAddNew) return {};\n return this.$store.getters.getSectionByIndex(index);\n },\n /* Clean up work, triggered when modal closed */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$emit('closeEditSection');\n },\n /* Either update existing section, or insert new one, then close modal */\n saveSection() {\n const { sectionIndex, sectionData } = this;\n if (this.isAddNew) {\n this.$store.commit(StoreKeys.INSERT_SECTION, sectionData);\n } else {\n this.$store.commit(StoreKeys.UPDATE_SECTION, { sectionIndex, sectionData });\n }\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n this.$emit('closeEditSection');\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n@import '@/styles/schema-editor.scss';\n\n.edit-section-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .scroll-bar;\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem;\n }\n .edit-section-form {\n @extend .schema-form;\n margin-bottom: 2.5rem;\n }\n .edit-section-save-btn {\n margin-bottom: 2rem;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditSection.vue?vue&type=template&id=685776cc&\"\nimport script from \"./EditSection.vue?vue&type=script&lang=js&\"\nexport * from \"./EditSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditSection.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"slide\"}},[(_vm.show && !_vm.isMenuDisabled)?_c('div',{staticClass:\"context-menu\",style:(_vm.posX && _vm.posY ? (\"top:\" + _vm.posY + \"px;left:\" + _vm.posX + \"px;\") : '')},[_c('ul',{staticClass:\"menu-section\"},[_c('li',{on:{\"click\":function($event){return _vm.openSection()}}},[_c('SameTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.section.open-section')))])],1),_c('li',{on:{\"click\":_vm.openEditSectionMenu}},[_c('EditIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.section.edit-section')))])],1),(_vm.isEditMode)?_c('li',{on:{\"click\":_vm.removeSection}},[_c('BinIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('context-menus.section.remove-section')))])],1):_vm._e()])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide\">\n <div class=\"context-menu\" v-if=\"show && !isMenuDisabled\"\n :style=\"posX && posY ? `top:${posY}px;left:${posX}px;` : ''\">\n <!-- Open Options -->\n <ul class=\"menu-section\">\n <li @click=\"openSection()\">\n <SameTabOpenIcon />\n <span>{{ $t('context-menus.section.open-section') }}</span>\n </li>\n <li @click=\"openEditSectionMenu\">\n <EditIcon />\n <span>{{ $t('context-menus.section.edit-section') }}</span>\n </li>\n <li v-if=\"isEditMode\" @click=\"removeSection\">\n <BinIcon />\n <span>{{ $t('context-menus.section.remove-section') }}</span>\n </li>\n </ul>\n </div>\n </transition>\n</template>\n\n<script>\n// Import icons for each element\nimport EditIcon from '@/assets/interface-icons/config-edit-json.svg';\nimport BinIcon from '@/assets/interface-icons/interactive-editor-remove.svg';\nimport SameTabOpenIcon from '@/assets/interface-icons/open-current-tab.svg';\n\nexport default {\n name: 'ContextMenu',\n components: {\n EditIcon,\n BinIcon,\n SameTabOpenIcon,\n },\n props: {\n posX: Number, // The X coordinate for positioning\n posY: Number, // The Y coordinate for positioning\n show: Boolean, // Should show or hide the menu\n },\n computed: {\n isMenuDisabled() {\n return !!this.$store.getters.appConfig.disableContextMenu;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* Called on item click, emits an event up to Item */\n /* in order to launch the current app to a given target */\n openSection() {\n this.$emit('navigateToSection');\n },\n openEditSectionMenu() {\n this.$emit('openEditSection');\n },\n removeSection() {\n this.$emit('removeSection');\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\ndiv.context-menu {\n position: absolute;\n margin: 0;\n padding: 0;\n z-index: 8;\n background: var(--context-menu-background);\n color: var(--context-menu-color);\n border: 1px solid var(--context-menu-secondary-color);\n border-radius: var(--curve-factor);\n box-shadow: var(--context-menu-shadow);\n opacity: 0.98;\n\n ul.menu-section {\n list-style-type: none;\n margin: 0;\n padding: 0;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-color);\n }\n li {\n cursor: pointer;\n padding: 0.5rem 1rem;\n display: flex;\n flex-direction: row;\n font-size: 1rem;\n &:not(:last-child) {\n border-bottom: 1px solid var(--context-menu-secondary-color);\n }\n svg {\n width: 1rem;\n margin-right: 0.5rem;\n path { fill: currentColor; }\n }\n }\n }\n}\n\n// Define enter and leave transitions\n.slide-enter-active { animation: slide-in .1s; }\n.slide-leave-active { animation: slide-in .1s reverse; }\n@keyframes slide-in {\n 0% { transform: scaleY(0.5) scaleX(0.8) translateY(-50px); }\n 100% { transform: scaleY(1) translateY(0) translateY(0); }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SectionContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SectionContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SectionContextMenu.vue?vue&type=template&id=04bcadf7&scoped=true&\"\nimport script from \"./SectionContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./SectionContextMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SectionContextMenu.vue?vue&type=style&index=0&id=04bcadf7&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"04bcadf7\",\n null\n \n)\n\nexport default component.exports","<template>\n <Collapsable\n :title=\"title\"\n :icon=\"icon\"\n :uniqueKey=\"groupId\"\n :collapsed=\"displayData.collapsed\"\n :cols=\"displayData.cols\"\n :rows=\"displayData.rows\"\n :color=\"displayData.color\"\n :customStyles=\"displayData.customStyles\"\n @openEditSection=\"openEditSection\"\n @openContextMenu=\"openContextMenu\"\n >\n <!-- If no items, show message -->\n <div v-if=\"(!items || items.length < 1) && !isEditMode\" class=\"no-items\">\n No Items to Show Yet\n </div>\n <!-- Item Container -->\n <div v-else\n :class=\"`there-are-items ${isGridLayout? 'item-group-grid': ''} inner-size-${itemSize}`\"\n :style=\"gridStyle\" :id=\"`section-${groupId}`\"\n > <!-- Show for each item -->\n <Item\n v-for=\"(item) in sortedItems\"\n :id=\"item.id\"\n :key=\"item.id\"\n :url=\"item.url\"\n :title=\"item.title\"\n :description=\"item.description\"\n :icon=\"item.icon\"\n :target=\"item.target\"\n :color=\"item.color\"\n :backgroundColor=\"item.backgroundColor\"\n :statusCheckUrl=\"item.statusCheckUrl\"\n :statusCheckHeaders=\"item.statusCheckHeaders\"\n :itemSize=\"newItemSize\"\n :hotkey=\"item.hotkey\"\n :provider=\"item.provider\"\n :parentSectionTitle=\"title\"\n :enableStatusCheck=\"shouldEnableStatusCheck(item.statusCheck)\"\n :statusCheckInterval=\"getStatusCheckInterval()\"\n :statusCheckAllowInsecure=\"item.statusCheckAllowInsecure\"\n @itemClicked=\"$emit('itemClicked')\"\n @triggerModal=\"triggerModal\"\n :isAddNew=\"false\"\n />\n <!-- When in edit mode, show additional item, for Add New item -->\n <Item v-if=\"isEditMode\"\n :isAddNew=\"true\"\n :parentSectionTitle=\"title\"\n icon=\":heavy_plus_sign:\"\n id=\"add-new\"\n title=\"Add New Item\"\n description=\"Click to add new item\"\n key=\"add-new\"\n class=\"add-new-item\"\n :itemSize=\"newItemSize\"\n />\n <div ref=\"modalContainer\"></div>\n </div>\n <!-- Modal for opening in modal view -->\n <IframeModal\n :ref=\"`iframeModal-${groupId}`\"\n :name=\"`iframeModal-${groupId}`\"\n @closed=\"$emit('itemClicked')\"\n />\n <!-- Edit item menu -->\n <EditSection\n v-if=\"editMenuOpen\"\n @closeEditSection=\"closeEditSection\"\n :sectionIndex=\"index\"\n :isAddNew=\"false\"\n />\n <!-- Right-click item options context menu -->\n <ContextMenu\n :show=\"contextMenuOpen\"\n :posX=\"contextPos.posX\"\n :posY=\"contextPos.posY\"\n :id=\"`context-menu-${groupId}`\"\n v-click-outside=\"closeContextMenu\"\n @openEditSection=\"openEditSection\"\n @navigateToSection=\"navigateToSection\"\n @removeSection=\"removeSection\"\n />\n </Collapsable>\n</template>\n\n<script>\nimport router from '@/router';\nimport Item from '@/components/LinkItems/Item.vue';\nimport Collapsable from '@/components/LinkItems/Collapsable.vue';\nimport IframeModal from '@/components/LinkItems/IframeModal.vue';\nimport EditSection from '@/components/InteractiveEditor/EditSection.vue';\nimport ContextMenu from '@/components/LinkItems/SectionContextMenu.vue';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport StoreKeys from '@/utils/StoreMutations';\nimport {\n sortOrder as defaultSortOrder,\n localStorageKeys,\n modalNames,\n} from '@/utils/defaults';\n\nexport default {\n name: 'Section',\n props: {\n groupId: String,\n title: String,\n icon: String,\n displayData: Object,\n items: Array,\n itemSize: String,\n index: Number,\n },\n components: {\n Collapsable,\n ContextMenu,\n Item,\n IframeModal,\n EditSection,\n },\n data() {\n return {\n editMenuOpen: false,\n contextMenuOpen: false,\n contextPos: {\n posX: undefined,\n posY: undefined,\n },\n };\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n sortOrder() {\n return this.displayData.sortBy || defaultSortOrder;\n },\n /* If the sortBy attribute is specified, then return sorted data */\n sortedItems() {\n let { items } = this;\n if (this.appConfig.disableSmartSort) return items;\n if (this.sortOrder === 'alphabetical') {\n this.sortAlphabetically(items);\n } else if (this.sortOrder === 'reverse-alphabetical') {\n this.sortAlphabetically(items).reverse();\n } else if (this.sortOrder === 'most-used') {\n items = this.sortByMostUsed(items);\n } else if (this.sortOrder === 'last-used') {\n items = this.sortBLastUsed(items);\n } else if (this.sortOrder === 'random') {\n items = this.sortRandomly(items);\n } else if (this.sortOrder && this.sortOrder !== 'default') {\n ErrorHandler(`Unknown Sort order '${this.sortOrder}' under '${this.title}'`);\n }\n return items;\n },\n newItemSize() {\n return this.displayData.itemSize || this.itemSize;\n },\n isGridLayout() {\n return this.displayData.sectionLayout === 'grid'\n || !!(this.displayData.itemCountX || this.displayData.itemCountY);\n },\n gridStyle() {\n let styles = '';\n if (document.body.clientWidth > 600) { // Only proceed if not on tiny screen\n styles += this.displayData.itemCountX\n ? `grid-template-columns: repeat(${this.displayData.itemCountX}, minmax(0, 1fr));` : '';\n styles += this.displayData.itemCountY\n ? `grid-template-rows: repeat(${this.displayData.itemCountY}, minmax(0, 1fr));` : '';\n }\n return styles;\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n /* Opens the iframe modal */\n triggerModal(url) {\n this.$refs[`iframeModal-${this.groupId}`].show(url);\n },\n /* Determines if user has enabled online status checks */\n shouldEnableStatusCheck(itemPreference) {\n const globalPreference = this.appConfig.statusCheck || false;\n return itemPreference !== undefined ? itemPreference : globalPreference;\n },\n /* Determine how often to re-fire status checks */\n getStatusCheckInterval() {\n let interval = this.appConfig.statusCheckInterval;\n if (!interval) return 0;\n if (interval > 60) interval = 60;\n if (interval < 1) interval = 0;\n return interval;\n },\n /* Sorts items alphabetically using the title attribute */\n sortAlphabetically(items) {\n return items.sort((a, b) => (a.title > b.title ? 1 : -1));\n },\n /* Sorts items by most used to least used, based on click-count */\n sortByMostUsed(items) {\n const usageCount = JSON.parse(localStorage.getItem(localStorageKeys.MOST_USED) || '{}');\n const gmu = (item) => usageCount[item.id] || 0;\n items.reverse().sort((a, b) => (gmu(a) < gmu(b) ? 1 : -1));\n return items;\n },\n /* Sorts items by most recently used */\n sortBLastUsed(items) {\n const usageCount = JSON.parse(localStorage.getItem(localStorageKeys.LAST_USED) || '{}');\n const glu = (item) => usageCount[item.id] || 0;\n items.reverse().sort((a, b) => (glu(a) < glu(b) ? 1 : -1));\n return items;\n },\n /* Sorts items randomly */\n sortRandomly(items) {\n return items\n .map((value) => ({ value, sort: Math.random() }))\n .sort((a, b) => a.sort - b.sort)\n .map(({ value }) => value);\n },\n /* Navigate to the section's single-section view page */\n navigateToSection() {\n const parse = (section) => section.replace(' ', '-').toLowerCase().trim();\n const sectionIdentifier = parse(this.title);\n router.push({ path: `/home/${sectionIdentifier}` });\n this.closeContextMenu();\n },\n /* Open the Section Edit Menu */\n openEditSection() {\n this.editMenuOpen = true;\n this.$modal.show(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.closeContextMenu();\n },\n /* Close the section edit menu */\n closeEditSection() {\n this.editMenuOpen = false;\n this.$modal.hide(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* Deletes current section, in local state */\n removeSection() {\n const confirmMsg = this.$t('interactive-editor.edit-section.remove-confirm');\n const youSure = confirm(confirmMsg); // eslint-disable-line no-alert, no-restricted-globals\n if (youSure) {\n const payload = { sectionIndex: this.index, sectionName: this.title };\n this.$store.commit(StoreKeys.REMOVE_SECTION, payload);\n }\n this.closeContextMenu();\n },\n /* Open custom context menu, and set position */\n openContextMenu(e) {\n this.contextMenuOpen = true;\n if (e && window) {\n this.contextPos = {\n posX: e.clientX + window.pageXOffset,\n posY: e.clientY + window.pageYOffset,\n };\n }\n },\n /* Hide the right-click context menu */\n closeContextMenu() {\n this.contextMenuOpen = false;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.no-items {\n width: 100px;\n margin: 0 auto;\n padding: 0.8rem;\n text-align: center;\n cursor: default;\n color: var(--primary);\n background: var(--item-background);\n border-radius: var(--curve-factor);\n box-shadow: var(--item-shadow);\n}\n\n.there-are-items {\n height: 100%;\n display: flex;\n flex-wrap: wrap;\n &.item-group-grid {\n display: grid;\n overflow: auto;\n @extend .scroll-bar;\n @include phone { --item-col-count: 1; }\n @include tablet { --item-col-count: 2; }\n @include laptop { --item-col-count: 2; }\n @include monitor { --item-col-count: 3; }\n @include big-screen { --item-col-count: 4; }\n @include big-screen-up { --item-col-count: 5; }\n grid-template-columns: repeat(var(--item-col-count, 2), minmax(0, 1fr));\n }\n}\n.orientation-horizontal:not(.single-section-view) {\n display: flex;\n flex-direction: column;\n .there-are-items {\n display: grid;\n @include phone { --item-col-count: 2; }\n @include tablet { --item-col-count: 4; }\n @include laptop { --item-col-count: 6; }\n @include monitor { --item-col-count: 8; }\n @include big-screen { --item-col-count: 10; }\n @include big-screen-up { --item-col-count: 12; }\n grid-template-columns: repeat(var(--item-col-count, 2), minmax(0, 1fr));\n }\n .there-are-items.inner-size-large {\n display: grid;\n @include phone { --item-col-count: 1; }\n @include tablet { --item-col-count: 2; }\n @include laptop { --item-col-count: 3; }\n @include monitor { --item-col-count: 5; }\n @include big-screen { --item-col-count: 6; }\n @include big-screen-up { --item-col-count: 8; }\n grid-template-columns: repeat(var(--item-col-count, 2), minmax(0, 1fr));\n }\n}\n\n.add-new-item {\n display: flex;\n a {\n border-style: dashed;\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Section.vue?vue&type=template&id=64cbaaaf&scoped=true&\"\nimport script from \"./Section.vue?vue&type=script&lang=js&\"\nexport * from \"./Section.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Section.vue?vue&type=style&index=0&id=64cbaaaf&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"64cbaaaf\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"edit-mode-bottom-banner\"},[_c('div',{staticClass:\"edit-banner-section intro-container\"},[_c('p',{staticClass:\"section-sub-title edit-mode-intro l-1\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-mode-subtitle'))+\" \")]),_c('p',{staticClass:\"edit-mode-intro l-2\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-mode-description'))+\" \")])]),_c('div',{staticClass:\"edit-banner-section empty-space\"}),_c('div',{staticClass:\"edit-banner-section save-buttons-container\"},[_c('p',{staticClass:\"section-sub-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.config-save-methods-subheading'))+\" \")]),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.save-locally-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.save-locally-tooltip'))\"}],attrs:{\"click\":_vm.saveLocally}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-locally-btn'))+\" \"),_c('SaveLocallyIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.save-disk-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.save-disk-tooltip'))\"}],attrs:{\"click\":_vm.writeToDisk}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-disk-btn'))+\" \"),_c('SaveToDiskIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.export-config-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.export-config-tooltip'))\"}],attrs:{\"click\":_vm.openExportConfigMenu}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.export-config-btn'))+\" \"),_c('ExportIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.cloud-backup-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.cloud-backup-tooltip'))\"}],attrs:{\"click\":_vm.openCloudBackupMenu}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.cloud-backup-btn'))+\" \"),_c('CloudBackupIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.edit-raw-config-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.edit-raw-config-tooltip'))\"}],attrs:{\"click\":_vm.openRawConfigEditor}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-raw-config-btn'))+\" \"),_c('EditRawIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.cancel-changes-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.cancel-changes-tooltip'))\"}],attrs:{\"click\":_vm.reset}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.cancel-changes-btn'))+\" \"),_c('CancelIcon')],1)],1),_c('div',{staticClass:\"edit-banner-section edit-site-config-buttons\"},[_c('p',{staticClass:\"section-sub-title\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-site-data-subheading'))+\" \")]),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.edit-page-info-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.edit-page-info-tooltip'))\"}],attrs:{\"click\":_vm.openEditPageInfo}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-page-info-btn'))+\" \"),_c('PageInfoIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.menu.edit-app-config-tooltip'))),expression:\"tooltip($t('interactive-editor.menu.edit-app-config-tooltip'))\"}],attrs:{\"click\":_vm.openEditAppConfig}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.edit-app-config-btn'))+\" \"),_c('AppConfigIcon')],1)],1),_c('EditPageInfo'),_c('EditAppConfig')],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-page-info\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-page-info-inner\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.menu.edit-page-info-btn')))]),_c('FormSchema',{staticClass:\"page-info-form\",attrs:{\"schema\":_vm.schema,\"name\":\"pageInfoForm\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.saveToState.apply(null, arguments)}},model:{value:(_vm.formData),callback:function ($$v) {_vm.formData=$$v},expression:\"formData\"}},[_c('Button',{attrs:{\"type\":\"submit\"}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.menu.save-stage-btn'))+\" \"),_c('SaveIcon')],1)],1)],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\" @closed=\"modalClosed\"\n :resizable=\"true\" width=\"50%\" height=\"80%\"\n classes=\"dashy-modal edit-page-info\"\n >\n <div class=\"edit-page-info-inner\">\n <h3>{{ $t('interactive-editor.menu.edit-page-info-btn') }}</h3>\n <FormSchema\n :schema=\"schema\"\n v-model=\"formData\"\n @submit.prevent=\"saveToState\"\n class=\"page-info-form\"\n name=\"pageInfoForm\"\n >\n <Button type=\"submit\">\n {{ $t('interactive-editor.menu.save-stage-btn') }}\n <SaveIcon />\n </Button>\n </FormSchema>\n </div>\n </modal>\n</template>\n\n<script>\nimport FormSchema from '@formschema/native';\nimport DashySchema from '@/utils/ConfigSchema';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\nimport Button from '@/components/FormElements/Button';\nimport SaveIcon from '@/assets/interface-icons/save-config.svg';\n\nexport default {\n name: 'EditPageInfo',\n data() {\n return {\n formData: {},\n schema: DashySchema.properties.pageInfo,\n modalName: modalNames.EDIT_PAGE_INFO,\n };\n },\n components: {\n FormSchema,\n Button,\n SaveIcon,\n },\n mounted() {\n this.formData = this.pageInfo;\n },\n computed: {\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n },\n methods: {\n /* When form submitteed, update VueX store with new pageInfo, and close modal */\n saveToState() {\n this.$store.commit(StoreKeys.SET_PAGE_INFO, this.formData);\n this.$modal.hide(this.modalName);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n },\n /* Called when modal manually closed, updates state to allow searching again */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n@import '@/styles/schema-editor.scss';\n\n.edit-page-info-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .scroll-bar;\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem;\n }\n .page-info-form {\n @extend .schema-form;\n margin-bottom: 2.5rem;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditPageInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditPageInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditPageInfo.vue?vue&type=template&id=01a248f1&\"\nimport script from \"./EditPageInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./EditPageInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditPageInfo.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-app-config\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"edit-app-config-inner\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.menu.edit-app-config-btn')))]),_c('div',{staticClass:\"app-config-intro\"},[_c('p',{staticClass:\"use-caution\"},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-title'))+\" \")]),_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-l1'))+\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-l2'))+\" \"),_c('a',{attrs:{\"href\":\"https://dashy.to/docs/configuring#appconfig-optional\"}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-docs'))+\" \")]),_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-app-config.warning-msg-l3'))+\" \")]),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveToState,\"cancelClick\":_vm.cancelEditing}}),_c('FormSchema',{staticClass:\"app-config-form\",attrs:{\"schema\":_vm.schema,\"search\":true,\"name\":\"appConfigForm\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.saveToState.apply(null, arguments)}},model:{value:(_vm.formData),callback:function ($$v) {_vm.formData=$$v},expression:\"formData\"}}),_c('SaveCancelButtons',{attrs:{\"saveClick\":_vm.saveToState,\"cancelClick\":_vm.cancelEditing}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal\n :name=\"modalName\"\n :resizable=\"true\"\n width=\"50%\"\n height=\"80%\"\n classes=\"dashy-modal edit-app-config\"\n @closed=\"modalClosed\"\n >\n <div class=\"edit-app-config-inner\">\n <h3>{{ $t('interactive-editor.menu.edit-app-config-btn') }}</h3>\n <!-- Show caution message -->\n <div class=\"app-config-intro\">\n <p class=\"use-caution\">\n {{ $t('interactive-editor.edit-app-config.warning-msg-title') }}\n </p>\n {{ $t('interactive-editor.edit-app-config.warning-msg-l1') }}\n {{ $t('interactive-editor.edit-app-config.warning-msg-l2') }}\n <a href=\"https://dashy.to/docs/configuring#appconfig-optional\">\n {{ $t('interactive-editor.edit-app-config.warning-msg-docs') }}\n </a>\n {{ $t('interactive-editor.edit-app-config.warning-msg-l3') }}\n </div>\n <!-- Save Button, upper -->\n <SaveCancelButtons :saveClick=\"saveToState\" :cancelClick=\"cancelEditing\" />\n <!-- The main form -->\n <FormSchema\n :schema=\"schema\"\n v-model=\"formData\"\n @submit.prevent=\"saveToState\"\n :search=\"true\"\n class=\"app-config-form\"\n name=\"appConfigForm\"\n ></FormSchema>\n <!-- Save Button, lower -->\n <SaveCancelButtons :saveClick=\"saveToState\" :cancelClick=\"cancelEditing\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport FormSchema from '@formschema/native';\nimport DashySchema from '@/utils/ConfigSchema';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\nimport SaveCancelButtons from '@/components/InteractiveEditor/SaveCancelButtons';\n\nexport default {\n name: 'EditAppConfig',\n data() {\n return {\n formData: {},\n schema: DashySchema.properties.appConfig,\n modalName: modalNames.EDIT_APP_CONFIG,\n };\n },\n props: {},\n components: {\n FormSchema,\n SaveCancelButtons,\n },\n mounted() {\n this.formData = this.appConfig;\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n methods: {\n /* When form submitteed, update VueX store with new appConfig, and close modal */\n saveToState() {\n const processedFormData = this.removeUndefinedValues(this.formData);\n this.$store.commit(StoreKeys.SET_APP_CONFIG, processedFormData);\n this.$modal.hide(this.modalName);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, true);\n },\n cancelEditing() {\n this.$modal.hide(this.modalName);\n },\n /* Called when modal manually closed, updates state to allow searching again */\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* Remove any attribute which has an undefined value before saving */\n removeUndefinedValues(rawAppConfig) {\n const raw = rawAppConfig;\n const isEmpty = (value) => (value === undefined);\n Object.keys(raw).forEach(key => isEmpty(raw[key]) && delete raw[key]);\n return raw;\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n@import '@/styles/schema-editor.scss';\n\n.edit-app-config-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n @extend .scroll-bar;\n h3 {\n font-size: 1.4rem;\n margin: 0.5rem;\n }\n .app-config-form {\n @extend .schema-form;\n border-top: 1px dashed var(--interactive-editor-color);\n }\n .app-config-intro {\n padding: 0.5rem;\n font-size: 0.9rem;\n color: var(--interactive-editor-color);\n background: var(--interactive-editor-background-darker);\n border-radius: var(--interactive-editor-color);\n p.use-caution {\n color: var(--warning);\n margin: 0;\n font-weight: bold;\n }\n a {\n color: var(--interactive-editor-color);\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditAppConfig.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditAppConfig.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditAppConfig.vue?vue&type=template&id=7e7e9b78&\"\nimport script from \"./EditAppConfig.vue?vue&type=script&lang=js&\"\nexport * from \"./EditAppConfig.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditAppConfig.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <!-- Intro Info -->\n <div class=\"edit-mode-bottom-banner\">\n <div class=\"edit-banner-section intro-container\">\n <p class=\"section-sub-title edit-mode-intro l-1\">\n {{ $t('interactive-editor.menu.edit-mode-subtitle') }}\n </p>\n <p class=\"edit-mode-intro l-2\">\n {{ $t('interactive-editor.menu.edit-mode-description') }}\n </p>\n </div>\n <div class=\"edit-banner-section empty-space\"></div>\n <!-- Save Buttons -->\n <div class=\"edit-banner-section save-buttons-container\">\n <p class=\"section-sub-title\">\n {{ $t('interactive-editor.menu.config-save-methods-subheading') }}\n </p>\n <Button\n :click=\"saveLocally\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.save-locally-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.save-locally-btn') }}\n <SaveLocallyIcon />\n </Button>\n <Button\n :click=\"writeToDisk\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.save-disk-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.save-disk-btn') }}\n <SaveToDiskIcon />\n </Button>\n <Button\n :click=\"openExportConfigMenu\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.export-config-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.export-config-btn') }}\n <ExportIcon />\n </Button>\n <Button\n :click=\"openCloudBackupMenu\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.cloud-backup-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.cloud-backup-btn') }}\n <CloudBackupIcon />\n </Button>\n <Button\n :click=\"openRawConfigEditor\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.edit-raw-config-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.edit-raw-config-btn') }}\n <EditRawIcon />\n </Button>\n <Button\n :click=\"reset\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.cancel-changes-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.cancel-changes-btn') }}\n <CancelIcon />\n </Button>\n </div>\n <!-- Open Modal Buttons -->\n <div class=\"edit-banner-section edit-site-config-buttons\">\n <p class=\"section-sub-title\">\n {{ $t('interactive-editor.menu.edit-site-data-subheading') }}\n </p>\n <Button\n :click=\"openEditPageInfo\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.edit-page-info-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.edit-page-info-btn') }}\n <PageInfoIcon />\n </Button>\n <Button\n :click=\"openEditAppConfig\"\n v-tooltip=\"tooltip($t('interactive-editor.menu.edit-app-config-tooltip'))\"\n >\n {{ $t('interactive-editor.menu.edit-app-config-btn') }}\n <AppConfigIcon />\n </Button>\n </div>\n <!-- Modals for editing appConfig + pageInfo -->\n <EditPageInfo />\n <EditAppConfig />\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\nimport jsYaml from 'js-yaml';\nimport ProgressBar from 'rsup-progress';\n\nimport Button from '@/components/FormElements/Button';\nimport StoreKeys from '@/utils/StoreMutations';\nimport EditPageInfo from '@/components/InteractiveEditor/EditPageInfo';\nimport EditAppConfig from '@/components/InteractiveEditor/EditAppConfig';\nimport { modalNames, localStorageKeys, serviceEndpoints } from '@/utils/defaults';\nimport ErrorHandler, { InfoHandler } from '@/utils/ErrorHandler';\n\nimport SaveLocallyIcon from '@/assets/interface-icons/interactive-editor-save-locally.svg';\nimport SaveToDiskIcon from '@/assets/interface-icons/interactive-editor-save-disk.svg';\nimport ExportIcon from '@/assets/interface-icons/interactive-editor-export-changes.svg';\nimport CancelIcon from '@/assets/interface-icons/interactive-editor-cancel-changes.svg';\nimport AppConfigIcon from '@/assets/interface-icons/interactive-editor-app-config.svg';\nimport PageInfoIcon from '@/assets/interface-icons/interactive-editor-page-info.svg';\nimport CloudBackupIcon from '@/assets/interface-icons/cloud-backup-restore.svg';\nimport EditRawIcon from '@/assets/interface-icons/config-edit-json.svg';\n\nexport default {\n name: 'EditModeSaveMenu',\n components: {\n Button,\n EditPageInfo,\n SaveLocallyIcon,\n SaveToDiskIcon,\n ExportIcon,\n CancelIcon,\n AppConfigIcon,\n PageInfoIcon,\n EditAppConfig,\n CloudBackupIcon,\n EditRawIcon,\n },\n computed: {\n config() {\n return this.$store.state.config;\n },\n },\n data() {\n return {\n saveSuccess: undefined,\n responseText: '',\n progress: new ProgressBar({ color: 'var(--progress-bar)' }),\n };\n },\n methods: {\n reset() {\n this.$store.dispatch(StoreKeys.INITIALIZE_CONFIG);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, false);\n },\n openExportConfigMenu() {\n this.$modal.show(modalNames.EXPORT_CONFIG_MENU);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n openEditPageInfo() {\n this.$modal.show(modalNames.EDIT_PAGE_INFO);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n openEditAppConfig() {\n this.$modal.show(modalNames.EDIT_APP_CONFIG);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n openCloudBackupMenu() {\n this.$store.commit(StoreKeys.CONF_MENU_INDEX, 2);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.$modal.show(modalNames.CONF_EDITOR);\n },\n openRawConfigEditor() {\n this.$store.commit(StoreKeys.CONF_MENU_INDEX, 1);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n this.$modal.show(modalNames.CONF_EDITOR);\n },\n tooltip(content) {\n return { content, trigger: 'hover focus', delay: 250 };\n },\n showToast(message, success) {\n this.$toasted.show(message, { className: `toast-${success ? 'success' : 'error'}` });\n },\n carefullyClearLocalStorage() {\n localStorage.removeItem(localStorageKeys.PAGE_INFO);\n localStorage.removeItem(localStorageKeys.APP_CONFIG);\n localStorage.removeItem(localStorageKeys.CONF_SECTIONS);\n },\n saveLocally() {\n const data = this.config;\n localStorage.setItem(localStorageKeys.CONF_SECTIONS, JSON.stringify(data.sections));\n localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(data.pageInfo));\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(data.appConfig));\n if (data.appConfig.theme) {\n localStorage.setItem(localStorageKeys.THEME, data.appConfig.theme);\n }\n InfoHandler('Config has succesfully been saved in browser storage', 'Config Update');\n this.showToast(this.$t('config-editor.success-msg-local'), true);\n this.$store.commit(StoreKeys.SET_EDIT_MODE, false);\n },\n writeToDisk() {\n // 1. Convert JSON into YAML\n const yamlOptions = {};\n const yaml = jsYaml.dump(this.config, yamlOptions);\n // 2. Prepare the request\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}${serviceEndpoints.save}`;\n const headers = { 'Content-Type': 'text/plain' };\n const body = { config: yaml, timestamp: new Date() };\n const request = axios.post(endpoint, body, headers);\n // 3. Make the request, and handle response\n this.progress.start();\n request.then((response) => {\n this.saveSuccess = response.data.success || false;\n this.responseText = response.data.message;\n if (this.saveSuccess) {\n this.carefullyClearLocalStorage();\n this.showToast(this.$t('config-editor.success-msg-disk'), true);\n } else {\n this.showToast(this.$t('config-editor.error-msg-cannot-save'), false);\n }\n InfoHandler('Config has been written to disk succesfully', 'Config Update');\n this.progress.end();\n this.$store.commit(StoreKeys.SET_EDIT_MODE, false);\n })\n .catch((error) => {\n this.saveSuccess = false;\n this.responseText = error;\n this.showToast(error, false);\n ErrorHandler(`Failed to save config. ${error}`);\n this.progress.end();\n });\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n\ndiv.edit-mode-bottom-banner {\n position: fixed;\n display: grid;\n z-index: 5;\n bottom: 0;\n width: 100%;\n padding: 0.25rem 0;\n border-top: 2px solid var(--interactive-editor-color);\n background: var(--interactive-editor-background-darker);\n box-shadow: 0 -5px 7px var(--transparent-50);\n grid-template-columns: 45% 10% 45%;\n @include laptop-up { grid-template-columns: 40% 20% 40%; }\n @include monitor-up { grid-template-columns: 30% 40% 30%; }\n @include big-screen-up { grid-template-columns: 25% 50% 25%; }\n\n /* Main sections */\n .edit-banner-section {\n padding: 0.5rem;\n height: 90%;\n /* Section sub-titles */\n p.section-sub-title {\n margin: 0;\n color: var(--interactive-editor-color);\n font-weight: bold;\n cursor: default;\n }\n /* Intro-text container */\n &.intro-container {\n p.edit-mode-intro {\n margin: 0;\n color: var(--interactive-editor-color);\n cursor: default;\n }\n }\n /* Button containers */\n &.edit-site-config-buttons,\n &.save-buttons-container {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n button {\n margin: 0.25rem;\n height: stretch;\n }\n p.section-sub-title {\n grid-column-start: span 2;\n }\n }\n &.save-buttons-container {\n grid-row-start: span 2;\n }\n }\n\n /* Mobile layout */\n @include tablet-down {\n display: flex;\n flex-direction: column;\n .edit-banner-section,\n .edit-banner-section.intro-container {\n max-width: 90%;\n width: 100%;\n margin: 0.2rem auto;\n flex-direction: column;\n }\n }\n /* Set colors for buttons */\n .edit-banner-section button {\n color: var(--interactive-editor-color);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-background);\n &:hover {\n color: var(--interactive-editor-background);\n border-color: var(--interactive-editor-color);\n background: var(--interactive-editor-color);\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeSaveMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeSaveMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./EditModeSaveMenu.vue?vue&type=template&id=1893de4e&scoped=true&\"\nimport script from \"./EditModeSaveMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./EditModeSaveMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./EditModeSaveMenu.vue?vue&type=style&index=0&id=1893de4e&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"1893de4e\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('modal',{attrs:{\"name\":_vm.modalName,\"resizable\":true,\"width\":\"50%\",\"height\":\"80%\",\"classes\":\"dashy-modal edit-item\"},on:{\"closed\":_vm.modalClosed}},[_c('div',{staticClass:\"export-config-inner\"},[_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.export.export-title')))]),_c('div',{staticClass:\"download-button-container\"},[_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.export.copy-clipboard-tooltip'))),expression:\"tooltip($t('interactive-editor.export.copy-clipboard-tooltip'))\"}],attrs:{\"click\":_vm.copyConfigToClipboard}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.export.copy-clipboard-btn'))+\" \"),_c('CopyConfigIcon')],1),_c('Button',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip(_vm.$t('interactive-editor.export.download-file-tooltip'))),expression:\"tooltip($t('interactive-editor.export.download-file-tooltip'))\"}],attrs:{\"click\":_vm.downloadConfig}},[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.export.download-file-btn'))+\" \"),_c('DownloadConfigIcon')],1)],1),_c('h3',[_vm._v(_vm._s(_vm.$t('interactive-editor.export.view-title')))]),_c('tree-view',{staticClass:\"config-tree-view\",attrs:{\"data\":_vm.config}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n<modal\n :name=\"modalName\"\n :resizable=\"true\"\n width=\"50%\"\n height=\"80%\"\n classes=\"dashy-modal edit-item\"\n @closed=\"modalClosed\"\n >\n <div class=\"export-config-inner\">\n <!-- Download and Copy to CLipboard Buttons -->\n <h3>{{ $t('interactive-editor.export.export-title') }}</h3>\n <div class=\"download-button-container\">\n <Button :click=\"copyConfigToClipboard\"\n v-tooltip=\"tooltip($t('interactive-editor.export.copy-clipboard-tooltip'))\">\n {{ $t('interactive-editor.export.copy-clipboard-btn') }}\n <CopyConfigIcon />\n </Button>\n <Button :click=\"downloadConfig\"\n v-tooltip=\"tooltip($t('interactive-editor.export.download-file-tooltip'))\">\n {{ $t('interactive-editor.export.download-file-btn') }}\n <DownloadConfigIcon />\n </Button>\n </div>\n <!-- View Config in Tree Mode Section -->\n <h3>{{ $t('interactive-editor.export.view-title') }}</h3>\n <tree-view :data=\"config\" class=\"config-tree-view\" />\n </div>\n </modal>\n</template>\n\n<script>\nimport JsYaml from 'js-yaml';\nimport Button from '@/components/FormElements/Button';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\nimport DownloadConfigIcon from '@/assets/interface-icons/config-download-file.svg';\nimport CopyConfigIcon from '@/assets/interface-icons/interactive-editor-copy-clipboard.svg';\nimport { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';\n\nexport default {\n name: 'ExportConfigMenu',\n components: {\n Button,\n CopyConfigIcon,\n DownloadConfigIcon,\n },\n data() {\n return {\n modalName: modalNames.EXPORT_CONFIG_MENU,\n };\n },\n props: {},\n computed: {\n config() {\n return this.$store.state.config;\n },\n },\n methods: {\n convertJsonToYaml() {\n return JsYaml.dump(this.config);\n },\n downloadConfig() {\n const filename = 'dashy_conf.yml';\n const config = this.convertJsonToYaml();\n const element = document.createElement('a');\n element.setAttribute('href', `data:text/plain;charset=utf-8, ${encodeURIComponent(config)}`);\n element.setAttribute('download', filename);\n element.style.display = 'none';\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n InfoHandler('Config downloaded as YAML file', InfoKeys.EDITOR);\n },\n copyConfigToClipboard() {\n const config = this.convertJsonToYaml();\n navigator.clipboard.writeText(config);\n this.$toasted.show(this.$t('config.data-copied-msg'));\n InfoHandler('Config copied to clipboard', InfoKeys.EDITOR);\n },\n modalClosed() {\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n tooltip(content) {\n return {\n content, trigger: 'hover focus', delay: 250, classes: 'in-modal-tt',\n };\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n@import '@/styles/style-helpers.scss';\n@import '@/styles/media-queries.scss';\n.tooltip { z-index: 99; }\n.export-config-inner {\n padding: 1rem;\n background: var(--interactive-editor-background);\n color: var(--interactive-editor-color);\n height: 100%;\n overflow-y: auto;\n h3 {\n margin: 1rem 0;\n }\n .download-button-container {\n display: flex;\n justify-content: center;\n padding: 0 0.5rem 1rem;\n border-bottom: 1px dashed var(--interactive-editor-color);\n button { margin: 0 1rem; }\n }\n .config-tree-view {\n padding: 0.5rem;\n font-family: var(--font-monospace);\n color: var(--interactive-editor-color);\n background: var(--interactive-editor-background-darker);\n border-radius: var(--curve-factor);\n box-shadow: 0px 0px 3px var(--interactive-editor-color);\n margin-bottom: 1.5rem;\n span {\n font-family: var(--font-monospace);\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ExportConfigMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ExportConfigMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ExportConfigMenu.vue?vue&type=template&id=2769904e&\"\nimport script from \"./ExportConfigMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ExportConfigMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ExportConfigMenu.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"add-section\"},[(_vm.isEditMode)?_c('div',{staticClass:\"add-new-section\",on:{\"click\":function($event){return _vm.openAddNewSectionMenu()}}},[_c('p',[_vm._v(\" \"+_vm._s(_vm.$t('interactive-editor.edit-section.add-section-title')))])]):_vm._e(),(_vm.isEditMode && _vm.addNewSectionOpen)?_c('EditSectionMenu',{attrs:{\"isAddNew\":true},on:{\"closeEditSection\":_vm.closeEditSection}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<!-- Main homepage for default view -->\n<template>\n <div class=\"add-section\">\n <!-- When in edit mode, show Add New Section button -->\n <div v-if=\"isEditMode\" @click=\"openAddNewSectionMenu()\" class=\"add-new-section\">\n <p> {{ $t('interactive-editor.edit-section.add-section-title') }}</p>\n </div>\n <!-- Add new section form -->\n <EditSectionMenu\n v-if=\"isEditMode && addNewSectionOpen\"\n :isAddNew=\"true\"\n @closeEditSection=\"closeEditSection\"\n />\n </div>\n</template>\n\n<script>\n\nimport EditSectionMenu from '@/components/InteractiveEditor/EditSection.vue';\nimport StoreKeys from '@/utils/StoreMutations';\nimport { modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'add-section-container',\n components: {\n EditSectionMenu,\n },\n data: () => ({\n addNewSectionOpen: false,\n }),\n computed: {\n isEditMode() {\n return this.$store.state.editMode;\n },\n },\n methods: {\n openAddNewSectionMenu() {\n this.addNewSectionOpen = true;\n this.$modal.show(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n closeEditSection() {\n this.addNewSectionOpen = false;\n this.$modal.hide(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n.add-new-section {\n border: 2px dashed var(--primary);\n border-radius: var(--curve-factor);\n padding: var(--item-group-padding);\n background: var(--item-group-background);\n color: var(--primary);\n font-size: 1.2rem;\n cursor: pointer;\n text-align: center;\n height: fit-content;\n margin: 10px;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AddNewSectionLauncher.vue?vue&type=template&id=53ced373&scoped=true&\"\nimport script from \"./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"\nexport * from \"./AddNewSectionLauncher.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AddNewSectionLauncher.vue?vue&type=style&index=0&id=53ced373&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"53ced373\",\n null\n \n)\n\nexport default component.exports","<!-- Main homepage for default view -->\n<template>\n <div class=\"home\" :style=\"getBackgroundImage()\">\n <!-- Search bar, layout options and settings -->\n <SettingsContainer ref=\"filterComp\"\n @user-is-searchin=\"searching\"\n @change-modal-visibility=\"updateModalVisibility\"\n :displayLayout=\"layout\"\n :iconSize=\"itemSizeBound\"\n :externalThemes=\"getExternalCSSLinks()\"\n :modalOpen=\"modalOpen\"\n class=\"settings-outer\"\n />\n <!-- Show back button, when on single-section view -->\n <div v-if=\"singleSectionView\">\n <router-link to=\"/home\" class=\"back-to-all-link\">\n <BackIcon />\n <span>Back to All</span>\n </router-link>\n </div>\n <!-- Main content, section for each group of items -->\n <div v-if=\"checkTheresData(sections)\"\n :class=\"`item-group-container `\n + `orientation-${layout} `\n + `item-size-${itemSizeBound} `\n + (isEditMode ? 'edit-mode ' : '')\n + (singleSectionView ? 'single-section-view ' : '')\n + (this.colCount ? `col-count-${this.colCount} ` : '')\"\n >\n <Section\n v-for=\"(section, index) in filteredTiles\"\n :key=\"index\"\n :index=\"index\"\n :title=\"section.name\"\n :icon=\"section.icon || undefined\"\n :displayData=\"getDisplayData(section)\"\n :groupId=\"`section-${index}`\"\n :items=\"filterTiles(section.items, searchValue)\"\n :searchTerm=\"searchValue\"\n :itemSize=\"itemSizeBound\"\n @itemClicked=\"finishedSearching()\"\n @change-modal-visibility=\"updateModalVisibility\"\n :class=\"\n (searchValue && filterTiles(section.items, searchValue).length === 0) ? 'no-results' : ''\"\n />\n <!-- Show add new section button, in edit mode -->\n <AddNewSection v-if=\"isEditMode\" />\n </div>\n <!-- Show message when there's no data to show -->\n <div v-if=\"checkIfResults()\" class=\"no-data\">\n {{searchValue ? $t('home.no-results') : $t('home.no-data')}}\n </div>\n <!-- Show banner at bottom of screen, for Saving config changes -->\n <EditModeSaveMenu v-if=\"isEditMode\" />\n <!-- Modal for viewing and exporting configuration file -->\n <ExportConfigMenu />\n </div>\n</template>\n\n<script>\n\nimport SettingsContainer from '@/components/Settings/SettingsContainer.vue';\nimport Section from '@/components/LinkItems/Section.vue';\nimport EditModeSaveMenu from '@/components/InteractiveEditor/EditModeSaveMenu.vue';\nimport ExportConfigMenu from '@/components/InteractiveEditor/ExportConfigMenu.vue';\nimport AddNewSection from '@/components/InteractiveEditor/AddNewSectionLauncher.vue';\nimport { searchTiles } from '@/utils/Search';\nimport StoreKeys from '@/utils/StoreMutations';\nimport Defaults, { localStorageKeys, iconCdns, modalNames } from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport BackIcon from '@/assets/interface-icons/back-arrow.svg';\n\nexport default {\n name: 'home',\n components: {\n SettingsContainer,\n EditModeSaveMenu,\n ExportConfigMenu,\n AddNewSection,\n Section,\n BackIcon,\n },\n data: () => ({\n searchValue: '',\n layout: '',\n itemSizeBound: '',\n addNewSectionOpen: false,\n }),\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n modalOpen() {\n return this.$store.state.modalOpen;\n },\n singleSectionView() {\n return this.findSingleSection(this.$store.getters.sections, this.$route.params.section);\n },\n isEditMode() {\n return this.$store.state.editMode;\n },\n /* Get class for num columns, if specified by user */\n colCount() {\n let { colCount } = this.appConfig;\n if (!colCount) return null;\n if (colCount < 1) colCount = 1;\n if (colCount > 8) colCount = 8;\n return colCount;\n },\n /* Return all sections, that match users search term */\n filteredTiles() {\n const sections = this.singleSectionView || this.sections;\n return sections.filter((section) => this.filterTiles(section.items, this.searchValue));\n },\n /* Updates layout (when button clicked), and saves in local storage */\n layoutOrientation() {\n return this.$store.getters.layout;\n },\n /* Updates icon size (when button clicked), and saves in local storage */\n iconSize() {\n return this.$store.getters.iconSize;\n },\n },\n watch: {\n layoutOrientation(layout) {\n localStorage.setItem(localStorageKeys.LAYOUT_ORIENTATION, layout);\n this.layout = layout;\n },\n iconSize(size) {\n localStorage.setItem(localStorageKeys.ICON_SIZE, size);\n this.itemSizeBound = size;\n },\n },\n methods: {\n /* Returns true if there is one or more sections in the config */\n checkTheresData(sections) {\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n return (sections && sections.length >= 1) || (localSections && localSections.length >= 1);\n },\n /* Updates local data with search value, triggered from filter comp */\n searching(searchValue) {\n this.searchValue = searchValue || '';\n },\n /* Clears input field, once a searched item is opened */\n finishedSearching() {\n this.$refs.filterComp.clearFilterInput();\n },\n /* Returns only the tiles that match the users search query */\n filterTiles(allTiles, searchTerm) {\n return searchTiles(allTiles, searchTerm);\n },\n /* Returns optional section display preferences if available */\n getDisplayData(section) {\n return !section.displayData ? {} : section.displayData;\n },\n /* Update data when modal is open (so that key bindings can be disabled) */\n updateModalVisibility(modalState) {\n this.$store.commit('SET_MODAL_OPEN', modalState);\n },\n openAddNewSectionMenu() {\n this.addNewSectionOpen = true;\n this.$modal.show(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);\n },\n closeEditSection() {\n this.addNewSectionOpen = false;\n this.$modal.hide(modalNames.EDIT_SECTION);\n this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);\n },\n /* If on sub-route, and section exists, then return only that section */\n findSingleSection: (allSections, sectionTitle) => {\n if (!sectionTitle) return undefined;\n let sectionToReturn;\n const parse = (section) => section.replaceAll(' ', '-').toLowerCase().trim();\n allSections.forEach((section) => {\n if (parse(sectionTitle) === parse(section.name)) {\n sectionToReturn = [section];\n }\n });\n if (!sectionToReturn) ErrorHandler(`No section named '${sectionTitle}' was found`);\n return sectionToReturn;\n },\n /* Returns an array of links to external CSS from the Config */\n getExternalCSSLinks() {\n const availibleThemes = {};\n if (this.appConfig) {\n if (this.appConfig.externalStyleSheet) {\n const externals = this.appConfig.externalStyleSheet;\n if (Array.isArray(externals)) {\n externals.forEach((ext, i) => {\n availibleThemes[`External Stylesheet ${i + 1}`] = ext;\n });\n } else {\n availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;\n }\n }\n }\n availibleThemes.Default = '#';\n return availibleThemes;\n },\n /* Checks if any sections or items use icons from a given CDN */\n checkIfIconLibraryNeeded(prefix) {\n let isNeeded = false;\n if (!this.sections) return false;\n this.sections.forEach((section) => {\n if (section.icon && section.icon.includes(prefix)) isNeeded = true;\n section.items.forEach((item) => {\n if (item.icon && item.icon.includes(prefix)) isNeeded = true;\n });\n });\n return isNeeded;\n },\n /* Checks if any of the icons are Font Awesome glyphs */\n checkIfFontAwesomeNeeded() {\n let isNeeded = this.checkIfIconLibraryNeeded('fa-');\n const currentTheme = localStorage[localStorageKeys.THEME]; // Some themes require FA\n if (['material', 'material-dark'].includes(currentTheme)) isNeeded = true;\n return isNeeded;\n },\n /* Injects font-awesome's script tag, only if needed */\n initiateFontAwesome() {\n if (this.appConfig.enableFontAwesome || this.checkIfFontAwesomeNeeded()) {\n const fontAwesomeScript = document.createElement('script');\n const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;\n fontAwesomeScript.setAttribute('src', `${iconCdns.fa}/${faKey}.js`);\n document.head.appendChild(fontAwesomeScript);\n }\n },\n /* Checks if any of the icons are Material Design Icons */\n checkIfMdiNeeded() {\n return this.checkIfIconLibraryNeeded('mdi-');\n },\n /* Injects Material Design Icons, only if needed */\n initiateMaterialDesignIcons() {\n if (this.checkIfMdiNeeded()) {\n const mdiStylesheet = document.createElement('link');\n mdiStylesheet.setAttribute('rel', 'stylesheet');\n mdiStylesheet.setAttribute('href', iconCdns.mdi);\n document.head.appendChild(mdiStylesheet);\n }\n },\n /* Returns true if there is more than 1 sub-result visible during searching */\n checkIfResults() {\n if (!this.sections) return false;\n else {\n let itemsFound = true;\n this.sections.forEach((section) => {\n if (this.filterTiles(section.items, this.searchValue).length > 0) itemsFound = false;\n });\n return itemsFound;\n }\n },\n /* If user has a background image, then generate CSS attributes */\n getBackgroundImage() {\n if (this.appConfig && this.appConfig.backgroundImg) {\n return `background: url('${this.appConfig.backgroundImg}');background-size:cover;`;\n }\n return '';\n },\n },\n mounted() {\n this.initiateFontAwesome();\n this.initiateMaterialDesignIcons();\n this.layout = this.layoutOrientation;\n this.itemSizeBound = this.iconSize;\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.home {\n padding-bottom: 1px;\n background: var(--background);\n min-height: calc(99.9vh - var(--footer-height));\n}\n\n.back-to-all-link {\n display: flex;\n align-items: center;\n padding: 0.25rem;\n margin: 0.25rem;\n @extend .svg-button;\n svg { margin-right: 0.5rem; }\n text-decoration: none;\n}\n\n/* Outside container wrapping the item groups*/\n.item-group-container {\n display: grid;\n gap: 0.5rem;\n margin: 0 auto;\n max-width: 90%;\n overflow: auto;\n @extend .scroll-bar;\n @include monitor-up {\n max-width: 1400px;\n }\n\n /* Options for alternate layouts, triggered by buttons */\n &.orientation-horizontal {\n display: flex;\n flex-direction: column;\n }\n &.orientation-vertical {\n max-width: 100%;\n @include tablet-up {\n display: flex;\n flex-direction: row;\n }\n }\n &.orientation-horizontal, &.orientation-vertical, &.single-section-view {\n @include phone { --content-max-width: 100%; }\n @include tablet { --content-max-width: 98%; }\n @include laptop { --content-max-width: 90%; }\n @include monitor { --content-max-width: 85%; }\n @include big-screen { --content-max-width: 80%; }\n @include big-screen-up { --content-max-width: 60%; }\n max-width: var(--content-max-width, 90%);\n }\n\n /* Specify number of columns, based on screen size or user preference */\n @include phone { --col-count: 1; }\n @include tablet { --col-count: 2; }\n @include laptop { --col-count: 2; }\n @include monitor { --col-count: 3; }\n @include big-screen { --col-count: 4; }\n @include big-screen-up { --col-count: 5; }\n\n @include tablet-up {\n &.col-count-1 { --col-count: 1; }\n &.col-count-2 { --col-count: 2; }\n &.col-count-3 { --col-count: 3; }\n &.col-count-4 { --col-count: 4; }\n &.col-count-5 { --col-count: 5; }\n &.col-count-6 { --col-count: 6; }\n &.col-count-7 { --col-count: 7; }\n &.col-count-8 { --col-count: 8; }\n }\n\n grid-template-columns: repeat(var(--col-count, 2), minmax(0, 1fr));\n\n /* Hide when search term returns nothing */\n .no-results { display: none; }\n\n /* Additional spacing when in edit mode */\n &.edit-mode {\n margin-bottom: 12rem;\n }\n\n /* When in single-section view mode */\n &.single-section-view {\n display: block;\n }\n .add-new-section {\n border: 2px dashed var(--primary);\n border-radius: var(--curve-factor);\n padding: var(--item-group-padding);\n background: var(--item-group-background);\n color: var(--primary);\n font-size: 1.2rem;\n cursor: pointer;\n text-align: center;\n height: fit-content;\n margin: 10px;\n }\n}\n\n/* Custom styles only applied when there is no sections in config */\n.no-data {\n font-size: 2rem;\n color: var(--background);\n background: #ffffffeb;\n width: fit-content;\n margin: 2rem auto;\n padding: 0.5rem 1rem;\n border-radius: var(--curve-factor);\n}\n\n/* Settings section, includes search, config and user settings */\nsection.settings-outer {\n border-bottom: 1px solid var(--outline-color);\n @include phone {\n flex-direction: column;\n }\n}\n\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=36369dae&scoped=true&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Home.vue?vue&type=style&index=0&id=36369dae&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"36369dae\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"login-page\"},[(_vm.isUserAlreadyLoggedIn)?_c('div',{staticClass:\"already-logged-in\"},[_c('h2',[_vm._v(_vm._s(_vm.$t('login.already-logged-in-title')))]),_c('p',{staticClass:\"already-logged-in\"},[_vm._v(\" \"+_vm._s(_vm.$t('login.already-logged-in-text'))+\" \"),_c('span',{staticClass:\"username\"},[_vm._v(_vm._s(_vm.existingUsername))])]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.stayLoggedIn}},[_vm._v(\" \"+_vm._s(_vm.$t('login.proceed-to-dashboard'))+\" \")]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.getOut}},[_vm._v(_vm._s(_vm.$t('login.log-out-button')))]),_c('span',{staticClass:\"already-logged-in-note\"},[_vm._v(\" You need to log out, in order to proceed as a different user. \")]),_c('transition',{attrs:{\"name\":\"bounce\"}},[_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.message),expression:\"message\"}],class:(\"login-error-message \" + _vm.status)},[_vm._v(_vm._s(_vm.message))])])],1):_vm._e(),((!_vm.isUserAlreadyLoggedIn) && _vm.isAuthenticationEnabled)?_c('form',{staticClass:\"login-form\"},[_c('h2',{staticClass:\"login-title\"},[_vm._v(_vm._s(_vm.$t('login.title')))]),_c('Input',{staticClass:\"login-field username\",attrs:{\"type\":\"text\",\"label\":_vm.$t('login.username-label')},model:{value:(_vm.username),callback:function ($$v) {_vm.username=$$v},expression:\"username\"}}),_c('Input',{staticClass:\"login-field password\",attrs:{\"type\":\"password\",\"label\":_vm.$t('login.password-label')},model:{value:(_vm.password),callback:function ($$v) {_vm.password=$$v},expression:\"password\"}}),_c('label',[_vm._v(_vm._s(_vm.$t('login.remember-me-label')))]),_c('v-select',{staticClass:\"login-time-dropdown\",attrs:{\"selectOnTab\":true,\"options\":_vm.dropDownMenu},model:{value:(_vm.timeout),callback:function ($$v) {_vm.timeout=$$v},expression:\"timeout\"}}),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.submitLogin}},[_vm._v(\" \"+_vm._s(_vm.$t('login.login-button'))+\" \")]),_c('transition',{attrs:{\"name\":\"bounce\"}},[_c('p',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.message),expression:\"message\"}],class:(\"login-error-message \" + _vm.status)},[_vm._v(_vm._s(_vm.message))])])],1):_vm._e(),(_vm.isGuestAccessEnabled && !_vm.isUserAlreadyLoggedIn && _vm.isAuthenticationEnabled)?_c('form',{staticClass:\"guest-form\"},[_c('h2',{staticClass:\"login-title\"},[_vm._v(\"Guest Access\")]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.guestLogin}},[_vm._v(\" \"+_vm._s(_vm.$t('login.proceed-guest-button'))+\" \")]),_vm._m(0)],1):_vm._e(),(!_vm.isAuthenticationEnabled)?_c('div',{staticClass:\"not-configured\"},[_c('h2',[_vm._v(\"Error\")]),_c('p',[_vm._v(\"Authentication is not enabled, or no users have been configured\")]),_c('Button',{staticClass:\"login-button\",attrs:{\"click\":_vm.guestLogin}},[_vm._v(\" Go Home \")])],1):_vm._e()])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',{staticClass:\"guest-intro\"},[_vm._v(\" This instance has guest access enabled.\"),_c('br'),_vm._v(\" Guests have view-only access to dashboards, so cannot write any changes to disk. \")])}]\n\nexport { render, staticRenderFns }","<template>\n <div class=\"login-page\">\n <!-- User is already logged in -->\n <div v-if=\"isUserAlreadyLoggedIn\" class=\"already-logged-in\">\n <h2>{{ $t('login.already-logged-in-title') }}</h2>\n <p class=\"already-logged-in\">\n {{ $t('login.already-logged-in-text') }}\n <span class=\"username\">{{ existingUsername }}</span>\n </p>\n <Button class=\"login-button\" :click=\"stayLoggedIn\">\n {{ $t('login.proceed-to-dashboard') }}\n </Button>\n <Button class=\"login-button\" :click=\"getOut\">{{ $t('login.log-out-button') }}</Button>\n <span class=\"already-logged-in-note\">\n You need to log out, in order to proceed as a different user.\n </span>\n <transition name=\"bounce\">\n <p :class=\"`login-error-message ${status}`\" v-show=\"message\">{{ message }}</p>\n </transition>\n </div>\n <!-- Main login form -->\n <form class=\"login-form\" v-if=\"(!isUserAlreadyLoggedIn) && isAuthenticationEnabled\">\n <h2 class=\"login-title\">{{ $t('login.title') }}</h2>\n <Input\n v-model=\"username\"\n type=\"text\"\n :label=\"$t('login.username-label')\"\n class=\"login-field username\"\n />\n <Input\n v-model=\"password\"\n type=\"password\"\n :label=\"$t('login.password-label')\"\n class=\"login-field password\"\n />\n <label>{{ $t('login.remember-me-label') }}</label>\n <v-select\n v-model=\"timeout\"\n :selectOnTab=\"true\"\n :options=\"dropDownMenu\"\n class=\"login-time-dropdown\"\n />\n <Button class=\"login-button\" :click=\"submitLogin\">\n {{ $t('login.login-button') }}\n </Button>\n <transition name=\"bounce\">\n <p :class=\"`login-error-message ${status}`\" v-show=\"message\">{{ message }}</p>\n </transition>\n </form>\n <!-- Guest login form -->\n <form class=\"guest-form\"\n v-if=\"isGuestAccessEnabled && !isUserAlreadyLoggedIn && isAuthenticationEnabled\">\n <h2 class=\"login-title\">Guest Access</h2>\n <Button class=\"login-button\" :click=\"guestLogin\">\n {{ $t('login.proceed-guest-button') }}\n </Button>\n <p class=\"guest-intro\">\n This instance has guest access enabled.<br>\n Guests have view-only access to dashboards,\n so cannot write any changes to disk.\n </p>\n </form>\n <!-- Edge case - guest mode enabled, but no users configured -->\n <div class=\"not-configured\" v-if=\"!isAuthenticationEnabled\">\n <h2>Error</h2>\n <p>Authentication is not enabled, or no users have been configured</p>\n <Button class=\"login-button\" :click=\"guestLogin\">\n Go Home\n </Button>\n </div>\n </div>\n</template>\n\n<script>\nimport router from '@/router';\nimport Button from '@/components/FormElements/Button';\nimport Input from '@/components/FormElements/Input';\nimport Defaults, { localStorageKeys } from '@/utils/defaults';\nimport { InfoHandler, WarningInfoHandler, InfoKeys } from '@/utils/ErrorHandler';\nimport {\n checkCredentials,\n login,\n isLoggedIn,\n logout,\n isGuestAccessEnabled,\n} from '@/utils/Auth';\n\nexport default {\n name: 'login',\n components: {\n Button,\n Input,\n },\n data() {\n return {\n username: '',\n password: '',\n message: '',\n status: 'waiting', // wating, error, success\n timeout: undefined,\n };\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n /* Data for timeout dropdown menu, translated label + value in ms */\n dropDownMenu() {\n return [\n { label: this.$t('login.remember-me-never'), time: 0 },\n { label: this.$t('login.remember-me-hour'), time: 14400 * 1000 },\n { label: this.$t('login.remember-me-day'), time: 86400 * 1000 },\n { label: this.$t('login.remember-me-week'), time: 604800 * 1000 },\n ];\n },\n /* Translations for login response messages */\n responseMessages() {\n return {\n missingUsername: this.$t('login.error-missing-username'),\n missingPassword: this.$t('login.error-missing-password'),\n incorrectUsername: this.$t('login.error-incorrect-username'),\n incorrectPassword: this.$t('login.error-incorrect-password'),\n successMsg: this.$t('login.success-message'),\n };\n },\n existingUsername() {\n return localStorage[localStorageKeys.USERNAME];\n },\n users() {\n const auth = this.appConfig.auth || {};\n return Array.isArray(auth) ? auth : auth.users || [];\n },\n isUserAlreadyLoggedIn() {\n const loggedIn = (!this.users || this.users.length === 0 || isLoggedIn());\n return (loggedIn && this.existingUsername);\n },\n isGuestAccessEnabled() {\n return isGuestAccessEnabled();\n },\n isAuthenticationEnabled() {\n return (this.appConfig && this.appConfig.auth && this.users.length > 0);\n },\n },\n methods: {\n /* Checks form is filled in, then initiates the login, and redirects to /home */\n submitLogin() {\n // Use selected timeout, if available,else revedrt to zero\n const timeout = this.timeout ? this.timeout.time : 0;\n // Check users credentials\n const response = checkCredentials(\n this.username,\n this.password,\n this.users, // All users\n this.responseMessages, // Translated response messages\n );\n this.message = response.msg; // Show error or success message to the user\n this.status = response.correct ? 'success' : 'error';\n if (response.correct) { // Yay, credentials were correct :)\n login(this.username, this.password, timeout); // Login, to set the cookie\n this.goHome();\n InfoHandler(`Succesfully signed in as ${this.username}`, InfoKeys.AUTH);\n } else {\n WarningInfoHandler('Unable to Sign In', InfoKeys.AUTH, this.message);\n }\n },\n /* Calls function to double-check guest access enabled, then log in as guest */\n guestLogin() {\n const isAllowed = this.isGuestAccessEnabled;\n if (isAllowed) {\n this.$toasted.show('Logged in as Guest, Redirecting...', { className: 'toast-success' });\n InfoHandler('Logged in as Guest', InfoKeys.AUTH);\n this.goHome();\n } else {\n this.$toasted.show('Guest Access Not Allowed', { className: 'toast-error' });\n WarningInfoHandler('Guest Access Not Allowed', InfoKeys.AUTH);\n }\n },\n /* Calls logout, shows status message, and refreshed page */\n getOut() {\n logout();\n this.status = 'success';\n this.message = 'Logging out...';\n this.refreshPage();\n },\n /* Logged in user redirects to home page */\n stayLoggedIn() {\n this.status = 'success';\n this.message = 'Redirecting...';\n this.goHome();\n },\n /* Refreshes the page */\n refreshPage() {\n setTimeout(() => { location.reload(); }, 250); // eslint-disable-line no-restricted-globals\n },\n /* Redirects to the homepage */\n goHome() {\n setTimeout(() => { // Wait a short while, then redirect back home\n router.push({ path: '/' });\n }, 250);\n },\n /* Since Theme setter isn't loaded at this point, we must manually get and apply users theme */\n setTheme() {\n const theme = localStorage[localStorageKeys.THEME] || Defaults.theme;\n document.getElementsByTagName('html')[0].setAttribute('data-theme', theme);\n },\n },\n created() {\n this.setTheme();\n setTimeout(() => { this.timeout = this.dropDownMenu[0]; }, 1); //eslint-disable-line\n },\n};\n\n</script>\n\n<style lang=\"scss\">\n\n/* Login page base styles */\n.login-page {\n display: flex;\n align-items: center;\n justify-content: center;\n justify-content: space-evenly;\n min-height: calc(100vh - var(--footer-height));\n\n /* User is already logged in note */\n div.already-logged-in {\n margin: 0 auto 0.5rem;\n p.already-logged-in {\n margin: 0 auto 0.5rem;\n text-align: center;\n }\n span.username {\n font-weight: bold;\n text-transform: capitalize;\n }\n span.already-logged-in-note {\n font-size: 0.8rem;\n opacity: var(--dimming-factor);\n text-align: left;\n }\n }\n\n /* Login form container */\n form.login-form, form.guest-form, div.already-logged-in, div.not-configured {\n background: var(--login-form-background);\n color: var(--login-form-color);\n border: 1px solid var(--login-form-color);\n border-radius: var(--curve-factor);\n font-size: 1.4rem;\n padding: 2rem;\n margin: 2rem;\n max-width: 22rem;\n display: flex;\n flex-direction: column;\n\n /* Login form title */\n h2 {\n font-size: 2rem;\n margin: 0 0 1rem 0;\n text-align: center;\n cursor: default;\n }\n\n /* Set sizings for input fields and login button */\n .login-field input, Button.login-button {\n width: 20rem;\n margin: 0.5rem auto;\n font-size: 1.4rem;\n padding: 0.5rem 1rem;\n }\n\n /* Custom colors for username/ password input fields */\n .login-field input {\n color: var(--login-form-color);\n border-color: var(--login-form-color);\n background: var(--login-form-background);\n }\n /* Custom colors for Login Button */\n Button.login-button {\n background: var(--login-form-color);\n border-color: var(--login-form-background);\n color: var(--login-form-background);\n &:hover {\n color: var(--login-form-color);\n border-color: var(--login-form-color);\n background: var(--login-form-background);\n }\n &:active, &:focus {\n box-shadow: 1px 1px 6px var(--login-form-color);\n }\n }\n /* Apply color to status message, depending on status */\n p.login-error-message {\n font-size: 1rem;\n text-align: center;\n &.waiting { color: var(--login-form-color); }\n &.success { color: var(--success); }\n &.error { color: var(--warning); }\n }\n p.guest-intro {\n font-size: 0.8rem;\n opacity: var(--dimming-factor);\n text-align: left;\n }\n }\n}\n\n/* Enter animations for error/ success message */\n.bounce-enter-active { animation: bounce-in 0.25s; }\n.bounce-leave-active { animation: bounce-in 0.25s reverse; }\n@keyframes bounce-in {\n 0% { transform: scale(0); }\n 50% { transform: scale(1.25); }\n 100% { transform: scale(1); }\n}\n\n/* Custom styles for dropdown component */\n.v-select.login-time-dropdown {\n margin: 0.5rem 0;\n .vs__dropdown-toggle {\n border-color: var(--login-form-color);\n background: var(--login-form-background);\n cursor: pointer;\n span.vs__selected {\n color: var(--login-form-color);\n }\n .vs__actions svg path { fill: var(--login-form-color); }\n }\n ul.vs__dropdown-menu {\n background: var(--login-form-background);\n border-color: var(--login-form-color);\n li {\n color: var(--login-form-color);\n &:hover {\n color: var(--login-form-background);\n background: var(--login-form-color);\n }\n &.vs__dropdown-option--highlight {\n color: var(--login-form-background) !important;\n background: var(--login-form-color);\n }\n }\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Login.vue?vue&type=template&id=3c1c7fcd&\"\nimport script from \"./Login.vue?vue&type=script&lang=js&\"\nexport * from \"./Login.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Login.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"work-space\"},[_c('SideBar',{attrs:{\"sections\":_vm.sections,\"initUrl\":_vm.getInitialUrl()},on:{\"launch-app\":_vm.launchApp}}),(!_vm.isMultiTaskingEnabled)?_c('WebContent',{attrs:{\"url\":_vm.url}}):_c('MultiTaskingWebComtent',{attrs:{\"url\":_vm.url}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('nav',{staticClass:\"side-bar\"},[_vm._l((_vm.sections),function(section,index){return _c('div',{key:index,staticClass:\"side-bar-section\"},[_c('div',{staticClass:\"side-bar-item-container\",on:{\"click\":function($event){return _vm.openSection(index)}}},[_c('SideBarItem',{staticClass:\"item\",attrs:{\"icon\":section.icon,\"title\":section.name}})],1),_c('transition',{attrs:{\"name\":\"slide\"}},[(_vm.isOpen[index])?_c('SideBarSection',{attrs:{\"items\":section.items},on:{\"launch-app\":_vm.launchApp}}):_vm._e()],1)],1)}),_c('div',{staticClass:\"switch-view-buttons\"},[_c('router-link',{attrs:{\"to\":\"/home\"}},[_c('IconHome',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.$t('alternate-views.default')),expression:\"$t('alternate-views.default')\"}],staticClass:\"view-icon\"})],1),_c('router-link',{attrs:{\"to\":\"/minimal\"}},[_c('IconMinimalView',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.$t('alternate-views.minimal')),expression:\"$t('alternate-views.minimal')\"}],staticClass:\"view-icon\"})],1)],1)],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.tooltip),expression:\"tooltip\"}],class:(\"side-bar-item \" + (_vm.icon ? 'w-icon' : 'text-only')),on:{\"click\":function($event){return _vm.itemClicked()}}},[(_vm.icon)?_c('Icon',{attrs:{\"icon\":_vm.icon,\"size\":\"small\",\"url\":_vm.url}}):_c('p',{staticClass:\"small-title\"},[_vm._v(_vm._s(_vm.title))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div @click=\"itemClicked()\"\n :class=\"`side-bar-item ${icon ? 'w-icon' : 'text-only'}`\" v-tooltip=\"tooltip\">\n <Icon v-if=\"icon\" :icon=\"icon\" size=\"small\" :url=\"url\" />\n <p class=\"small-title\" v-else>{{ title }}</p>\n </div>\n</template>\n\n<script>\n\nimport Icon from '@/components/LinkItems/ItemIcon.vue';\n\nexport default {\n name: 'SideBarItem',\n props: {\n icon: String,\n title: String,\n url: String,\n target: String,\n click: Function,\n },\n components: {\n Icon,\n },\n methods: {\n itemClicked() {\n if (this.url) this.$emit('launch-app', { url: this.url, target: this.target });\n },\n },\n data() {\n return {\n tooltip: {\n disabled: !this.title,\n content: this.title,\n trigger: 'hover focus',\n placement: 'bottom-end',\n },\n };\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\ndiv.side-bar-item {\n color: var(--side-bar-item-color);\n background: var(--side-bar-item-background);\n text-align: center;\n &.text-only {\n background: none;\n border: none;\n box-shadow: none;\n p.small-title {\n margin: 0.1rem 0 0 -0.5rem;\n font-size: 0.6rem;\n transform: rotate(-25deg);\n padding: 0.5rem 0;\n }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideBarItem.vue?vue&type=template&id=df79d1ee&scoped=true&\"\nimport script from \"./SideBarItem.vue?vue&type=script&lang=js&\"\nexport * from \"./SideBarItem.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideBarItem.vue?vue&type=style&index=0&id=df79d1ee&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"df79d1ee\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"sub-side-bar\"},_vm._l((_vm.items),function(item,index){return _c('div',{key:index},[_c('SideBarItem',{staticClass:\"item\",attrs:{\"icon\":item.icon,\"title\":item.title,\"url\":item.url,\"target\":item.target},on:{\"launch-app\":_vm.launchApp}})],1)}),0)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"sub-side-bar\">\n <div v-for=\"(item, index) in items\" :key=\"index\">\n <SideBarItem\n class=\"item\"\n :icon=\"item.icon\"\n :title=\"item.title\"\n :url=\"item.url\"\n :target=\"item.target\"\n @launch-app=\"launchApp\"\n />\n </div>\n </div>\n</template>\n\n<script>\n\nimport SideBarItem from '@/components/Workspace/SideBarItem.vue';\n\nexport default {\n name: 'SideBarSection',\n props: {\n items: Array,\n },\n components: {\n SideBarItem,\n },\n methods: {\n launchApp(options) {\n this.$emit('launch-app', options);\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\ndiv.sub-side-bar {\n display: flex;\n flex-direction: column;\n background: var(--side-bar-background-lighter);\n border-radius: var(--curve-factor);\n margin: 0.2rem;\n color: var(--side-bar-color);\n text-align: center;\n z-index: 3;\n .item:not(:last-child) {\n border-bottom: 1px dashed var(--side-bar-color);\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideBarSection.vue?vue&type=template&id=26fe765a&scoped=true&\"\nimport script from \"./SideBarSection.vue?vue&type=script&lang=js&\"\nexport * from \"./SideBarSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideBarSection.vue?vue&type=style&index=0&id=26fe765a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"26fe765a\",\n null\n \n)\n\nexport default component.exports","<template>\n <nav class=\"side-bar\">\n <div v-for=\"(section, index) in sections\" :key=\"index\" class=\"side-bar-section\">\n <div @click=\"openSection(index)\" class=\"side-bar-item-container\">\n <SideBarItem\n class=\"item\"\n :icon=\"section.icon\"\n :title=\"section.name\"\n />\n </div>\n <transition name=\"slide\">\n <SideBarSection\n v-if=\"isOpen[index]\"\n :items=\"section.items\"\n @launch-app=\"launchApp\"\n />\n </transition>\n </div>\n <div class=\"switch-view-buttons\">\n <router-link to=\"/home\">\n <IconHome class=\"view-icon\" v-tooltip=\"$t('alternate-views.default')\" />\n </router-link>\n <router-link to=\"/minimal\">\n <IconMinimalView class=\"view-icon\" v-tooltip=\"$t('alternate-views.minimal')\" />\n </router-link>\n </div>\n </nav>\n</template>\n\n<script>\n\nimport SideBarItem from '@/components/Workspace/SideBarItem.vue';\nimport SideBarSection from '@/components/Workspace/SideBarSection.vue';\nimport IconHome from '@/assets/interface-icons/application-home.svg';\nimport IconMinimalView from '@/assets/interface-icons/application-minimal.svg';\n\nexport default {\n name: 'SideBar',\n props: {\n sections: Array,\n initUrl: String,\n },\n data() {\n return {\n isOpen: new Array(this.sections.length).fill(false),\n };\n },\n components: {\n SideBarItem,\n SideBarSection,\n IconMinimalView,\n IconHome,\n },\n methods: {\n /* Toggles the section clicked, and closes all other sections */\n openSection(index) {\n this.isOpen = this.isOpen.map((val, ind) => (ind !== index ? false : !val));\n },\n /* When item clicked, emit a launch event */\n launchApp(options) {\n this.$emit('launch-app', options);\n },\n /* If an initial URL is specified, then open relevant section */\n openDefaultSection() {\n if (!this.initUrl) return;\n const process = (url) => url.replace(/[^\\w\\s]/gi, '').toLowerCase();\n const compare = (item) => (process(item.url) === process(this.initUrl));\n this.sections.forEach((section, sectionIndex) => {\n if (section.items.findIndex(compare) !== -1) this.openSection(sectionIndex);\n });\n },\n },\n mounted() {\n if (this.sections.length === 1) { // If only 1 section, go ahead and open it\n this.openSection(0);\n } else { // Otherwise, see if user set a default section, and open that\n this.openDefaultSection();\n }\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\nnav.side-bar {\n position: fixed;\n display: flex;\n flex-direction: column;\n background: var(--side-bar-background);\n color: var(--side-bar-color);\n height: 100%;\n width: var(--side-bar-width);\n text-align: center;\n overflow: auto;\n @extend .scroll-bar;\n .side-bar-item-container {\n z-index: 5;\n }\n .item:not(:last-child) {\n border-bottom: 1px dashed var(--side-bar-color);\n z-index: 5;\n }\n}\n\n.slide-leave-active,\n.slide-enter-active {\n transition: all 0.1s ease-in-out;\n}\n.slide-enter {\n transform: translate(0, -80%);\n}\n.slide-leave-to {\n transform: translate(0, -80%);\n}\n\n.switch-view-buttons {\n margin-top: 0.5rem;\n display: flex;\n @extend .svg-button;\n .view-icon {\n border: none;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./SideBar.vue?vue&type=template&id=5a56ca84&scoped=true&\"\nimport script from \"./SideBar.vue?vue&type=script&lang=js&\"\nexport * from \"./SideBar.vue?vue&type=script&lang=js&\"\nimport style0 from \"./SideBar.vue?vue&type=style&index=0&id=5a56ca84&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5a56ca84\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"web-content\",attrs:{\"id\":_vm.id}},[_c('iframe',{attrs:{\"src\":_vm.url}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"web-content\" :id=\"id\">\n <iframe :src=\"url\" />\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'WebContent',\n props: {\n url: String,\n id: {\n type: String,\n default: 'web-app-view',\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\niframe {\n position: absolute;\n left: var(--side-bar-width);\n height: calc(100% - var(--header-height));\n width: calc(100% - var(--side-bar-width));\n border: none;\n background: white;\n}\n\n.web-content.hide {\n display: none;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebContent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./WebContent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./WebContent.vue?vue&type=template&id=f1f96a0a&scoped=true&\"\nimport script from \"./WebContent.vue?vue&type=script&lang=js&\"\nexport * from \"./WebContent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./WebContent.vue?vue&type=style&index=0&id=f1f96a0a&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"f1f96a0a\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"container\",staticClass:\"multi-taking-view\"})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"multi-taking-view\" ref=\"container\"></div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport WebContent from '@/components/Workspace/WebContent';\n\nexport default {\n name: 'WebContent',\n props: {\n url: String, // The URL of currently visible app\n },\n data: () => ({\n openApps: [], // List of all currently open apps\n }),\n watch: {\n /* Update the currently open app, when URL changes */\n url() { this.launchApp(); },\n },\n methods: {\n /* Check if app already open or not, and call appropriate opener */\n launchApp() {\n if (this.openApps.includes(this.url)) {\n this.openExistingApp();\n } else {\n this.openApps.push(this.url);\n this.appendNewApp();\n }\n },\n /* Opens a new app */\n appendNewApp() {\n const ComponentClass = Vue.extend(WebContent);\n const instance = new ComponentClass({\n propsData: { url: this.url, id: btoa(this.url) },\n });\n instance.$mount(); // pass nothing\n this.$refs.container.appendChild(instance.$el);\n },\n /* Switches visibility to an already open app */\n openExistingApp() {\n Array.from(document.getElementsByClassName('web-content')).forEach((frame) => {\n frame.classList.add('hide');\n });\n document.getElementById(btoa(this.url)).classList.remove('hide');\n },\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\niframe {\n position: absolute;\n left: var(--side-bar-width);\n height: calc(100% - var(--header-height));\n width: calc(100% - var(--side-bar-width));\n border: none;\n background: white;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MultiTaskingWebComtent.vue?vue&type=template&id=2a7b9297&scoped=true&\"\nimport script from \"./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"\nexport * from \"./MultiTaskingWebComtent.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MultiTaskingWebComtent.vue?vue&type=style&index=0&id=2a7b9297&lang=scss&scoped=true&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"2a7b9297\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"work-space\">\n <SideBar :sections=\"sections\" @launch-app=\"launchApp\" :initUrl=\"getInitialUrl()\" />\n <WebContent :url=\"url\" v-if=\"!isMultiTaskingEnabled\" />\n <MultiTaskingWebComtent :url=\"url\" v-else />\n </div>\n</template>\n\n<script>\n\nimport SideBar from '@/components/Workspace/SideBar';\nimport WebContent from '@/components/Workspace/WebContent';\nimport MultiTaskingWebComtent from '@/components/Workspace/MultiTaskingWebComtent';\nimport Defaults from '@/utils/defaults';\nimport { GetTheme, ApplyLocalTheme, ApplyCustomVariables } from '@/utils/ThemeHelper';\n\nexport default {\n name: 'Workspace',\n data: () => ({\n url: '',\n GetTheme,\n ApplyLocalTheme,\n ApplyCustomVariables,\n }),\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n isMultiTaskingEnabled() {\n return this.appConfig.enableMultiTasking || false;\n },\n },\n components: {\n SideBar,\n WebContent,\n MultiTaskingWebComtent,\n },\n methods: {\n launchApp(options) {\n if (options.target === 'newtab') {\n window.open(options.url, '_blank');\n } else {\n this.url = options.url;\n }\n },\n setTheme() {\n const theme = this.GetTheme();\n this.ApplyLocalTheme(theme);\n this.ApplyCustomVariables(theme);\n },\n initiateFontAwesome() {\n const fontAwesomeScript = document.createElement('script');\n const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;\n fontAwesomeScript.setAttribute('src', `https://kit.fontawesome.com/${faKey}.js`);\n document.head.appendChild(fontAwesomeScript);\n },\n /* Returns a service URL, if set as a URL param, or if user has specified landing URL */\n getInitialUrl() {\n const route = this.$route;\n if (route.query && route.query.url) {\n return decodeURI(route.query.url);\n } else if (this.appConfig.workspaceLandingUrl) {\n return this.appConfig.workspaceLandingUrl;\n }\n return undefined;\n },\n },\n mounted() {\n this.setTheme();\n this.initiateFontAwesome();\n this.url = this.getInitialUrl();\n },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\n.work-space {\n min-height: calc(100vh - var(--footer-height));\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Workspace.vue?vue&type=template&id=188fee4a&scoped=true&\"\nimport script from \"./Workspace.vue?vue&type=script&lang=js&\"\nexport * from \"./Workspace.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Workspace.vue?vue&type=style&index=0&id=188fee4a&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"188fee4a\",\n null\n \n)\n\nexport default component.exports","var render = function () {\nvar this$1 = this;\nvar _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"minimal-home\",style:(_vm.getBackgroundImage() + _vm.setColumnCount())},[_c('div',{staticClass:\"minimal-buttons\"},[_c('ConfigLauncher',{staticClass:\"config-launcher\",on:{\"modalChanged\":_vm.modalChanged}})],1),_c('div',{staticClass:\"title-and-search\"},[_c('router-link',{attrs:{\"to\":\"/\"}},[_c('h1',[_vm._v(_vm._s(_vm.pageInfo.title))])]),_c('MinimalSearch',{ref:\"filterComp\",attrs:{\"active\":!_vm.modalOpen},on:{\"user-is-searchin\":function (s) { this$1.searchValue = s; }}})],1),(_vm.checkTheresData(_vm.sections))?_c('div',{class:(\"item-group-container \" + (!_vm.tabbedView ? 'showing-all' : ''))},[_vm._l((_vm.getSections(_vm.sections)),function(section,index){return _c('MinimalHeading',{key:(\"heading-\" + index),staticClass:\"headings\",attrs:{\"index\":index,\"title\":section.name,\"selected\":_vm.selectedSection === index},on:{\"sectionSelected\":_vm.sectionSelected}})}),_vm._l((_vm.getSections(_vm.sections)),function(section,index){return _c('MinimalSection',{key:(\"body-\" + index),attrs:{\"index\":index,\"title\":section.name,\"icon\":section.icon || undefined,\"groupId\":(\"section-\" + index),\"items\":_vm.filterTiles(section.items),\"selected\":_vm.selectedSection === index,\"showAll\":!_vm.tabbedView,\"itemSize\":\"small\"},on:{\"sectionSelected\":_vm.sectionSelected,\"itemClicked\":function($event){return _vm.finishedSearching()},\"change-modal-visibility\":_vm.updateModalVisibility}})}),(_vm.checkIfResults())?_c('div',{staticClass:\"no-data\"},[_vm._v(\" \"+_vm._s(_vm.searchValue ? _vm.$t('home.no-results') : _vm.$t('home.no-data'))+\" \")]):_vm._e()],2):_c('div',{staticClass:\"no-data\"},[_vm._v(\" \"+_vm._s(_vm.$t('home.no-data'))+\" \")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"minimal-section-inner \" + (_vm.selected ? 'selected' : '') + \" \" + (_vm.showAll ? 'show-all': ''))},[(_vm.selected || _vm.showAll)?_c('div',{staticClass:\"section-items\"},_vm._l((_vm.items),function(item,index){return _c('Item',{key:(index + \"_\" + (_vm.makeId(item.title))),attrs:{\"id\":(index + \"_\" + (_vm.makeId(item.title))),\"url\":item.url,\"title\":item.title,\"description\":item.description,\"icon\":item.icon,\"target\":item.target,\"color\":item.color,\"backgroundColor\":item.backgroundColor,\"statusCheckUrl\":item.statusCheckUrl,\"statusCheckHeaders\":item.statusCheckHeaders,\"itemSize\":_vm.itemSize,\"hotkey\":item.hotkey,\"enableStatusCheck\":_vm.shouldEnableStatusCheck(item.statusCheck),\"statusCheckInterval\":_vm.getStatusCheckInterval()},on:{\"itemClicked\":function($event){return _vm.$emit('itemClicked')},\"triggerModal\":_vm.triggerModal}})}),1):_vm._e(),_c('IframeModal',{ref:(\"iframeModal-\" + _vm.groupId),attrs:{\"name\":(\"iframeModal-\" + _vm.groupId)},on:{\"closed\":function($event){return _vm.$emit('itemClicked')}}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`minimal-section-inner ${selected ? 'selected' : ''} ${showAll ? 'show-all': ''}`\">\n <div class=\"section-items\" v-if=\"selected || showAll\">\n <Item\n v-for=\"(item, index) in items\"\n :id=\"`${index}_${makeId(item.title)}`\"\n :key=\"`${index}_${makeId(item.title)}`\"\n :url=\"item.url\"\n :title=\"item.title\"\n :description=\"item.description\"\n :icon=\"item.icon\"\n :target=\"item.target\"\n :color=\"item.color\"\n :backgroundColor=\"item.backgroundColor\"\n :statusCheckUrl=\"item.statusCheckUrl\"\n :statusCheckHeaders=\"item.statusCheckHeaders\"\n :itemSize=\"itemSize\"\n :hotkey=\"item.hotkey\"\n :enableStatusCheck=\"shouldEnableStatusCheck(item.statusCheck)\"\n :statusCheckInterval=\"getStatusCheckInterval()\"\n @itemClicked=\"$emit('itemClicked')\"\n @triggerModal=\"triggerModal\"\n />\n </div>\n <IframeModal\n :ref=\"`iframeModal-${groupId}`\"\n :name=\"`iframeModal-${groupId}`\"\n @closed=\"$emit('itemClicked')\"\n />\n </div>\n</template>\n\n<script>\nimport Item from '@/components/LinkItems/Item.vue';\nimport IframeModal from '@/components/LinkItems/IframeModal.vue';\n\nexport default {\n name: 'ItemGroup',\n props: {\n groupId: String,\n title: String,\n icon: String,\n displayData: Object,\n items: Array,\n itemSize: String,\n modalOpen: Boolean,\n index: Number,\n selected: Boolean,\n showAll: Boolean,\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n },\n components: {\n Item,\n IframeModal,\n },\n methods: {\n selectSection(index) {\n this.$emit('sectionSelected', index);\n },\n /* Returns a unique lowercase string, based on name, for section ID */\n makeId(str) {\n return str.replace(/\\s+/g, '-').replace(/[^a-zA-Z ]/g, '').toLowerCase();\n },\n /* Opens the iframe modal */\n triggerModal(url) {\n this.$refs[`iframeModal-${this.groupId}`].show(url);\n },\n shouldEnableStatusCheck(itemPreference) {\n const globalPreference = this.appConfig.statusCheck || false;\n return itemPreference !== undefined ? itemPreference : globalPreference;\n },\n getStatusCheckInterval() {\n let interval = this.appConfig.statusCheckInterval;\n if (!interval) return 0;\n if (interval > 60) interval = 60;\n if (interval < 1) interval = 0;\n return interval;\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.minimal-section-inner {\n height: 100%;\n display: flex;\n flex-wrap: wrap;\n flex-direction: column;\n background: var(--minimal-view-group-background);\n border-radius: 0 0 var(--curve-factor) var(--curve-factor);\n .section-items {\n display: grid;\n @include phone { --minimal-col-count: 1; }\n @include tablet { --minimal-col-count: 2; }\n @include laptop { --minimal-col-count: 3; }\n @include monitor { --minimal-col-count: 4; }\n @include big-screen { --minimal-col-count: 5; }\n @include big-screen-up { --minimal-col-count: 6; }\n grid-template-columns: repeat(var(--minimal-col-count, 1), minmax(0, 1fr));\n }\n &.selected {\n border: 1px solid var(--minimal-view-group-color);\n grid-column-start: span var(--col-count, 3);\n }\n &.show-all {\n border: none;\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSection.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSection.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MinimalSection.vue?vue&type=template&id=59c3b7ad&scoped=true&\"\nimport script from \"./MinimalSection.vue?vue&type=script&lang=js&\"\nexport * from \"./MinimalSection.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MinimalSection.vue?vue&type=style&index=0&id=59c3b7ad&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"59c3b7ad\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:(\"minimal-section-heading \" + (_vm.selected ? 'selected' : '')),on:{\"click\":function($event){return _vm.selectSection(_vm.index)}}},[_c('h3',[_vm._v(_vm._s(_vm.title))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div\n @click=\"selectSection(index)\"\n :class=\"`minimal-section-heading ${selected ? 'selected' : ''}`\">\n <h3>{{ title }}</h3>\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'MinimalHeadings',\n props: {\n index: Number,\n title: String,\n selected: Boolean,\n },\n methods: {\n selectSection(index) {\n this.$emit('sectionSelected', index);\n },\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\ndiv.minimal-section-heading {\n cursor: pointer;\n padding: 0.5rem 0.25rem;\n margin-bottom: 0;\n background: var(--minimal-view-section-heading-background);\n border: 1px solid var(--minimal-view-section-heading-color);\n border-bottom: none;\n border-radius: var(--curve-factor) var(--curve-factor) 0 0;\n h3 {\n margin: 0;\n color: var(--minimal-view-section-heading-color);\n }\n &.selected {\n background: var(--minimal-view-section-heading-color);\n h3 {\n color: var(--minimal-view-section-heading-background);\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalHeading.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalHeading.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MinimalHeading.vue?vue&type=template&id=5f187f16&scoped=true&\"\nimport script from \"./MinimalHeading.vue?vue&type=script&lang=js&\"\nexport * from \"./MinimalHeading.vue?vue&type=script&lang=js&\"\nimport style0 from \"./MinimalHeading.vue?vue&type=style&index=0&id=5f187f16&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"5f187f16\",\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('SearchBar',{ref:\"MinimalSearchBar\",attrs:{\"active\":true,\"minimalSearch\":true},on:{\"user-is-searchin\":_vm.userIsTypingSomething}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <SearchBar\n ref=\"MinimalSearchBar\"\n @user-is-searchin=\"userIsTypingSomething\"\n :active=\"true\"\n :minimalSearch=\"true\"\n />\n</template>\n\n<script>\nimport SearchBar from '@/components/Settings/SearchBar';\n\nexport default {\n name: 'MinimalSearch',\n components: {\n SearchBar,\n },\n props: {\n active: Boolean,\n },\n data() {\n return {\n input: '', // Users current search term\n };\n },\n computed: {\n appConfig() {\n return this.$store.getters.appConfig;\n },\n webSearchEnabled() {\n if (this.appConfig && this.appConfig.webSearch) {\n return !this.appConfig.webSearch.disableWebSearch;\n }\n return true;\n },\n },\n methods: {\n /* Emmits users's search term up to parent */\n userIsTypingSomething(searchValue) {\n this.input = searchValue;\n this.$emit('user-is-searchin', searchValue);\n },\n },\n mounted() {\n window.addEventListener('keydown', this.startFiltering);\n },\n beforeDestroy() {\n window.removeEventListener('keydown', this.startFiltering);\n },\n};\n</script>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSearch.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSearch.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MinimalSearch.vue?vue&type=template&id=6ad901f4&\"\nimport script from \"./MinimalSearch.vue?vue&type=script&lang=js&\"\nexport * from \"./MinimalSearch.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"minimal-home\" :style=\"getBackgroundImage() + setColumnCount()\">\n <!-- Buttons for config and home page -->\n <div class=\"minimal-buttons\">\n <ConfigLauncher @modalChanged=\"modalChanged\" class=\"config-launcher\" />\n </div>\n <!-- Page title and search bar -->\n <div class=\"title-and-search\">\n <router-link to=\"/\">\n <h1>{{ pageInfo.title }}</h1>\n </router-link>\n <MinimalSearch\n @user-is-searchin=\"(s) => { this.searchValue = s; }\"\n :active=\"!modalOpen\" ref=\"filterComp\" />\n </div>\n <div v-if=\"checkTheresData(sections)\"\n :class=\"`item-group-container ${!tabbedView ? 'showing-all' : ''}`\">\n <!-- Section heading buttons -->\n <MinimalHeading\n v-for=\"(section, index) in getSections(sections)\"\n :key=\"`heading-${index}`\"\n :index=\"index\"\n :title=\"section.name\"\n :selected=\"selectedSection === index\"\n @sectionSelected=\"sectionSelected\"\n class=\"headings\"\n />\n <!-- Section item groups -->\n <MinimalSection\n v-for=\"(section, index) in getSections(sections)\"\n :key=\"`body-${index}`\"\n :index=\"index\"\n :title=\"section.name\"\n :icon=\"section.icon || undefined\"\n :groupId=\"`section-${index}`\"\n :items=\"filterTiles(section.items)\"\n :selected=\"selectedSection === index\"\n :showAll=\"!tabbedView\"\n itemSize=\"small\"\n @sectionSelected=\"sectionSelected\"\n @itemClicked=\"finishedSearching()\"\n @change-modal-visibility=\"updateModalVisibility\"\n />\n <div v-if=\"checkIfResults()\" class=\"no-data\">\n {{searchValue ? $t('home.no-results') : $t('home.no-data')}}\n </div>\n </div>\n <div v-else class=\"no-data\"> {{ $t('home.no-data') }} </div>\n </div>\n</template>\n\n<script>\n\nimport MinimalSection from '@/components/MinimalView/MinimalSection.vue';\nimport MinimalHeading from '@/components/MinimalView/MinimalHeading.vue';\nimport MinimalSearch from '@/components/MinimalView/MinimalSearch.vue';\nimport { GetTheme, ApplyLocalTheme, ApplyCustomVariables } from '@/utils/ThemeHelper';\nimport { searchTiles } from '@/utils/Search';\nimport Defaults, { localStorageKeys } from '@/utils/defaults';\nimport ConfigLauncher from '@/components/Settings/ConfigLauncher';\n\nexport default {\n name: 'home',\n components: {\n MinimalSection,\n MinimalHeading,\n MinimalSearch,\n ConfigLauncher,\n },\n data: () => ({\n searchValue: '',\n layout: '',\n modalOpen: false, // When true, keybindings are disabled\n selectedSection: 0, // The index of currently selected section\n tabbedView: true, // By default use tabs, when searching then show all instead\n theme: GetTheme(),\n }),\n computed: {\n sections() {\n return this.$store.getters.sections;\n },\n appConfig() {\n return this.$store.getters.appConfig;\n },\n pageInfo() {\n return this.$store.getters.pageInfo;\n },\n },\n watch: {\n /* When the theme changes, then call the update method */\n searchValue() {\n this.tabbedView = !this.searchValue || this.searchValue.length === 0;\n },\n },\n methods: {\n sectionSelected(index) {\n this.selectedSection = index;\n },\n /* Returns true if there is one or more sections in the config */\n checkTheresData(sections) {\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n return (sections && sections.length >= 1) || (localSections && localSections.length >= 1);\n },\n /* Returns sections from local storage if available, otherwise uses the conf.yml */\n getSections(sections) {\n // If the user has stored sections in local storage, return those\n const localSections = localStorage[localStorageKeys.CONF_SECTIONS];\n if (localSections) {\n const json = JSON.parse(localSections);\n if (json.length >= 1) return json;\n }\n // Otherwise, return the usuall data from conf.yml\n return sections;\n },\n /* Updates local data with search value, triggered from filter comp */\n searching(searchValue) {\n this.searchValue = searchValue || '';\n },\n /* Clears input field, once a searched item is opened */\n finishedSearching() {\n this.$refs.filterComp.clearMinFilterInput();\n },\n /* Extracts the site name from domain, used for the searching functionality */\n getDomainFromUrl(url) {\n if (!url) return '';\n const urlPattern = /^(?:https?:\\/\\/)?(?:w{3}\\.)?([a-z\\d.-]+)\\.(?:[a-z.]{2,10})(?:[/\\w.-]*)*/;\n const domainPattern = url.match(urlPattern);\n return domainPattern ? domainPattern[1] : '';\n },\n /* Returns only the tiles that match the users search query */\n filterTiles(allTiles) {\n if (!allTiles) return [];\n return searchTiles(allTiles, this.searchValue);\n },\n /* Update data when modal is open (so that key bindings can be disabled) */\n updateModalVisibility(modalState) {\n this.modalOpen = modalState;\n },\n /* Checks if any of the icons are Font Awesome glyphs */\n checkIfFontAwesomeNeeded() {\n let isNeeded = false;\n if (!this.sections) return false;\n this.sections.forEach((section) => {\n if (section.icon && section.icon.includes('fa-')) isNeeded = true;\n section.items.forEach((item) => {\n if (item.icon && item.icon.includes('fa-')) isNeeded = true;\n });\n });\n return isNeeded;\n },\n /* Injects font-awesome's script tag, only if needed */\n initiateFontAwesome() {\n if (this.appConfig.enableFontAwesome || this.checkIfFontAwesomeNeeded()) {\n const fontAwesomeScript = document.createElement('script');\n const faKey = this.appConfig.fontAwesomeKey || Defaults.fontAwesomeKey;\n fontAwesomeScript.setAttribute('src', `https://kit.fontawesome.com/${faKey}.js`);\n document.head.appendChild(fontAwesomeScript);\n }\n },\n /* Returns true if there is more than 1 sub-result visible during searching */\n checkIfResults() {\n if (!this.sections) return false;\n else {\n let itemsFound = true;\n this.sections.forEach((section) => {\n if (this.filterTiles(section.items).length > 0) itemsFound = false;\n });\n return itemsFound;\n }\n },\n /* Make CSS to set the number of columns based on the number of sections */\n setColumnCount() {\n return `--col-count: ${this.sections.length};`;\n },\n /* Make CSS styles to apply the users custom background image */\n getBackgroundImage() {\n if (this.appConfig && this.appConfig.backgroundImg) {\n return `background: url('${this.appConfig.backgroundImg}');background-size:cover;`;\n }\n return '';\n },\n /* If theme present, then call helper to apply it, and any custom colors */\n applyTheme() {\n if (this.theme) {\n ApplyLocalTheme(this.theme);\n ApplyCustomVariables(this.theme);\n }\n },\n modalChanged(modalState) {\n this.modalOpen = modalState;\n },\n },\n mounted() {\n this.initiateFontAwesome();\n this.applyTheme();\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import '@/styles/media-queries.scss';\n@import '@/styles/style-helpers.scss';\n\n.minimal-home {\n display: flex;\n flex-direction: column;\n margin: 1rem auto;\n padding-bottom: 1px;\n padding-top: 10vh;\n min-height: calc(99vh - var(--footer-height));\n width: 90%;\n max-width: 1000px;\n background: var(--minimal-view-background-color);\n}\n\n.title-and-search {\n text-align: center;\n h1 {\n color: var(--minimal-view-title-color);\n margin: 0;\n font-size: 3rem;\n }\n a {\n text-decoration: none;\n }\n}\n\n/* Outside container wrapping the item groups*/\n.item-group-container {\n display: grid;\n gap: 0 0.5rem;\n margin: 3rem auto;\n width: 90%;\n grid-template-columns: repeat(var(--col-count), 1fr);\n @extend .scroll-bar;\n\n &.showing-all {\n flex-direction: column;\n display: flex;\n .headings {\n display: none;\n }\n }\n}\n\n @include phone {\n .item-group-container {\n display: flex;\n flex-direction: column;\n }\n}\n\n.no-data {\n font-size: 2rem;\n color: var(--minimal-view-background-color);\n background: #ffffffeb;\n width: fit-content;\n margin: 2rem auto;\n padding: 0.5rem 1rem;\n border-radius: var(--curve-factor);\n}\n\n.minimal-buttons {\n position: absolute;\n top: 0.5rem;\n right: 1rem;\n display: flex;\n .home-page-icon {\n color: var(--minimal-view-settings-color);\n width: 1.5rem;\n height: 1.5rem;\n @extend .svg-button;\n }\n}\n</style>\n\n<style lang=\"scss\">\n.minimal-home .minimal-buttons {\n .config-launcher span.config-label { display: none; }\n svg { opacity: var(--dimming-factor); border: none; }\n &:hover svg { opacity: 1; }\n .view-switcher {\n margin-top: 2rem;\n right: 0;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Minimal.vue?vue&type=template&id=31e46608&scoped=true&\"\nimport script from \"./Minimal.vue?vue&type=script&lang=js&\"\nexport * from \"./Minimal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Minimal.vue?vue&type=style&index=0&id=31e46608&lang=scss&scoped=true&\"\nimport style1 from \"./Minimal.vue?vue&type=style&index=1&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"31e46608\",\n null\n \n)\n\nexport default component.exports","/**\n * This is the router config, which defined the location for\n * each page within the app, and how they should be loaded\n * Note that the page paths are defined in @/utils/defaults.js\n */\n\n// Import Vue.js and vue router\nimport Vue from 'vue';\nimport Router from 'vue-router';\nimport ProgressBar from 'rsup-progress';\n\n// Import views, that are not lazy-loaded\nimport Home from '@/views/Home.vue';\nimport Login from '@/views/Login.vue';\nimport Workspace from '@/views/Workspace.vue';\nimport Minimal from '@/views/Minimal.vue';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\n\n// Import helper functions, config data and defaults\nimport { isAuthEnabled, isLoggedIn, isGuestAccessEnabled } from '@/utils/Auth';\nimport { metaTagData, startingView, routePaths } from '@/utils/defaults';\nimport ErrorHandler from '@/utils/ErrorHandler';\n\nVue.use(Router);\nconst progress = new ProgressBar({ color: 'var(--progress-bar)' });\n\n/* Returns true if user is already authenticated, or if auth is not enabled */\nconst isAuthenticated = () => {\n const authEnabled = isAuthEnabled();\n const userLoggedIn = isLoggedIn();\n const guestEnabled = isGuestAccessEnabled();\n return (!authEnabled || userLoggedIn || guestEnabled);\n};\n\nconst getConfig = () => {\n const Accumulator = new ConfigAccumulator();\n return {\n appConfig: Accumulator.appConfig(),\n pageInfo: Accumulator.pageInfo(),\n };\n};\n\nconst { appConfig, pageInfo } = getConfig();\n\n/* Get the users chosen starting view from app config, or return default */\nconst getStartingView = () => appConfig.startingView || startingView;\n\n/**\n * Returns the component that should be rendered at the base path,\n * Defaults to Home, but the user can change this to Workspace of Minimal\n */\nconst getStartingComponent = () => {\n const usersPreference = getStartingView();\n switch (usersPreference) {\n case 'default': return Home;\n case 'minimal': return Minimal;\n case 'workspace': return Workspace;\n default: return Home;\n }\n};\n\n/* Returns the meta tags for each route */\nconst makeMetaTags = (defaultTitle) => ({\n title: pageInfo.title || defaultTitle,\n metaTags: metaTagData,\n});\n\n/* Routing mode, can be either 'hash', 'history' or 'abstract' */\nconst mode = appConfig.routingMode || 'history';\n\n/* List of all routes, props, components and metadata */\nconst router = new Router({\n mode,\n routes: [\n { // The default view can be customized by the user\n path: '/',\n name: `landing-page-${getStartingView()}`,\n component: getStartingComponent(),\n meta: makeMetaTags('Home Page'),\n },\n { // Default home page\n path: routePaths.home,\n name: 'home',\n component: Home,\n meta: makeMetaTags('Home Page'),\n },\n { // View only single section\n path: `${routePaths.home}/:section`,\n name: 'home-section',\n component: Home,\n meta: makeMetaTags('Home Page'),\n },\n { // Workspace view page\n path: routePaths.workspace,\n name: 'workspace',\n component: Workspace,\n meta: makeMetaTags('Workspace'),\n },\n { // Minimal view page\n path: routePaths.minimal,\n name: 'minimal',\n component: Minimal,\n meta: makeMetaTags('Start Page'),\n },\n { // The login page\n path: routePaths.login,\n name: 'login',\n component: Login,\n beforeEnter: (to, from, next) => {\n // If the user already logged in + guest mode not enabled, then redirect home\n if (isAuthenticated() && !isGuestAccessEnabled()) router.push({ path: '/' });\n next();\n },\n },\n { // The about app page\n path: routePaths.about,\n name: 'about', // We lazy load the About page so as to not slow down the app\n component: () => import('./views/About.vue'),\n meta: makeMetaTags('About Dashy'),\n },\n { // The export config page\n path: routePaths.download,\n name: 'download',\n component: () => import('./views/DownloadConfig.vue'),\n meta: makeMetaTags('Download Config'),\n },\n { // Page not found, any non-defined routes will land here\n path: routePaths.notFound,\n name: '404',\n component: () => import('./views/404.vue'),\n meta: makeMetaTags('404 Not Found'),\n beforeEnter: (to, from, next) => {\n if (to.redirectedFrom) { // Log error, if redirected here from another route\n ErrorHandler(`Route not found: '${to.redirectedFrom}'`);\n }\n next();\n },\n },\n { // Redirect any not-found routed to the 404 view\n path: '*',\n redirect: '/404',\n },\n ],\n});\n\n/**\n * Before loading a route, check if the user has authentication enabled\n * if so, then ensure that they are correctly logged in as a valid user\n * If not logged in, prevent all access and redirect them to login page\n * */\nrouter.beforeEach((to, from, next) => {\n progress.start();\n if (to.name !== 'login' && !isAuthenticated()) next({ name: 'login' });\n else next();\n});\n\n/* If title is missing, then apply default page title */\nrouter.afterEach((to) => {\n progress.end();\n Vue.nextTick(() => {\n document.title = to.meta.title || 'Dashy';\n });\n});\n\n// All done - export the now configured router\nexport default router;\n","/* eslint-disable no-param-reassign */\nimport Vue from 'vue';\nimport Vuex from 'vuex';\nimport Keys from '@/utils/StoreMutations';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport { componentVisibility } from '@/utils/ConfigHelpers';\nimport { applyItemId } from '@/utils/MiscHelpers';\nimport filterUserSections from '@/utils/CheckSectionVisibility';\nimport { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';\n\nVue.use(Vuex);\n\nconst {\n INITIALIZE_CONFIG,\n SET_CONFIG,\n SET_MODAL_OPEN,\n SET_LANGUAGE,\n SET_ITEM_LAYOUT,\n SET_ITEM_SIZE,\n SET_THEME,\n SET_CUSTOM_COLORS,\n UPDATE_ITEM,\n SET_EDIT_MODE,\n SET_PAGE_INFO,\n SET_APP_CONFIG,\n SET_SECTIONS,\n UPDATE_SECTION,\n INSERT_SECTION,\n REMOVE_SECTION,\n COPY_ITEM,\n REMOVE_ITEM,\n INSERT_ITEM,\n UPDATE_CUSTOM_CSS,\n CONF_MENU_INDEX,\n} = Keys;\n\nconst store = new Vuex.Store({\n state: {\n config: {},\n editMode: false, // While true, the user can drag and edit items + sections\n modalOpen: false, // KB shortcut functionality will be disabled when modal is open\n navigateConfToTab: undefined, // Used to switch active tab in config modal\n },\n getters: {\n config(state) {\n return state.config;\n },\n pageInfo(state) {\n return state.config.pageInfo || {};\n },\n appConfig(state) {\n return state.config.appConfig || {};\n },\n theme(state) {\n return state.config.appConfig.theme;\n },\n sections(state) {\n return filterUserSections(state.config.sections || []);\n },\n webSearch(state, getters) {\n return getters.appConfig.webSearch || {};\n },\n visibleComponents(state, getters) {\n return componentVisibility(getters.appConfig);\n },\n // eslint-disable-next-line arrow-body-style\n getSectionByIndex: (state, getters) => (index) => {\n return getters.sections[index];\n },\n getItemById: (state, getters) => (id) => {\n let item;\n getters.sections.forEach(sec => {\n const foundItem = sec.items.find((itm) => itm.id === id);\n if (foundItem) item = foundItem;\n });\n return item;\n },\n getParentSectionOfItem: (state, getters) => (itemId) => {\n let foundSection;\n getters.sections.forEach((section) => {\n section.items.forEach((item) => {\n if (item.id === itemId) foundSection = section;\n });\n });\n return foundSection;\n },\n layout(state) {\n return state.config.appConfig.layout || 'auto';\n },\n iconSize(state) {\n return state.config.appConfig.iconSize || 'medium';\n },\n },\n mutations: {\n [SET_CONFIG](state, config) {\n state.config = config;\n },\n [SET_LANGUAGE](state, lang) {\n const newConfig = state.config;\n newConfig.appConfig.language = lang;\n state.config = newConfig;\n },\n [SET_MODAL_OPEN](state, modalOpen) {\n state.modalOpen = modalOpen;\n },\n [SET_EDIT_MODE](state, editMode) {\n if (editMode !== state.editMode) {\n InfoHandler(editMode ? 'Edit session started' : 'Edit session ended', InfoKeys.EDITOR);\n state.editMode = editMode;\n }\n },\n [UPDATE_ITEM](state, payload) {\n const { itemId, newItem } = payload;\n const newConfig = { ...state.config };\n newConfig.sections.forEach((section, secIndex) => {\n section.items.forEach((item, itemIndex) => {\n if (item.id === itemId) {\n newConfig.sections[secIndex].items[itemIndex] = newItem;\n InfoHandler('Item updated', InfoKeys.EDITOR);\n }\n });\n });\n state.config = newConfig;\n },\n [SET_PAGE_INFO](state, newPageInfo) {\n const newConfig = state.config;\n newConfig.pageInfo = newPageInfo;\n state.config = newConfig;\n InfoHandler('Page info updated', InfoKeys.EDITOR);\n },\n [SET_APP_CONFIG](state, newAppConfig) {\n const newConfig = state.config;\n newConfig.appConfig = newAppConfig;\n state.config = newConfig;\n InfoHandler('App config updated', InfoKeys.EDITOR);\n },\n [SET_SECTIONS](state, newSections) {\n const newConfig = state.config;\n newConfig.sections = newSections;\n state.config = newConfig;\n InfoHandler('Sections updated', InfoKeys.EDITOR);\n },\n [UPDATE_SECTION](state, payload) {\n const { sectionIndex, sectionData } = payload;\n const newConfig = { ...state.config };\n newConfig.sections[sectionIndex] = sectionData;\n state.config = newConfig;\n InfoHandler('Section updated', InfoKeys.EDITOR);\n },\n [INSERT_SECTION](state, newSection) {\n const newConfig = { ...state.config };\n newSection.items = [];\n newConfig.sections.push(newSection);\n state.config = newConfig;\n InfoHandler('New section added', InfoKeys.EDITOR);\n },\n [REMOVE_SECTION](state, payload) {\n const { sectionIndex, sectionName } = payload;\n const newConfig = { ...state.config };\n if (newConfig.sections[sectionIndex].name === sectionName) {\n newConfig.sections.splice(sectionIndex, 1);\n InfoHandler('Section removed', InfoKeys.EDITOR);\n }\n state.config = newConfig;\n },\n [INSERT_ITEM](state, payload) {\n const { newItem, targetSection } = payload;\n const config = { ...state.config };\n config.sections.forEach((section) => {\n if (section.name === targetSection) {\n section.items.push(newItem);\n InfoHandler('New item added', InfoKeys.EDITOR);\n }\n });\n config.sections = applyItemId(config.sections);\n state.config = config;\n },\n [COPY_ITEM](state, payload) {\n const { item, toSection, appendTo } = payload;\n const config = { ...state.config };\n const newItem = { ...item };\n config.sections.forEach((section) => {\n if (section.name === toSection) {\n if (appendTo === 'beginning') {\n section.items.unshift(newItem);\n } else {\n section.items.push(newItem);\n }\n InfoHandler('Item copied', InfoKeys.EDITOR);\n }\n });\n config.sections = applyItemId(config.sections);\n state.config = config;\n },\n [REMOVE_ITEM](state, payload) {\n const { itemId, sectionName } = payload;\n const config = { ...state.config };\n config.sections.forEach((section) => {\n if (section.name === sectionName) {\n section.items.forEach((item, index) => {\n if (item.id === itemId) {\n section.items.splice(index, 1);\n InfoHandler('Item removed', InfoKeys.EDITOR);\n }\n });\n }\n });\n state.config = config;\n },\n [SET_THEME](state, theme) {\n const newConfig = { ...state.config };\n newConfig.appConfig.theme = theme;\n state.config = newConfig;\n InfoHandler('Theme updated', InfoKeys.VISUAL);\n },\n [SET_CUSTOM_COLORS](state, customColors) {\n const newConfig = { ...state.config };\n newConfig.appConfig.customColors = customColors;\n state.config = newConfig;\n InfoHandler('Color palette updated', InfoKeys.VISUAL);\n },\n [SET_ITEM_LAYOUT](state, layout) {\n state.config.appConfig.layout = layout;\n InfoHandler('Layout updated', InfoKeys.VISUAL);\n },\n [SET_ITEM_SIZE](state, iconSize) {\n state.config.appConfig.iconSize = iconSize;\n InfoHandler('Item size updated', InfoKeys.VISUAL);\n },\n [UPDATE_CUSTOM_CSS](state, customCss) {\n state.config.appConfig.customCss = customCss;\n InfoHandler('Custom colors updated', InfoKeys.VISUAL);\n },\n [CONF_MENU_INDEX](state, index) {\n state.navigateConfToTab = index;\n },\n },\n actions: {\n /* Called when app first loaded. Reads config and sets state */\n [INITIALIZE_CONFIG]({ commit }) {\n const deepCopy = (json) => JSON.parse(JSON.stringify(json));\n const config = deepCopy(new ConfigAccumulator().config());\n commit(SET_CONFIG, config);\n },\n },\n modules: {},\n});\n\nexport default store;\n","import { register } from 'register-service-worker';\nimport { sessionStorageKeys } from '@/utils/defaults';\nimport { statusMsg, statusErrorMsg } from '@/utils/CoolConsole';\nimport conf from '../../public/conf.yml';\n\n/* Sets a local storage item with the state from the SW lifecycle */\nconst setSwStatus = (swStateToSet) => {\n const initialSwState = {\n ready: false,\n registered: false,\n cached: false,\n updateFound: false,\n updated: false,\n offline: false,\n error: false,\n devMode: false,\n disabledByUser: false,\n };\n const sessionData = sessionStorage[sessionStorageKeys.SW_STATUS];\n const currentSwState = sessionData ? JSON.parse(sessionData) : initialSwState;\n try {\n const newSwState = { ...currentSwState, ...swStateToSet };\n sessionStorage.setItem(sessionStorageKeys.SW_STATUS, JSON.stringify(newSwState));\n } catch (e) {\n statusErrorMsg('Service Worker Status', 'Error Updating SW Status', e);\n }\n};\n\n/**\n * Checks if service workers should be enabled\n * Disable if not running in production\n * Or disable if user specified to disable\n */\nconst shouldEnableServiceWorker = () => {\n if (conf && conf.appConfig && conf.appConfig.enableServiceWorker) {\n setSwStatus({ disabledByUser: false });\n return true;\n } else if (process.env.NODE_ENV !== 'production') {\n setSwStatus({ devMode: true });\n return false;\n }\n setSwStatus({ disabledByUser: true });\n return false;\n};\n\n/* Calls to the print status function */\nconst printSwStatus = (msg) => {\n statusMsg('Service Worker Status', msg);\n};\n\nconst swUrl = `${process.env.BASE_URL || '/'}service-worker.js`;\n\n/* If service worker enabled, then register it, and print message when status changes */\nconst registerServiceWorker = () => {\n if (shouldEnableServiceWorker()) {\n register(swUrl, {\n ready() {\n setSwStatus({ ready: true });\n printSwStatus(\n 'Dashy is being served from cache by a service worker.\\n'\n + 'For more details, visit https://goo.gl/AFskqB',\n );\n },\n registered() {\n setSwStatus({ registered: true });\n printSwStatus('Service worker has been registered.');\n },\n cached() {\n setSwStatus({ cached: true });\n printSwStatus('App has been cached for offline use.');\n },\n updatefound() {\n setSwStatus({ updateFound: true });\n printSwStatus('New content is downloading...');\n },\n updated() {\n setSwStatus({ updated: true });\n printSwStatus('New content is available; please refresh the page.');\n },\n offline() {\n setSwStatus({ offline: true });\n printSwStatus('No internet connection found. Dashy is running in offline mode.');\n },\n error(error) {\n setSwStatus({ error: true });\n statusErrorMsg('Service Worker Status', 'Error during SW registration', error);\n },\n });\n }\n};\n\nexport default registerServiceWorker;\n","/**\n * A simple Vue directive to trigger an event when the user\n * clicks anywhere other than the specified element.\n * Used to close context menu's popup menus and tips.\n */\n\nconst instances = [];\n\nfunction onDocumentClick(e, el, fn) {\n const { target } = e;\n if (el !== target && !el.contains(target)) {\n fn(e);\n }\n}\n\nexport default {\n bind(element, binding) {\n const el = element;\n el.dataset.outsideClickIndex = instances.length;\n\n const fn = binding.value;\n const click = (e) => {\n onDocumentClick(e, el, fn);\n };\n\n document.addEventListener('click', click);\n document.addEventListener('touchstart', click);\n instances.push(click);\n },\n unbind(el) {\n if (!el.dataset) return;\n const index = el.dataset.outsideClickIndex;\n const handler = instances[index];\n document.removeEventListener('click', handler);\n instances.splice(index, 1);\n },\n};\n","/**\n * NOTE: No data is EVER sent to any external service without your explicit consent.\n * In the case of error reporting, Sentry will not even be initialized unless\n * you have purposely set appConfig.enableErrorReporting: true.\n * It is false by default.\n * You may want to enable error reporting if you have encountered a bug,\n * as access to the console errors enable it to be triaged an fixed effectively\n */\n\n/* eslint-disable global-require */\n\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport { sentryDsn } from '@/utils/defaults';\n\nconst ErrorReporting = (Vue, router) => {\n // Fetch users config\n const appConfig = new ConfigAccumulator().appConfig() || {};\n // Check if error reporting is enabled. Only proceed if user has turned it on.\n if (appConfig.enableErrorReporting) {\n // Get current app version\n const appVersion = process.env.VUE_APP_VERSION ? `Dashy@${process.env.VUE_APP_VERSION}` : '';\n // Import Sentry\n const Sentry = require('@sentry/vue');\n const { Integrations } = require('@sentry/tracing');\n // Get the Data Source Name for your or Dashy's Sentry instance\n const dsn = appConfig.sentryDsn || sentryDsn;\n // Initialize Sentry\n Sentry.init({\n Vue,\n dsn,\n integrations: [\n new Integrations.BrowserTracing({\n routingInstrumentation: Sentry.vueRouterInstrumentation(router),\n }),\n ],\n tracesSampleRate: 1.0,\n release: appVersion,\n });\n } else {\n // Error reporting has not been enabled by the user. Do Nothing.\n }\n};\n\nexport default ErrorReporting;\n","/* eslint-disable no-multi-spaces */\n// Import core framework and essential utils\nimport Vue from 'vue';\nimport VueI18n from 'vue-i18n'; // i18n for localization\nimport Keycloak from 'keycloak-js';\n\n// Import component Vue plugins, used throughout the app\nimport VTooltip from 'v-tooltip'; // A Vue directive for Popper.js, tooltip component\nimport VModal from 'vue-js-modal'; // Modal component\nimport VSelect from 'vue-select'; // Select dropdown component\nimport VTabs from 'vue-material-tabs'; // Tab view component, used on the config page\nimport Toasted from 'vue-toasted'; // Toast component, used to show confirmation notifications\nimport TreeView from 'vue-json-tree-view';\n\n// Import base Dashy components and utils\nimport Dashy from '@/App.vue'; // Main Dashy Vue app\nimport router from '@/router'; // Router, for navigation\nimport store from '@/store'; // Store, for local state management\nimport serviceWorker from '@/utils/InitServiceWorker'; // Service worker initialization\nimport clickOutside from '@/utils/ClickOutside'; // Directive for closing popups, modals, etc\nimport { messages } from '@/utils/languages'; // Language texts\nimport ErrorReporting from '@/utils/ErrorReporting'; // Error reporting initializer (off)\nimport { toastedOptions, tooltipOptions, language as defaultLanguage } from '@/utils/defaults';\nimport { isKeycloakEnabled, getKeycloakConfig } from '@/utils/Auth'; // Keycloak auth config\n\n// Initialize global Vue components\nVue.use(VueI18n);\nVue.use(VTooltip, tooltipOptions);\nVue.use(VModal);\nVue.use(VTabs);\nVue.use(TreeView);\nVue.use(Toasted, toastedOptions);\nVue.component('v-select', VSelect);\nVue.directive('clickOutside', clickOutside);\n\nVue.config.productionTip = false; // Disable annoying console message\n\n// Setup i18n translations\nconst i18n = new VueI18n({\n locale: defaultLanguage,\n fallbackLocale: defaultLanguage,\n messages,\n});\n\n// Checks if service worker not disable, and if so will registers it\nserviceWorker();\n\n// Checks if user enabled error reporting, and if so will initialize it\nErrorReporting(Vue, router);\n\n// Render function\nconst render = (awesome) => awesome(Dashy);\n\n// Mount the app, with router, store i18n and render func\nconst mount = () => new Vue({\n store, router, render, i18n,\n}).$mount('#app');\n\n// If Keycloak not enabled, then proceed straight to the app\nif (!isKeycloakEnabled()) {\n mount();\n} else { // Keycloak is enabled, redirect to KC login page\n const { serverUrl, realm, clientId } = getKeycloakConfig();\n const initOptions = {\n url: `${serverUrl}/auth`, realm, clientId, onLoad: 'login-required',\n };\n const keycloak = Keycloak(initOptions);\n keycloak.init({ onLoad: initOptions.onLoad }).then((auth) => {\n if (!auth) {\n // Not authenticated, reload to Keycloak login page\n window.location.reload();\n } else {\n // Yay - user successfully authenticated with Keycloak, render the app!\n mount();\n }\n });\n}\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-sliders-h fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"sliders-h\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M496 384H160v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h80v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h336c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160h-80v-16c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16c-8.8 0-16 7.2-16 16v32c0 8.8 7.2 16 16 16h336v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h80c8.8 0 16-7.2 16-16v-32c0-8.8-7.2-16-16-16zm0-160H288V48c0-8.8-7.2-16-16-16h-32c-8.8 0-16 7.2-16 16v16H16C7.2 64 0 71.2 0 80v32c0 8.8 7.2 16 16 16h208v16c0 8.8 7.2 16 16 16h32c8.8 0 16-7.2 16-16v-16h208c8.8 0 16-7.2 16-16V80c0-8.8-7.2-16-16-16z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-th-list fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"th-list\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M149.333 216v80c0 13.255-10.745 24-24 24H24c-13.255 0-24-10.745-24-24v-80c0-13.255 10.745-24 24-24h101.333c13.255 0 24 10.745 24 24zM0 376v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H24c-13.255 0-24 10.745-24 24zM125.333 32H24C10.745 32 0 42.745 0 56v80c0 13.255 10.745 24 24 24h101.333c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24zm80 448H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24zm-24-424v80c0 13.255 10.745 24 24 24H488c13.255 0 24-10.745 24-24V56c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24zm24 264H488c13.255 0 24-10.745 24-24v-80c0-13.255-10.745-24-24-24H205.333c-13.255 0-24 10.745-24 24v80c0 13.255 10.745 24 24 24z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MoveItemTo.vue?vue&type=style&index=0&id=00eee648&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-exchange fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"exchange\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M0 168v-16c0-13.255 10.745-24 24-24h381.97l-30.467-27.728c-9.815-9.289-10.03-24.846-.474-34.402l10.84-10.84c9.373-9.373 24.568-9.373 33.941 0l82.817 82.343c12.497 12.497 12.497 32.758 0 45.255l-82.817 82.343c-9.373 9.373-24.569 9.373-33.941 0l-10.84-10.84c-9.556-9.556-9.341-25.114.474-34.402L405.97 192H24c-13.255 0-24-10.745-24-24zm488 152H106.03l30.467-27.728c9.815-9.289 10.03-24.846.474-34.402l-10.84-10.84c-9.373-9.373-24.568-9.373-33.941 0L9.373 329.373c-12.497 12.497-12.497 32.758 0 45.255l82.817 82.343c9.373 9.373 24.569 9.373 33.941 0l10.84-10.84c9.556-9.556 9.341-25.113-.474-34.402L106.03 384H488c13.255 0 24-10.745 24-24v-16c0-13.255-10.745-24-24-24z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-home fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"home\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M570.24 247.41L512 199.52V104a8 8 0 00-8-8h-32a8 8 0 00-7.95 7.88v56.22L323.87 45a56.06 56.06 0 00-71.74 0L5.76 247.41a16 16 0 00-2 22.54L14 282.25a16 16 0 0022.53 2L64 261.69V448a32.09 32.09 0 0032 32h128a32.09 32.09 0 0032-32V344h64v104a32.09 32.09 0 0032 32h128a32.07 32.07 0 0032-31.76V261.67l27.53 22.62a16 16 0 0022.53-2L572.29 270a16 16 0 00-2.05-22.59zM463.85 432H368V328a32.09 32.09 0 00-32-32h-96a32.09 32.09 0 00-32 32v104h-96V222.27L288 77.65l176 144.56z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-copy fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"copy\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M433.941 65.941l-51.882-51.882A48 48 0 00348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 00-14.059-33.941zM266 464H54a6 6 0 01-6-6V150a6 6 0 016-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 01-6 6zm128-96H182a6 6 0 01-6-6V54a6 6 0 016-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 01-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 011.757 4.243V112z\"}})])\n )\n }\n }\n ","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--1-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","module.exports = {\n /* Default pageInfo object, used if user does not specify their own */\n pageInfo: {\n title: 'Dashy',\n description: '',\n navLinks: [\n { title: 'Home', path: '/' },\n { title: 'Source', path: 'https://github.com/Lissy93/dashy' },\n ],\n footerText: '',\n },\n /* Default appConfig to be used, if user does not specify their own */\n appConfig: {},\n /* Default language code */\n language: 'en',\n /* The page to use as the starting homepage */\n startingView: 'default',\n /* Default icon size to be applied on initial load */\n iconSize: 'medium',\n /* Default layout to be applied on initial load */\n layout: 'auto',\n /* Default theme to be applied on initial load */\n theme: 'default',\n /* Default Font-Awesome API key, for FA icons (if used) */\n fontAwesomeKey: '0821c65656',\n /* Default API to use for fetching of user service favicon icons (if enabled) */\n faviconApi: 'faviconkit',\n /* The default sort order for sections */\n sortOrder: 'default',\n /* The page paths for each route within the app for the router */\n routePaths: {\n home: '/home',\n minimal: '/minimal',\n workspace: '/workspace',\n about: '/about',\n login: '/login',\n download: '/download',\n notFound: '/404',\n },\n /* Server Endpoints */\n serviceEndpoints: {\n statusPing: '/status-ping',\n statusCheck: '/status-check',\n save: '/config-manager/save',\n rebuild: '/config-manager/rebuild',\n },\n /* List of built-in themes, to be displayed within the theme-switcher dropdown */\n builtInThemes: [\n 'callisto',\n 'oblivion',\n 'material',\n 'material-dark',\n 'dashy-docs',\n 'colorful',\n 'one-dark',\n 'dracula',\n 'adventure',\n 'nord-frost',\n 'nord',\n 'minimal-dark',\n 'minimal-light',\n 'thebe',\n 'cyberpunk',\n 'matrix',\n 'matrix-red',\n 'color-block',\n 'glow',\n 'raspberry-jam',\n 'bee',\n 'tiger',\n 'vaporware',\n 'material-original',\n 'material-dark-original',\n 'high-contrast-dark',\n 'high-contrast-light',\n ],\n /* Which structural components should be visible by default */\n visibleComponents: {\n splashScreen: false,\n navigation: true,\n pageTitle: true,\n searchBar: true,\n settings: true,\n footer: true,\n },\n /* A list of route names that page furniture (header, footer, etc) should be hidden on */\n hideFurnitureOn: [\n 'minimal',\n 'login',\n 'download',\n 'landing-page-minimal',\n // '404',\n ],\n /* Key names for local storage identifiers */\n localStorageKeys: {\n LANGUAGE: 'language',\n HIDE_WELCOME_BANNER: 'hideWelcomeHelpers',\n LAYOUT_ORIENTATION: 'layoutOrientation',\n COLLAPSE_STATE: 'collapseState',\n ICON_SIZE: 'iconSize',\n THEME: 'theme',\n CUSTOM_COLORS: 'customColors',\n CONF_SECTIONS: 'confSections',\n PAGE_INFO: 'pageInfo',\n APP_CONFIG: 'appConfig',\n BACKUP_ID: 'backupId',\n BACKUP_HASH: 'backupHash',\n HIDE_SETTINGS: 'hideSettings',\n USERNAME: 'username',\n MOST_USED: 'mostUsed',\n LAST_USED: 'lastUsed',\n },\n /* Key names for cookie identifiers */\n cookieKeys: {\n AUTH_TOKEN: 'authenticationToken',\n },\n /* Key names for session storage identifiers */\n sessionStorageKeys: {\n SW_STATUS: 'serviceWorkerStatus',\n ERROR_LOG: 'errorLog',\n },\n /* Unique IDs of modals within the app */\n modalNames: {\n CONF_EDITOR: 'CONF_EDITOR',\n REBUILD_APP: 'REBUILD_APP',\n ABOUT_APP: 'ABOUT_APP',\n LANG_SWITCHER: 'LANG_SWITCHER',\n EDIT_ITEM: 'EDIT_ITEM',\n EDIT_SECTION: 'EDIT_SECTION',\n EDIT_PAGE_INFO: 'EDIT_PAGE_INFO',\n EDIT_APP_CONFIG: 'EDIT_APP_CONFIG',\n EXPORT_CONFIG_MENU: 'EXPORT_CONFIG_MENU',\n MOVE_ITEM_TO: 'MOVE_ITEM_TO',\n },\n /* Key names for the top-level objects in conf.yml */\n topLevelConfKeys: {\n PAGE_INFO: 'pageInfo',\n APP_CONFIG: 'appConfig',\n SECTIONS: 'sections',\n },\n /* Which CSS variables to show in the first view of theme configurator */\n mainCssVars: ['primary', 'background', 'background-darker'],\n /* Amount of time to show splash screen, when enabled, in milliseconds */\n splashScreenTime: 1900,\n /* Page meta-data, rendered in the header of each view */\n metaTagData: [\n { name: 'description', content: 'A simple static homepage for you\\'re server' },\n ],\n /* If no 'target' specified, this is the default opening method */\n openingMethod: 'newtab',\n /* Default option for Toast messages */\n toastedOptions: {\n position: 'bottom-center',\n duration: 2500,\n keepOnHover: true,\n className: 'toast-message',\n iconPack: 'fontawesome',\n },\n /* Default tooltip options */\n tooltipOptions: {\n defaultTrigger: 'hover focus',\n defaultHideOnTargetClick: true,\n autoHide: true,\n defaultHtml: false,\n defaultPlacement: 'auto',\n defaultLoadingContent: 'Loading...',\n defaultDelay: { show: 380, hide: 0 },\n // delay: { show: 380, hide: 0 },\n },\n /* Server location of the Backup & Sync cloud function */\n backupEndpoint: 'https://dashy-sync-service.as93.net',\n /* Available services for fetching favicon icon for user apps */\n faviconApiEndpoints: {\n mcapi: 'https://eu.mc-api.net/v3/server/favicon/$URL',\n clearbit: 'https://logo.clearbit.com/$URL',\n faviconkit: 'https://api.faviconkit.com/$URL/64',\n google: 'https://www.google.com/s2/favicons?sz=128&domain_url=$URL',\n allesedv: 'https://f1.allesedv.com/128/$URL',\n webmasterapi: 'https://api.webmasterapi.com/v1/favicon/yEwx0ZFs0CSPshHq/$URL',\n },\n /* The URL to CDNs used for external icons. These are only loaded when required */\n iconCdns: {\n fa: 'https://kit.fontawesome.com',\n mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@5.9.55/css/materialdesignicons.min.css',\n si: 'https://unpkg.com/simple-icons@v5/icons',\n generative: 'https://avatars.dicebear.com/api/identicon/{icon}.svg',\n localPath: './item-icons',\n faviconName: 'favicon.ico',\n homeLabIcons: 'https://raw.githubusercontent.com/WalkxCode/dashboard-icons/master/png/{icon}.png',\n },\n /* URLs for web search engines */\n searchEngineUrls: {\n // Common\n duckduckgo: 'https://duckduckgo.com/?q=',\n google: 'https://google.com/search?q=',\n whoogle: 'https://whoogle.sdf.org/search?q=',\n qwant: 'https://www.qwant.com/?q=',\n startpage: 'https://www.startpage.com/do/search?query=',\n // Niche\n 'searx-bar': 'https://searx.bar/search?q=',\n 'searx-info': 'https://searx.info/search?q=',\n 'searx-tiekoetter': 'https://searx.tiekoetter.com/search?q=',\n 'searx-bissisoft': 'https://searx.bissisoft.com/search?q=',\n ecosia: 'https://www.ecosia.org/search?q=',\n metager: 'https://metager.org/meta/meta.ger3?eingabe=',\n swisscows: 'https://swisscows.com/web?query=',\n mojeek: 'https://www.mojeek.com/search?q=',\n peekier: 'https://peekier.com/#!',\n // Specific\n wikipedia: 'https://en.wikipedia.org/w/?search=',\n stackoverflow: 'https://stackoverflow.com/search?q=',\n wolframalpha: 'https://www.wolframalpha.com/input/?i=',\n reddit: 'https://www.reddit.com/search/?q=',\n youtube: 'https://youtube.com/results?q=',\n github: 'https://github.com/search?q=',\n bbc: 'https://www.bbc.co.uk/search?q=',\n },\n defaultSearchEngine: 'duckduckgo',\n defaultSearchOpeningMethod: 'newtab',\n searchBangs: {\n '/b': 'bbc',\n '/d': 'duckduckgo',\n '/g': 'google',\n '/r': 'reddit',\n '/w': 'wikipedia',\n '/y': 'youtube',\n '/gh': 'github',\n '/so': 'stackoverflow',\n '/wa': 'wolframalpha',\n },\n /* Available built-in colors for the theme builder */\n swatches: [\n ['#eb5cad', '#985ceb', '#5346f3', '#5c90eb'],\n ['#5cdfeb', '#00CCB4', '#5ceb8d', '#afeb5c'],\n ['#eff961', '#ebb75c', '#eb615c', '#eb2d6c'],\n ['#060913', '#141b33', '#1c2645', '#263256'],\n ['#2b2d42', '#1a535c', '#372424', '#312437'],\n ['#f5f5f5', '#d9d9d9', '#bfbfbf', '#9a9a9a'],\n ['#636363', '#363636', '#313941', '#0d0d0d'],\n ],\n /* Use your own self-hosted Sentry instance. Only used if error reporting is turned on */\n sentryDsn: 'https://3138ea85f15a4fa883a5b27a4dc8ee28@o937511.ingest.sentry.io/5887934',\n /* A JS enum for indicating the user state, when guest mode + authentication is enabled */\n userStateEnum: {\n notConfigured: 0,\n loggedIn: 1,\n guestAccess: 2,\n notLoggedIn: 3,\n },\n /* Progressive Web App settings, used by Vue Config */\n pwa: {\n name: 'Dashy',\n manifestPath: './manifest.json',\n themeColor: '#00af87',\n msTileColor: '#0b1021',\n mode: 'production',\n iconPaths: {\n manifestCrossorigin: 'use-credentials',\n favicon64: './web-icons/favicon-64x64.png',\n favicon32: './web-icons/favicon-32x32.png',\n maskIcon: './web-icons/dashy-logo.png',\n msTileImage: './web-icons/dashy-logo.png',\n },\n },\n};\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-times-circle fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"times-circle\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm0 448c-110.5 0-200-89.5-200-200S145.5 56 256 56s200 89.5 200 200-89.5 200-200 200zm101.8-262.2L295.6 256l62.2 62.2c4.7 4.7 4.7 12.3 0 17l-22.6 22.6c-4.7 4.7-12.3 4.7-17 0L256 295.6l-62.2 62.2c-4.7 4.7-12.3 4.7-17 0l-22.6-22.6c-4.7-4.7-4.7-12.3 0-17l62.2-62.2-62.2-62.2c-4.7-4.7-4.7-12.3 0-17l22.6-22.6c4.7-4.7 12.3-4.7 17 0l62.2 62.2 62.2-62.2c4.7-4.7 12.3-4.7 17 0l22.6 22.6c4.7 4.7 4.7 12.3 0 17z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"xmlns\":\"http://www.w3.org/2000/svg\",\"width\":\"100\",\"height\":\"100\",\"preserveAspectRatio\":\"xMidYMid\"}, attrs),\n ...rest,\n },\n children.concat([_c('defs',[_c('clipPath',{attrs:{\"id\":\"a\"}},[_c('path',{attrs:{\"d\":\"M20 0h60v100H20z\"}})])]),_c('path',{attrs:{\"fill\":\"none\",\"stroke\":\"var(--primary, #00af87)\",\"stroke-width\":\"6\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\",\"stroke-miterlimit\":\"10\",\"clip-path\":\"url(#a)\",\"d\":\"M90 76.7V28.3c0-2.7-2.2-5-5-5h-3.4c-2.7 0-5 2.2-5 5v43.4c0 2.7-2.2 5-5 5h-3.4c-2.7 0-5-2.2-5-5V28.3c0-2.7-2.2-5-5-5H55c-2.7 0-5 2.2-5 5v43.4c0 2.7-2.2 5-5 5h-3.4c-2.7 0-5-2.2-5-5V28.3c0-2.7-2.2-5-5-5h-3.4c-2.7 0-5 2.2-5 5v43.4c0 2.7-2.2 5-5 5H15c-2.7 0-5-2.2-5-5V23.3\"}},[_c('animateTransform',{attrs:{\"attributeName\":\"transform\",\"type\":\"translate\",\"repeatCount\":\"indefinite\",\"dur\":\"1.4925373134328357s\",\"values\":\"-20 0;7 0\",\"keyTimes\":\"0;1\"}}),_c('animate',{attrs:{\"attributeName\":\"stroke-dasharray\",\"repeatCount\":\"indefinite\",\"dur\":\"1.4925373134328357s\",\"values\":\"0 72 125 232;0 197 125 233\",\"keyTimes\":\"0;1\"}})])])\n )\n }\n }\n ","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=style&index=1&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-cloud-upload-alt fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"cloud-upload-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M395.5 267.5l-99-99c-4.7-4.7-12.3-4.7-17 0l-99 99c-7.6 7.6-2.2 20.5 8.5 20.5h67v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12v-84h67c10.7 0 16.1-12.9 8.5-20.5zm148.2-67.4C539.7 142.1 491.4 96 432 96c-7.6 0-15.1.8-22.4 2.3C377.7 58.3 328.1 32 272 32c-84.6 0-155.5 59.7-172.3 139.8C39.9 196.1 0 254.4 0 320c0 88.4 71.6 160 160 160h336c79.5 0 144-64.5 144-144 0-61.8-39.2-115.8-96.3-135.9zM496 432H160c-61.9 0-112-50.1-112-112 0-56.4 41.7-103.1 96-110.9V208c0-70.7 57.3-128 128-128 53.5 0 99.3 32.8 118.4 79.4 11.2-9.6 25.7-15.4 41.6-15.4 35.3 0 64 28.7 64 64 0 11.8-3.2 22.9-8.8 32.4 2.9-.3 5.9-.4 8.8-.4 53 0 96 43 96 96s-43 96-96 96z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=style&index=0&id=3b5dde54&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalSection.vue?vue&type=style&index=0&id=59c3b7ad&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-arrow-alt-left fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"arrow-alt-left\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M448 208v96c0 13.3-10.7 24-24 24H224v103.8c0 21.4-25.8 32.1-41 17L7 273c-9.4-9.4-9.4-24.6 0-34L183 63.3c15.1-15.1 41-4.4 41 17V184h200c13.3 0 24 10.7 24 24z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=style&index=0&id=57605993&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=style&index=0&id=26fe765a&lang=scss&scoped=true&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-expand fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"expand\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M0 180V56c0-13.3 10.7-24 24-24h124c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H64v84c0 6.6-5.4 12-12 12H12c-6.6 0-12-5.4-12-12zM288 44v40c0 6.6 5.4 12 12 12h84v84c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12V56c0-13.3-10.7-24-24-24H300c-6.6 0-12 5.4-12 12zm148 276h-40c-6.6 0-12 5.4-12 12v84h-84c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h124c13.3 0 24-10.7 24-24V332c0-6.6-5.4-12-12-12zM160 468v-40c0-6.6-5.4-12-12-12H64v-84c0-6.6-5.4-12-12-12H12c-6.6 0-12 5.4-12 12v124c0 13.3 10.7 24 24 24h124c6.6 0 12-5.4 12-12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SectionContextMenu.vue?vue&type=style&index=0&id=04bcadf7&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-trash-alt fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"trash-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M268 416h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12zM432 80h-82.41l-34-56.7A48 48 0 00274.41 0H173.59a48 48 0 00-41.16 23.3L98.41 80H16A16 16 0 000 96v16a16 16 0 0016 16h16v336a48 48 0 0048 48h288a48 48 0 0048-48V128h16a16 16 0 0016-16V96a16 16 0 00-16-16zM171.84 50.91A6 6 0 01177 48h94a6 6 0 015.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0012-12V188a12 12 0 00-12-12h-24a12 12 0 00-12 12v216a12 12 0 0012 12z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AuthButtons.vue?vue&type=style&index=0&id=67393502&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-css3-alt fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fab\",\"data-icon\":\"css3-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M0 32l34.9 395.8L192 480l157.1-52.2L384 32H0zm313.1 80l-4.8 47.3L193 208.6l-.3.1h111.5l-12.8 146.6-98.2 28.7-98.8-29.2-6.4-73.9h48.9l3.2 38.3 52.6 13.3 54.7-15.4 3.7-61.6-166.3-.5v-.1l-.2.1-3.6-46.3L193.1 162l6.5-2.7H76.7L70.9 112h242.2z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MultiTaskingWebComtent.vue?vue&type=style&index=0&id=2a7b9297&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=style&index=0&id=d1a6f18c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JsonEditor.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MinimalHeading.vue?vue&type=style&index=0&id=5f187f16&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-box-open fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"box-open\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M638.3 143.8L586.8 41c-4-8-12.1-9.5-16.7-8.9L320 64 69.8 32.1c-4.6-.6-12.6.9-16.6 8.9L1.7 143.8c-4.6 9.2.3 20.2 10.1 23L64 181.7V393c0 14.7 10 27.5 24.2 31l216.2 54.1c6 1.5 17.4 3.4 31 0L551.8 424c14.2-3.6 24.2-16.4 24.2-31V181.7l52.1-14.9c9.9-2.8 14.7-13.8 10.2-23zM86 82.6l154.8 19.7-41.2 68.3-138-39.4L86 82.6zm26 112.8l97.8 27.9c8 2.3 15.2-1.8 18.5-7.3L296 103.8v322.7l-184-46V195.4zm416 185.1l-184 46V103.8l67.7 112.3c3.3 5.5 10.6 9.6 18.5 7.3l97.8-27.9v185zm-87.7-209.9l-41.2-68.3L554 82.6l24.3 48.6-138 39.4z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=style&index=0&id=dd5e343e&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemContextMenu.vue?vue&type=style&index=0&lang=scss&\"","module.exports = {\"pageInfo\":{\"title\":\"Dashy\",\"description\":\"Welcome to your new dashboard!\",\"navLinks\":[{\"title\":\"GitHub\",\"path\":\"https://github.com/Lissy93/dashy\"},{\"title\":\"Documentation\",\"path\":\"https://dashy.to/docs\"}]},\"appConfig\":{\"theme\":\"colorful\"},\"sections\":[{\"name\":\"Getting Started\",\"icon\":\"fas fa-rocket\",\"items\":[{\"title\":\"Dashy Live\",\"description\":\"Development a project management links for Dashy\",\"icon\":\"https://i.ibb.co/qWWpD0v/astro-dab-128.png\",\"url\":\"https://live.dashy.to/\",\"target\":\"newtab\"},{\"title\":\"GitHub\",\"description\":\"Source Code, Issues and Pull Requests\",\"url\":\"https://github.com/lissy93/dashy\",\"icon\":\"favicon\"},{\"title\":\"Docs\",\"description\":\"Configuring & Usage Documentation\",\"provider\":\"Dashy.to\",\"icon\":\"far fa-book\",\"url\":\"https://dashy.to/docs\"},{\"title\":\"Showcase\",\"description\":\"See how others are using Dashy\",\"url\":\"https://github.com/Lissy93/dashy/blob/master/docs/showcase.md\",\"icon\":\"far fa-grin-hearts\"},{\"title\":\"Config Guide\",\"description\":\"See full list of configuration options\",\"url\":\"https://github.com/Lissy93/dashy/blob/master/docs/configuring.md\",\"icon\":\"fas fa-wrench\"},{\"title\":\"Support\",\"description\":\"Get help with Dashy, raise a bug, or get in contact\",\"url\":\"https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md\",\"icon\":\"far fa-hands-helping\"}]}]}","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=style&index=0&id=774db33a&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-quote-right fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"quote-right\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M200 32H72C32.3 32 0 64.3 0 104v112c0 39.7 32.3 72 72 72h56v8c0 22.1-17.9 40-40 40h-8c-26.5 0-48 21.5-48 48v48c0 26.5 21.5 48 48 48h8c101.5 0 184-82.5 184-184V104c0-39.7-32.3-72-72-72zm24 264c0 75-61 136-136 136h-8v-48h8c48.5 0 88-39.5 88-88v-56H72c-13.2 0-24-10.8-24-24V104c0-13.2 10.8-24 24-24h128c13.2 0 24 10.8 24 24v192zM504 32H376c-39.7 0-72 32.3-72 72v112c0 39.7 32.3 72 72 72h56v8c0 22.1-17.9 40-40 40h-8c-26.5 0-48 21.5-48 48v48c0 26.5 21.5 48 48 48h8c101.5 0 184-82.5 184-184V104c0-39.7-32.3-72-72-72zm24 264c0 75-61 136-136 136h-8v-48h8c48.5 0 88-39.5 88-88v-56H376c-13.2 0-24-10.8-24-24V104c0-13.2 10.8-24 24-24h128c13.2 0 24 10.8 24 24v192z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-window-close fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"window-close\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.5 32 0 53.5 0 80v352c0 26.5 21.5 48 48 48h416c26.5 0 48-21.5 48-48V80c0-26.5-21.5-48-48-48zm0 394c0 3.3-2.7 6-6 6H54c-3.3 0-6-2.7-6-6V86c0-3.3 2.7-6 6-6h404c3.3 0 6 2.7 6 6v340zM356.5 194.6L295.1 256l61.4 61.4c4.6 4.6 4.6 12.1 0 16.8l-22.3 22.3c-4.6 4.6-12.1 4.6-16.8 0L256 295.1l-61.4 61.4c-4.6 4.6-12.1 4.6-16.8 0l-22.3-22.3c-4.6-4.6-4.6-12.1 0-16.8l61.4-61.4-61.4-61.4c-4.6-4.6-4.6-12.1 0-16.8l22.3-22.3c4.6-4.6 12.1-4.6 16.8 0l61.4 61.4 61.4-61.4c4.6-4.6 12.1-4.6 16.8 0l22.3 22.3c4.7 4.6 4.7 12.1 0 16.8z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-save fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"save\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M433.941 129.941l-83.882-83.882A48 48 0 00316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 00-14.059-33.941zM272 80v80H144V80h128zm122 352H54a6 6 0 01-6-6V86a6 6 0 016-6h42v104c0 13.255 10.745 24 24 24h176c13.255 0 24-10.745 24-24V83.882l78.243 78.243a6 6 0 011.757 4.243V426a6 6 0 01-6 6zM224 232c-48.523 0-88 39.477-88 88s39.477 88 88 88 88-39.477 88-88-39.477-88-88-88zm0 128c-22.056 0-40-17.944-40-40s17.944-40 40-40 40 17.944 40 40-17.944 40-40 40z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-expand-arrows-alt fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"expand-arrows-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M448 344v112a23.94 23.94 0 01-24 24H312c-21.39 0-32.09-25.9-17-41l36.2-36.2L224 295.6 116.77 402.9 153 439c15.09 15.1 4.39 41-17 41H24a23.94 23.94 0 01-24-24V344c0-21.4 25.89-32.1 41-17l36.19 36.2L184.46 256 77.18 148.7 41 185c-15.1 15.1-41 4.4-41-17V56a23.94 23.94 0 0124-24h112c21.39 0 32.09 25.9 17 41l-36.2 36.2L224 216.4l107.23-107.3L295 73c-15.09-15.1-4.39-41 17-41h112a23.94 23.94 0 0124 24v112c0 21.4-25.89 32.1-41 17l-36.19-36.2L263.54 256l107.28 107.3L407 327.1c15.1-15.2 41-4.5 41 16.9z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./KeyboardShortcutInfo.vue?vue&type=style&index=0&id=c5f17d9a&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"d\":\"M132.893 310.534l-30.082 10.911L91.9 291.364l30.081-10.911z\"}}),_c('path',{attrs:{\"d\":\"M271.552 301.072l-77.856-46.72-41.616 15.152 10.944 30.064 27.28-9.92 82.144 49.28 97.6-65.072L480 315.088V480H32V347.2l40.8-14.848-10.928-30.048L0 324.8V512h512V292.912l-146.048-54.768z\"}}),_c('path',{attrs:{\"d\":\"M0 0v278.848l66.576-24.224-10.928-30.064L32 233.152V32h448v168.912l-114.048-42.768-94.4 62.928-77.856-46.72-47.84 17.392 10.944 30.064 33.504-12.16 82.144 49.28 97.6-65.072L512 247.088V0z\"}}),_c('path',{attrs:{\"d\":\"M96.656 243.686L85.721 213.63l30.07-10.94 10.935 30.055z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Section.vue?vue&type=style&index=0&id=64cbaaaf&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CustomCss.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=style&index=0&id=d162889c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=style&index=0&id=0cb96044&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=style&index=0&id=e0bd5110&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditModeTopBanner.vue?vue&type=style&index=0&id=3cb5bf99&scoped=true&lang=scss&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=style&index=0&id=188fee4a&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SaveCancelButtons.vue?vue&type=style&index=0&id=e813bfa0&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-question fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"question\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M202.021 0C122.202 0 70.503 32.703 29.914 91.026c-7.363 10.58-5.093 25.086 5.178 32.874l43.138 32.709c10.373 7.865 25.132 6.026 33.253-4.148 25.049-31.381 43.63-49.449 82.757-49.449 30.764 0 68.816 19.799 68.816 49.631 0 22.552-18.617 34.134-48.993 51.164-35.423 19.86-82.299 44.576-82.299 106.405V320c0 13.255 10.745 24 24 24h72.471c13.255 0 24-10.745 24-24v-5.773c0-42.86 125.268-44.645 125.268-160.627C377.504 66.256 286.902 0 202.021 0zM192 373.459c-38.196 0-69.271 31.075-69.271 69.271 0 38.195 31.075 69.27 69.271 69.27s69.271-31.075 69.271-69.271-31.075-69.27-69.271-69.27z\"}})])\n )\n }\n }\n ","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Minimal.vue?vue&type=style&index=0&id=31e46608&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=style&index=0&id=6150e7a7&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Select.vue?vue&type=style&index=0&id=3921c087&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditAppConfig.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-pencil-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fal\",\"data-icon\":\"pencil-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M493.255 56.236l-37.49-37.49c-24.993-24.993-65.515-24.994-90.51 0L12.838 371.162.151 485.346c-1.698 15.286 11.22 28.203 26.504 26.504l114.184-12.687 352.417-352.417c24.992-24.994 24.992-65.517-.001-90.51zM164.686 347.313c6.249 6.249 16.379 6.248 22.627 0L368 166.627l30.059 30.059L174 420.745V386h-48v-48H91.255l224.059-224.059L345.373 144 164.686 324.687c-6.249 6.248-6.249 16.378 0 22.626zm-38.539 121.285l-58.995 6.555-30.305-30.305 6.555-58.995L63.255 366H98v48h48v34.745l-19.853 19.853zm344.48-344.48l-49.941 49.941-82.745-82.745 49.941-49.941c12.505-12.505 32.748-12.507 45.255 0l37.49 37.49c12.506 12.506 12.507 32.747 0 45.255z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-memory fa-w-20\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"memory\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 640 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M480 160h-64v128h64V160zm-128 0h-64v128h64V160zm-128 0h-64v128h64V160zm408 0h8V96c0-17.67-14.33-32-32-32H32C14.33 64 0 78.33 0 96v64h8c13.26 0 24 10.74 24 24 0 13.25-10.74 24-24 24H0v240h640V208h-8c-13.25 0-24-10.75-24-24 0-13.26 10.75-24 24-24zm-40 240h-64c0-8.84-7.16-16-16-16s-16 7.16-16 16h-96c0-8.84-7.16-16-16-16s-16 7.16-16 16h-96c0-8.84-7.16-16-16-16s-16 7.16-16 16h-96c0-8.84-7.16-16-16-16s-16 7.16-16 16H48v-48h544v48zm0-275.84c-19.29 12.93-32 34.93-32 59.84s12.71 46.91 32 59.84V320H48v-76.16c19.29-12.93 32-34.93 32-59.84s-12.71-46.91-32-59.84V112h544v12.16z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=style&index=0&id=5a56ca84&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Radio.vue?vue&type=style&index=0&id=0ff870ef&scoped=true&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-table fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"table\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64v-96h160v96zm0-160H64v-96h160v96zm224 160H288v-96h160v96zm0-160H288v-96h160v96z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-file-download fa-w-12\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"file-download\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 384 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M216 236.07c0-6.63-5.37-12-12-12h-24c-6.63 0-12 5.37-12 12v84.01h-48.88c-10.71 0-16.05 12.97-8.45 20.52l72.31 71.77c4.99 4.95 13.04 4.95 18.03 0l72.31-71.77c7.6-7.54 2.26-20.52-8.45-20.52H216v-84.01zM369.83 97.98L285.94 14.1c-9-9-21.2-14.1-33.89-14.1H47.99C21.5.1 0 21.6 0 48.09v415.92C0 490.5 21.5 512 47.99 512h287.94c26.5 0 48.07-21.5 48.07-47.99V131.97c0-12.69-5.17-24.99-14.17-33.99zM255.95 51.99l76.09 76.08h-76.09V51.99zM336 464.01H47.99V48.09h159.97v103.98c0 13.3 10.7 23.99 24 23.99H336v287.95z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./EditPageInfo.vue?vue&type=style&index=0&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-compress-arrows-alt fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"compress-arrows-alt\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M200 288H88c-21.4 0-32.1 25.8-17 41l32.9 31-99.2 99.3c-6.2 6.2-6.2 16.4 0 22.6l25.4 25.4c6.2 6.2 16.4 6.2 22.6 0L152 408l31.1 33c15.1 15.1 40.9 4.4 40.9-17V312c0-13.3-10.7-24-24-24zm112-64h112c21.4 0 32.1-25.9 17-41l-33-31 99.3-99.3c6.2-6.2 6.2-16.4 0-22.6L481.9 4.7c-6.2-6.2-16.4-6.2-22.6 0L360 104l-31.1-33C313.8 55.9 288 66.6 288 88v112c0 13.3 10.7 24 24 24zm96 136l33-31.1c15.1-15.1 4.4-40.9-17-40.9H312c-13.3 0-24 10.7-24 24v112c0 21.4 25.9 32.1 41 17l31-32.9 99.3 99.3c6.2 6.2 16.4 6.2 22.6 0l25.4-25.4c6.2-6.2 6.2-16.4 0-22.6L408 360zM183 71.1L152 104 52.7 4.7c-6.2-6.2-16.4-6.2-22.6 0L4.7 30.1c-6.2 6.2-6.2 16.4 0 22.6L104 152l-33 31.1C55.9 198.2 66.6 224 88 224h112c13.3 0 24-10.7 24-24V88c0-21.3-25.9-32-41-16.9z\"}})])\n )\n }\n }\n ","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=36369dae&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=style&index=1&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-level-up fa-w-11\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"level-up\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 352 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M345.04 144l-136-136.901c-9.388-9.465-24.691-9.465-34.079 0L38.96 144c-9.307 9.384-9.277 24.526.069 33.872l22.056 22.056c9.619 9.619 25.301 9.329 34.557-.639L152 138.84V432H68.024a11.996 11.996 0 00-8.485 3.515l-56 56C-4.021 499.074 1.333 512 12.024 512H208c13.255 0 24-10.745 24-24V138.84l56.357 60.448c9.256 9.968 24.938 10.258 34.557.639l22.056-22.056c9.346-9.345 9.377-24.487.07-33.871z\"}})])\n )\n }\n }\n ","module.exports = /(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\u0023-\\u0039]\\ufe0f?\\u20e3|\\u3299|\\u3297|\\u303d|\\u3030|\\u24c2|\\ud83c[\\udd70-\\udd71]|\\ud83c[\\udd7e-\\udd7f]|\\ud83c\\udd8e|\\ud83c[\\udd91-\\udd9a]|\\ud83c[\\udde6-\\uddff]|[\\ud83c[\\ude01-\\ude02]|\\ud83c\\ude1a|\\ud83c\\ude2f|[\\ud83c[\\ude32-\\ude3a]|[\\ud83c[\\ude50-\\ude51]|\\u203c|\\u2049|[\\u25aa-\\u25ab]|\\u25b6|\\u25c0|[\\u25fb-\\u25fe]|\\u00a9|\\u00ae|\\u2122|\\u2139|\\ud83c\\udc04|[\\u2600-\\u26FF]|\\u2b05|\\u2b06|\\u2b07|\\u2b1b|\\u2b1c|\\u2b50|\\u2b55|\\u231a|\\u231b|\\u2328|\\u23cf|[\\u23e9-\\u23f3]|[\\u23f8-\\u23fa]|\\ud83c\\udccf|\\u2934|\\u2935|[\\u2190-\\u21ff])/;\n","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-bars fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"bars\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-plus fa-w-14\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"plus\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 448 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-download fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fal\",\"data-icon\":\"download\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M452 432c0 11-9 20-20 20s-20-9-20-20 9-20 20-20 20 9 20 20zm-84-20c-11 0-20 9-20 20s9 20 20 20 20-9 20-20-9-20-20-20zm144-48v104c0 24.3-19.7 44-44 44H44c-24.3 0-44-19.7-44-44V364c0-24.3 19.7-44 44-44h99.4L87 263.6c-25.2-25.2-7.3-68.3 28.3-68.3H168V40c0-22.1 17.9-40 40-40h96c22.1 0 40 17.9 40 40v155.3h52.7c35.6 0 53.4 43.1 28.3 68.3L368.6 320H468c24.3 0 44 19.7 44 44zm-261.7 17.7c3.1 3.1 8.2 3.1 11.3 0L402.3 241c5-5 1.5-13.7-5.7-13.7H312V40c0-4.4-3.6-8-8-8h-96c-4.4 0-8 3.6-8 8v187.3h-84.7c-7.1 0-10.7 8.6-5.7 13.7l140.7 140.7zM480 364c0-6.6-5.4-12-12-12H336.6l-52.3 52.3c-15.6 15.6-41 15.6-56.6 0L175.4 352H44c-6.6 0-12 5.4-12 12v104c0 6.6 5.4 12 12 12h424c6.6 0 12-5.4 12-12V364z\"}})])\n )\n }\n }\n ","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-edit fa-w-18\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"edit\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 576 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M402.3 344.9l32-32c5-5 13.7-1.5 13.7 5.7V464c0 26.5-21.5 48-48 48H48c-26.5 0-48-21.5-48-48V112c0-26.5 21.5-48 48-48h273.5c7.1 0 10.7 8.6 5.7 13.7l-32 32c-1.5 1.5-3.5 2.3-5.7 2.3H48v352h352V350.5c0-2.1.8-4.1 2.3-5.6zm156.6-201.8L296.3 405.7l-90.4 10c-26.2 2.9-48.5-19.2-45.6-45.6l10-90.4L432.9 17.1c22.9-22.9 59.9-22.9 82.7 0l43.2 43.2c22.9 22.9 22.9 60 .1 82.8zM460.1 174L402 115.9 216.2 301.8l-7.3 65.3 65.3-7.3L460.1 174zm64.8-79.7l-43.2-43.2c-4.1-4.1-10.8-4.1-14.8 0L436 82l58.1 58.1 30.9-30.9c4-4.2 4-10.8-.1-14.9z\"}})])\n )\n }\n }\n ","import { typeOf } from 'remedial';\n\nconst trimWhitespace = (input) => input.split('\\n').map(x => x.trimRight()).join('\\n');\n\nconst throwError = (msg) => {\n throw new Error(`Error in Json to YAML conversion: ${msg}`);\n};\n\n/* A function that converts valid JSON into valid YAML */\nconst stringify = (data) => {\n let indentLevel = '';\n const handlers = {\n undefined() {\n return 'null';\n },\n null() {\n return 'null';\n },\n number(x) {\n return x;\n },\n boolean(x) {\n return x ? 'true' : 'false';\n },\n string(x) {\n return JSON.stringify(x);\n },\n array(x) {\n let output = '';\n if (x.length === 0) {\n output += '[]';\n return output;\n }\n\n indentLevel = indentLevel.replace(/$/, ' ');\n x.forEach((y) => {\n const handler = handlers[typeOf(y)];\n\n if (!handler) throwError(typeOf(y));\n\n output += `\\n${indentLevel}- ${handler(y, true)}`;\n });\n indentLevel = indentLevel.replace(/ {2}/, '');\n\n return output;\n },\n object(x, inArray, rootNode) {\n let output = '';\n\n if (Object.keys(x).length === 0) {\n output += '{}';\n return output;\n }\n\n if (!rootNode) {\n indentLevel = indentLevel.replace(/$/, ' ');\n }\n\n Object.keys(x).forEach((k, i) => {\n const val = x[k];\n const handler = handlers[typeOf(val)];\n\n if (typeof val === 'undefined') {\n return;\n }\n\n if (!handler) throwError(typeOf(val));\n\n if (!(inArray && i === 0)) {\n output += `\\n${indentLevel}`;\n }\n\n output += `${k}: ${handler(val)}`;\n });\n indentLevel = indentLevel.replace(/ {2}/, '');\n\n return output;\n },\n function() {\n return '[object Function]';\n },\n };\n\n return trimWhitespace(`${handlers[typeOf(data)](data, true, true)}\\n`);\n};\n\nexport default stringify;\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=style&index=0&id=68e7510c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./IframeModal.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=style&index=0&id=37c7f086&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=style&index=1&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=style&index=0&id=631127b0&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Item.vue?vue&type=style&index=1&lang=scss&\"","\n module.exports = {\n functional: true,\n render(_h, _vm) {\n const { _c, _v, data, children = [] } = _vm;\n\n const {\n class: classNames,\n staticClass,\n style,\n staticStyle,\n attrs = {},\n ...rest\n } = data;\n\n return _c(\n 'svg',\n {\n class: [\"svg-inline--fa fa-columns fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"fas\",\"data-icon\":\"columns\",\"xmlns\":\"http://www.w3.org/2000/svg\",\"viewBox\":\"0 0 512 512\"}, attrs),\n ...rest,\n },\n children.concat([_c('path',{attrs:{\"fill\":\"currentColor\",\"d\":\"M464 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V80c0-26.51-21.49-48-48-48zM224 416H64V160h160v256zm224 0H288V160h160v256z\"}})])\n )\n }\n }\n ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--1-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=style&index=0&id=72c986b6&scoped=true&lang=scss&\""],"sourceRoot":""}