dashy/js/dashy.46e0bc72.js.map

1 line
509 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.

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/assets/interface-icons/user-logout.svg","webpack:///./src/components/Workspace/SideBarItem.vue?c5cd","webpack:///./src/components/Settings/AppButtons.vue?0dbe","webpack:///./src/assets/interface-icons/config-delete-local.svg","webpack:///./src/views/Home.vue?d7a7","webpack:///./src/assets/interface-icons/config-language.svg","webpack:///./src/assets/interface-icons/application-rebuild.svg","webpack:///./src/components/Configuration/RebuildApp.vue?b4b6","webpack:///./src/assets/interface-icons/open-iframe.svg","webpack:///./src/components/LinkItems/ItemGroup.vue?c93a","webpack:///./src/components/Configuration/ConfigContainer.vue?09fd","webpack:///./src/views/Login.vue?2567","webpack:///./src/components/Workspace/WebContent.vue?ad01","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/FormElements/Button.vue?8611","webpack:///./src/components/Settings/ConfigLauncher.vue?5511","webpack:///./src/components/PageStrcture/LoadingScreen.vue?ea0c","webpack:///./src/components/FormElements/Input.vue?fb76","webpack:///./src/assets/interface-icons/config-editor.svg","webpack:///./src/components/Settings/CustomThemeMaker.vue?25a2","webpack:///./src/assets/interface-icons/config-backup.svg","webpack:///./src/components/Configuration/ConfigContainer.vue?5591","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?dc21","webpack:///./src/components/Settings/ThemeSelector.vue?89f8","webpack:///./src/App.vue?49de","webpack:///./src/components/PageStrcture/Header.vue?b298","webpack:///./src/components/PageStrcture/PageTitle.vue?1b83","webpack:///src/components/PageStrcture/PageTitle.vue","webpack:///./src/components/PageStrcture/PageTitle.vue?ea63","webpack:///./src/components/PageStrcture/PageTitle.vue","webpack:///./src/components/PageStrcture/Nav.vue?c1d4","webpack:///src/components/PageStrcture/Nav.vue","webpack:///./src/components/PageStrcture/Nav.vue?c674","webpack:///./src/components/PageStrcture/Nav.vue","webpack:///src/components/PageStrcture/Header.vue","webpack:///./src/components/PageStrcture/Header.vue?83b0","webpack:///./src/components/PageStrcture/Header.vue","webpack:///./src/components/PageStrcture/Footer.vue?854d","webpack:///src/components/PageStrcture/Footer.vue","webpack:///./src/components/PageStrcture/Footer.vue?6588","webpack:///./src/components/PageStrcture/Footer.vue","webpack:///./src/components/PageStrcture/LoadingScreen.vue?a60d","webpack:///src/components/PageStrcture/LoadingScreen.vue","webpack:///./src/components/PageStrcture/LoadingScreen.vue?96ea","webpack:///./src/components/PageStrcture/LoadingScreen.vue","webpack:///./src/utils/ConfigAccumalator.js","webpack:///./src/utils/languages.js","webpack:///./src/utils/ConfigHelpers.js","webpack:///./src/utils/CoolConsole.js","webpack:///src/App.vue","webpack:///./src/App.vue?382d","webpack:///./src/App.vue","webpack:///./src/views/Home.vue?0a06","webpack:///./src/components/Settings/SettingsContainer.vue?b965","webpack:///./src/components/Settings/SearchBar.vue?29f7","webpack:///./src/utils/ArrowKeyNavigation.js","webpack:///src/components/Settings/SearchBar.vue","webpack:///./src/components/Settings/SearchBar.vue?8307","webpack:///./src/components/Settings/SearchBar.vue","webpack:///./src/components/Settings/ConfigLauncher.vue?8373","webpack:///./src/components/Configuration/ConfigContainer.vue?667e","webpack:///./src/utils/JsonToYaml.js","webpack:///./src/components/Configuration/JsonEditor.vue?e8da","webpack:///./src/utils/Auth.js","webpack:///src/components/Configuration/JsonEditor.vue","webpack:///./src/components/Configuration/JsonEditor.vue?579f","webpack:///./src/components/Configuration/JsonEditor.vue","webpack:///./src/components/Configuration/CustomCss.vue?dc63","webpack:///./src/components/Settings/CustomThemeMaker.vue?9490","webpack:///./src/components/FormElements/Button.vue?e0fc","webpack:///src/components/FormElements/Button.vue","webpack:///./src/components/FormElements/Button.vue?52f8","webpack:///./src/components/FormElements/Button.vue","webpack:///src/components/Settings/CustomThemeMaker.vue","webpack:///./src/components/Settings/CustomThemeMaker.vue?39f6","webpack:///./src/components/Settings/CustomThemeMaker.vue","webpack:///src/components/Configuration/CustomCss.vue","webpack:///./src/components/Configuration/CustomCss.vue?3340","webpack:///./src/components/Configuration/CustomCss.vue","webpack:///./src/components/Configuration/CloudBackupRestore.vue?ab12","webpack:///./src/components/FormElements/Input.vue?ec85","webpack:///src/components/FormElements/Input.vue","webpack:///./src/components/FormElements/Input.vue?49a6","webpack:///./src/components/FormElements/Input.vue","webpack:///./src/utils/CloudBackup.js","webpack:///src/components/Configuration/CloudBackupRestore.vue","webpack:///./src/components/Configuration/CloudBackupRestore.vue?d065","webpack:///./src/components/Configuration/CloudBackupRestore.vue","webpack:///./src/components/Configuration/RebuildApp.vue?5508","webpack:///src/components/Configuration/RebuildApp.vue","webpack:///./src/components/Configuration/RebuildApp.vue?1840","webpack:///./src/components/Configuration/RebuildApp.vue","webpack:///./src/components/Configuration/AppVersion.vue?c852","webpack:///src/components/Configuration/AppVersion.vue","webpack:///./src/components/Configuration/AppVersion.vue?808b","webpack:///./src/components/Configuration/AppVersion.vue","webpack:///src/components/Configuration/ConfigContainer.vue","webpack:///./src/components/Configuration/ConfigContainer.vue?d8c3","webpack:///./src/components/Configuration/ConfigContainer.vue","webpack:///./src/components/Settings/LanguageSwitcher.vue?66af","webpack:///src/components/Settings/LanguageSwitcher.vue","webpack:///./src/components/Settings/LanguageSwitcher.vue?15e6","webpack:///./src/components/Settings/LanguageSwitcher.vue","webpack:///src/components/Settings/ConfigLauncher.vue","webpack:///./src/components/Settings/ConfigLauncher.vue?5a66","webpack:///./src/components/Settings/ConfigLauncher.vue","webpack:///./src/components/Settings/ThemeSelector.vue?d96f","webpack:///./src/utils/ErrorHandler.js","webpack:///./src/utils/ThemeHelper.js","webpack:///src/components/Settings/ThemeSelector.vue","webpack:///./src/components/Settings/ThemeSelector.vue?3fa2","webpack:///./src/components/Settings/ThemeSelector.vue","webpack:///./src/components/Settings/LayoutSelector.vue?eb08","webpack:///src/components/Settings/LayoutSelector.vue","webpack:///./src/components/Settings/LayoutSelector.vue?4a31","webpack:///./src/components/Settings/LayoutSelector.vue","webpack:///./src/components/Settings/ItemSizeSelector.vue?7606","webpack:///src/components/Settings/ItemSizeSelector.vue","webpack:///./src/components/Settings/ItemSizeSelector.vue?7880","webpack:///./src/components/Settings/ItemSizeSelector.vue","webpack:///./src/components/Settings/AppButtons.vue?b115","webpack:///src/components/Settings/AppButtons.vue","webpack:///./src/components/Settings/AppButtons.vue?185d","webpack:///./src/components/Settings/AppButtons.vue","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?e7b4","webpack:///src/components/Settings/KeyboardShortcutInfo.vue","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue?6297","webpack:///./src/components/Settings/KeyboardShortcutInfo.vue","webpack:///./src/components/Configuration/AppInfoModal.vue?0136","webpack:///src/components/Configuration/AppInfoModal.vue","webpack:///./src/components/Configuration/AppInfoModal.vue?ee6a","webpack:///./src/components/Configuration/AppInfoModal.vue","webpack:///src/components/Settings/SettingsContainer.vue","webpack:///./src/components/Settings/SettingsContainer.vue?5e44","webpack:///./src/components/Settings/SettingsContainer.vue","webpack:///./src/components/LinkItems/ItemGroup.vue?781c","webpack:///./src/components/LinkItems/Item.vue?b59a","webpack:///./src/components/LinkItems/ItemIcon.vue?a39b","webpack:///src/components/LinkItems/ItemIcon.vue","webpack:///./src/components/LinkItems/ItemIcon.vue?e801","webpack:///./src/components/LinkItems/ItemIcon.vue","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?c225","webpack:///src/components/LinkItems/ItemOpenMethodIcon.vue","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?b230","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue","webpack:///./src/components/LinkItems/StatusIndicator.vue?27c2","webpack:///src/components/LinkItems/StatusIndicator.vue","webpack:///./src/components/LinkItems/StatusIndicator.vue?9938","webpack:///./src/components/LinkItems/StatusIndicator.vue","webpack:///./src/components/LinkItems/ContextMenu.vue?4597","webpack:///src/components/LinkItems/ContextMenu.vue","webpack:///./src/components/LinkItems/ContextMenu.vue?623e","webpack:///./src/components/LinkItems/ContextMenu.vue","webpack:///src/components/LinkItems/Item.vue","webpack:///./src/components/LinkItems/Item.vue?a851","webpack:///./src/components/LinkItems/Item.vue","webpack:///./src/components/LinkItems/Collapsable.vue?133b","webpack:///src/components/LinkItems/Collapsable.vue","webpack:///./src/components/LinkItems/Collapsable.vue?bb21","webpack:///./src/components/LinkItems/Collapsable.vue","webpack:///./src/components/LinkItems/IframeModal.vue?7507","webpack:///src/components/LinkItems/IframeModal.vue","webpack:///./src/components/LinkItems/IframeModal.vue?5f28","webpack:///./src/components/LinkItems/IframeModal.vue","webpack:///src/components/LinkItems/ItemGroup.vue","webpack:///./src/components/LinkItems/ItemGroup.vue?d5bc","webpack:///./src/components/LinkItems/ItemGroup.vue","webpack:///src/views/Home.vue","webpack:///./src/views/Home.vue?1ead","webpack:///./src/views/Home.vue","webpack:///./src/views/Login.vue?8521","webpack:///src/views/Login.vue","webpack:///./src/views/Login.vue?8434","webpack:///./src/views/Login.vue","webpack:///./src/views/Workspace.vue?4a34","webpack:///./src/components/Workspace/SideBar.vue?9109","webpack:///./src/components/Workspace/SideBarItem.vue?d01e","webpack:///src/components/Workspace/SideBarItem.vue","webpack:///./src/components/Workspace/SideBarItem.vue?61b9","webpack:///./src/components/Workspace/SideBarItem.vue","webpack:///./src/components/Workspace/SideBarSection.vue?98ec","webpack:///src/components/Workspace/SideBarSection.vue","webpack:///./src/components/Workspace/SideBarSection.vue?3ca7","webpack:///./src/components/Workspace/SideBarSection.vue","webpack:///src/components/Workspace/SideBar.vue","webpack:///./src/components/Workspace/SideBar.vue?368a","webpack:///./src/components/Workspace/SideBar.vue","webpack:///./src/components/Workspace/WebContent.vue?40e3","webpack:///src/components/Workspace/WebContent.vue","webpack:///./src/components/Workspace/WebContent.vue?01ce","webpack:///./src/components/Workspace/WebContent.vue","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?5e04","webpack:///src/components/Workspace/MultiTaskingWebComtent.vue","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?5326","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue","webpack:///src/views/Workspace.vue","webpack:///./src/views/Workspace.vue?c5ca","webpack:///./src/views/Workspace.vue","webpack:///./src/views/DownloadConfig.vue?c7ee","webpack:///src/views/DownloadConfig.vue","webpack:///./src/views/DownloadConfig.vue?a1ac","webpack:///./src/views/DownloadConfig.vue","webpack:///./src/router.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/components/Settings/LanguageSwitcher.vue?1cc7","webpack:///./src/assets/interface-icons/layout-horizontal.svg","webpack:///./src/views/Workspace.vue?9554","webpack:///./src/App.vue?595f","webpack:///./src/utils/defaults.js","webpack:///./src/components/Settings/LayoutSelector.vue?6653","webpack:///./src/assets/interface-icons/config-close.svg","webpack:///./src/assets/interface-icons/loader.svg","webpack:///./src/components/Settings/SettingsContainer.vue?460a","webpack:///./src/assets/interface-icons/cloud-backup-restore.svg","webpack:///./src/components/LinkItems/ContextMenu.vue?595f","webpack:///./src/views/DownloadConfig.vue?4e96","webpack:///./src/components/PageStrcture/Header.vue?c489","webpack:///./src/assets/interface-icons/icon-size-medium.svg","webpack:///./src/assets/interface-icons/config-custom-css.svg","webpack:///./src/components/Workspace/MultiTaskingWebComtent.vue?bd20","webpack:///./src/components/Configuration/JsonEditor.vue?5179","webpack:///./src/components/LinkItems/Item.vue?b4f3","webpack:///./src/components/Workspace/SideBar.vue?34c4","webpack:///./src/components/Settings/ItemSizeSelector.vue?dc3b","webpack:///./public/conf.yml","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?300b","webpack:///./src/assets/interface-icons/broken-icon.svg","webpack:///./src/components/Configuration/CustomCss.vue?fa1a","webpack:///./src/components/Settings/SearchBar.vue?96a9","webpack:///./src/components/LinkItems/ItemOpenMethodIcon.vue?d33a","webpack:///./src/assets/interface-icons/layout-default.svg","webpack:///./src/components/Configuration/CloudBackupRestore.vue?9858","webpack:///./src/assets/interface-icons/config-download-file.svg","webpack:///./src/components/Workspace/SideBarSection.vue?8693","webpack:///./src/components/PageStrcture/Nav.vue?efdc","webpack:///./src/components/Configuration/AppInfoModal.vue?02c2","webpack:///./src/assets/interface-icons/icon-size-small.svg","webpack:///./src/components/LinkItems/ItemIcon.vue?e410","webpack:///./src/utils/EmojiUnicodeRegex.js","webpack:///./src/components/LinkItems/StatusIndicator.vue?b7eb","webpack:///./src/assets/interface-icons/config-restore.svg","webpack:///./src/assets/interface-icons/config-edit-json.svg","webpack:///./src/components/LinkItems/Collapsable.vue?d84e","webpack:///./src/components/PageStrcture/PageTitle.vue?99fa","webpack:///./src/components/PageStrcture/Footer.vue?70f9","webpack:///./src/components/LinkItems/IframeModal.vue?f46c","webpack:///./src/components/Configuration/AppVersion.vue?7d66","webpack:///./src/components/LinkItems/Item.vue?d111","webpack:///./src/assets/interface-icons/layout-vertical.svg"],"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","shouldShowSplash","isLoading","_e","pageInfo","visibleComponents","getFooterText","staticRenderFns","title","description","logo","navLinks","_s","props","String","component","_l","link","index","path","isUrl","links","Array","methods","inject","components","PageTitle","Nav","titleVisible","navVisible","text","domProps","authorUrl","authorName","licenseUrl","license","showCopyright","date","repoUrl","on","$event","ConfigAccumulator","constructor","conf","appConfig","appConfigFile","usersAppConfig","defaultAppConfig","localStorage","localStorageKeys","APP_CONFIG","JSON","parse","layout","LAYOUT_ORIENTATION","defaultLayout","iconSize","ICON_SIZE","defaultIconSize","language","LANGUAGE","defaultLanguage","defaults","defaultPageInfo","localPageInfo","PAGE_INFO","filePageInfo","pi","footerText","sections","localSections","CONF_SECTIONS","json","sectionsFile","config","languages","locale","en","flag","de","nl","fr","i18nMessages","forEach","lang","messages","Accumulator","componentVisibility","usersChoice","hideComponents","isThere","userValue","pageTitle","hideHeading","navigation","hideNav","searchBar","hideSearch","settings","hideSettings","footer","hideFooter","splashScreen","hideSplashScreen","getTheme","localTheme","THEME","appConfigTheme","theme","defaultTheme","getCustomColors","localColors","CUSTOM_COLORS","configColors","customColors","getCustomKeyShortcuts","results","section","itemsWithHotKeys","items","filter","item","hotkey","map","url","flat","getUsersLanguage","langCode","langObj","find","welcomeMsg","v","log","warningMsg","raiseBug","Header","Footer","LoadingScreen","provide","showFooter","usersCss","textContent","append","availibleLocales","$i18n","availableLocales","usersLang","includes","usersBorwserLang1","navigator","usersBorwserLang2","split","applyLanguage","hideSplash","customCss","cleanedCss","replace","injectCustomStyles","getBackgroundImage","ref","itemSizeBound","getExternalCSSLinks","getSections","modalOpen","searching","setLayoutOrientation","setItemSize","updateModalVisibility","checkTheresData","filterTiles","searchValue","icon","getDisplayData","finishedSearching","checkIfResults","$t","userIsTypingSomething","settingsVisible","externalThemes","getInitialTheme","getUserThemes","modalChanged","displayLayout","updateDisplayLayout","updateIconSize","isUserLoggedIn","directives","rawName","expression","toggleSettingsVisibility","composing","input","indexOf","_k","keyCode","clearFilterInput","arguments","ArrowKeyNavigation","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","active","Boolean","akn","addEventListener","currentElem","activeElement","id","test","$refs","handleHotKey","$emit","blur","usersHotKeys","parseInt","open","tooltip","showEditor","modalNames","CONF_EDITOR","combineConfig","LANG_SWITCHER","downloadConfigFile","yaml","navigateToTab","backupId","openLanguageSwitchModal","openRebuildAppModal","resetLocalSettings","openAboutModal","getLanguage","trimWhitespace","x","trimRight","join","throwError","msg","stringify","indentLevel","handlers","null","number","boolean","string","array","output","y","handler","typeOf","inArray","rootNode","keys","k","val","function","options","model","callback","$$v","jsonData","allowWriteToDisk","_q","saveMode","isValid","save","errorMessages","saveSuccess","responseText","generateUserToken","user","strAndUpper","toString","toUpperCase","sha","sha256","hash","isLoggedIn","users","validTokens","userAuthenticated","cookie","cookieKey","trim","cookieValue","cookieKeys","AUTH_TOKEN","checkCredentials","username","pass","response","toLowerCase","correct","successMsg","incorrectPassword","missingPassword","missingUsername","incorrectUsername","login","now","Date","expiry","setTime","getTime","toGMTString","userObject","setItem","USERNAME","logout","removeItem","isUserAdmin","currentUser","isAdmin","VJsoneditor","schema","modes","onValidationError","validationErrors","jsonParser","JsonToYaml","shouldAllowWriteToDisk","computed","allowConfigEdit","auth","writeConfigToDisk","$toasted","show","saveConfigLocally","baseUrl","endpoint","headers","body","success","carefullyClearLocalStorage","showToast","errors","highlighter","currentTheme","showingAllVars","colorName","replaceAll","isColor","swatches","setVariable","$set","makeSwatchStyles","slot","exportToClipboard","resetAndSave","themeToEdit","findAllVariableNames","saveChanges","resetUnsavedColors","disallow","disabled","click","_t","Function","VSwatches","Button","SaveIcon","CancelIcon","makeInitialData","cssVar","getComputedStyle","documentElement","getPropertyValue","variable","setProperty","priorSettings","variables","removeProperty","themeName","clipboardText","clipboard","writeText","variableArray","hasDash","addDash","removeDash","getCssVariableValue","availableVariables","from","styleSheets","colorHex","hexToRgb","colorParts","exec","hex","getLightness","contrastingColor","getForegroundColor","variableName","variableValue","nonColorVariables","CustomThemeMaker","PrismEditor","css","match","validate","userStyles","backupPassword","checkPass","scopedSlots","_u","fn","proxy","restoreCode","restorePassword","restoreBackup","label","placeholder","updateValue","default","validator","ENDPOINT","backupEndpoint","encryptData","password","stringifiedData","encryptedData","aes","encrypt","decryptData","decrypt","Utf8","makeSubHash","backup","axios","post","userData","subHash","update","put","encodeGetParams","entries","kv","encodeURIComponent","restore","params","errorMsg","decryptedData","Input","IconBackup","IconRestore","savedHash","makeUpdate","showErrorMsg","makeBackup","setBackupIdLocally","showSuccessMsg","isUpdate","makeHash","modalName","startBuild","loading","allowRebuild","refreshPage","RebuildIcon","ReloadIcon","LoadingAnimation","responseData","location","reload","appVersion","finished","isUpToDate","veryOutOfDate","latestVersion","checksEnabled","checkVersion","packageUrl","version","checkIfUpToDate","currentVersion","difference","JsonEditor","CustomCssEditor","CloudBackupRestore","RebuildApp","AppVersion","DownloadIcon","DeleteIcon","EditIcon","CloudIcon","CustomCssIcon","LanguageIcon","IconAbout","tabInxex","itemToSelect","tabView","navItems","activeTabItem","$modal","isTheUserSure","confirm","clear","filename","filecontents","element","display","availibleLanguages","setLangLocally","saveLanguage","SaveConfigIcon","selectedLanguage","checkLocale","hide","i18nLocales","IconSpanner","ConfigContainer","LanguageSwitcher","content","themeNames","selectedTheme","openThemeConfigurator","closeThemeConfigurator","ErrorHandler","warn","GetTheme","ApplyCustomVariables","mainCssVars","vName","themeColors","customVar","ApplyLocalTheme","newTheme","htmlTag","hasAttribute","removeAttribute","LoadExternalTheme","preloadTheme","sheet","checkTheme","themes","selectTheme","add","confTheme","userThemes","IconPalette","watch","updateTheme","builtInThemes","themeHelper","themeConfiguratorOpen","externalThemeNames","specialThemes","added","isThemeLocal","themeToCheck","resetToDefault","IconDeafault","IconHorizontal","IconVertical","IconSmall","IconMedium","IconLarge","IconLogout","shouldHide","hideWelcomeHelper","timeDelay","removeEventListener","keyPressEvent","shouldHideWelcomeMessage","$destroy","serviceWorkerInfo","getIsConfigValidStatus","showInfo","systemInfo","browser","isMobile","os","getSystemInfo","getSwStatus","isValidVar","sessionData","sessionStorage","swInfo","swStatus","registered","ready","cached","updateFound","updated","offline","devMode","userAgent","SearchBar","ConfigLauncher","ThemeSelector","LayoutSelector","ItemSizeSelector","AppButtons","KeyboardShortcutInfo","AppInfoModal","IconOpen","IconClose","something","changedTo","cssThemes","getSettingsVisibility","searchVisible","groupId","displayData","collapsed","cols","rows","color","customStyles","isGridLayout","makeId","backgroundColor","statusCheckUrl","statusCheckHeaders","newItemSize","shouldEnableStatusCheck","statusCheck","getStatusCheckInterval","triggerModal","getTooltipOptions","itemSize","getUnicodeOpeningIcon","itemOpened","button","openContextMenu","preventDefault","statusResponse","successStatus","contextMenuOpen","contextPos","posX","posY","contextItemClick","iconType","size","getEmoji","iconPath","getSimpleIcon","broken","imageNotFound","BrokenImage","determineImageType","getIconPath","str","pattern","RegExp","img","fileExtRegex","validImgExtensions","splitPath","emojiCode","emojiType","fromCodePoint","substr","fullUrl","shouldUseDefaultFavicon","urlParts","host","getHostName","faviconApi","isLocalIP","imageName","imgType","makeClass","isSmall","isTransparent","openingMethod","Number","transparent","NewTabOpenIcon","SameTabOpenIcon","IframeOpenIcon","WorkspaceOpenIcon","statusText","otherStatusText","classes","_m","statusSuccess","startTime","menuEnabled","launch","isMenuDisabled","disableContextMenu","subtitle","enableStatusCheck","statusCheckInterval","getId","background","Icon","ItemOpenMethodIcon","StatusIndicator","ContextMenu","altKey","clientX","pageXOffset","clientY","pageYOffset","hotkeyText","trigger","hideOnTargetClick","html","placement","delay","urlToCheck","method","checkWebsiteStatus","setInterval","checkSpanNum","sanitizeCustomStyles","uniqueKey","getCollapseState","collapseChanged","span","classPrefix","maxSpan","numSpan","userCss","initStorage","collapseStateObject","initialiseStorage","collapseState","newState","whatChanged","setCollapseState","srcElement","checked","modalClosed","close","Collapsable","Item","IframeModal","sectionLayout","styles","itemCountX","itemCountY","itemPreference","globalPreference","interval","SettingsContainer","ItemGroup","layoutOrientation","set","filterComp","urlPattern","domainPattern","allTiles","searchTerm","modalState","availibleThemes","externalStyleSheet","externals","isArray","ext","Default","prefix","isNeeded","checkIfIconLibraryNeeded","enableFontAwesome","checkIfFontAwesomeNeeded","fontAwesomeScript","faKey","fontAwesomeKey","checkIfMdiNeeded","mdiStylesheet","itemsFound","backgroundImg","initiateFontAwesome","initiateMaterialDesignIcons","dropDownMenu","submitLogin","status","time","setTheme","launchApp","isMultiTaskingEnabled","openSection","isOpen","itemClicked","SideBarItem","fill","SideBarSection","ind","openApps","openExistingApp","appendNewApp","ComponentClass","instance","propsData","$mount","container","$el","frame","classList","getElementById","btoa","remove","enableMultiTasking","SideBar","WebContent","MultiTaskingWebComtent","route","$route","query","decodeURI","Vue","use","Router","isAuthenticated","router","routes","Home","meta","metaTags","metaTagData","Workspace","Login","beforeEnter","to","next","DownloadConfig","beforeEach","defaultTitle","afterEach","nextTick","setSwStatus","swStateToSet","initialSwState","disabledByUser","sessionStorageKeys","SW_STATUS","currentSwState","newSwState","shouldEnableServiceWorker","shouldEnable","disableServiceWorker","registerServiceWorker","register","updatefound","instances","onDocumentClick","el","contains","binding","dataset","outsideClickIndex","unbind","ErrorTracking","enableErrorReporting","Sentry","require","Integrations","dsn","sentryDsn","init","integrations","BrowserTracing","routingInstrumentation","vueRouterInstrumentation","tracesSampleRate","VueI18n","VTooltip","VModal","VTabs","Toasted","toastedOptions","VSelect","directive","clickOutside","productionTip","i18n","fallbackLocale","serviceWorker","ErrorReporting","awesome","Dashy","HIDE_WELCOME_BANNER","COLLAPSE_STATE","BACKUP_ID","BACKUP_HASH","HIDE_SETTINGS","CLOUD_BACKUP","REBUILD_APP","THEME_MAKER","ABOUT_APP","topLevelConfKeys","SECTIONS","splashScreenTime","duration","keepOnHover","className","iconPack","faviconApiEndpoints","mcapi","clearbit","faviconkit","google","allesedv","webmasterapi","iconCdns","fa","mdi","si","generative","localPath","faviconName"],"mappings":"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","file":"js/dashy.46e0bc72.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/\" + ({\"about\":\"about\"}[chunkId]||chunkId) + \".\" + {\"about\":\"b4b4d572\"}[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 = {\"about\":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/\" + ({\"about\":\"about\"}[chunkId]||chunkId) + \".\" + {\"about\":\"a64c098d\"}[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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarItem.vue?vue&type=style&index=0&id=783199a0&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppButtons.vue?vue&type=style&index=0&id=57c401c7&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--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=style&index=0&id=9b847cc8&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-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RebuildApp.vue?vue&type=style&index=0&id=306fcc3a&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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemGroup.vue?vue&type=style&index=0&id=cce3e8c4&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Login.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Button.vue?vue&type=style&index=0&id=ec408f00&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigLauncher.vue?vue&type=style&index=0&id=785e1d43&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LoadingScreen.vue?vue&type=style&index=0&id=a7bc1de6&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Input.vue?vue&type=style&index=0&id=5df13ed2&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-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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-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 ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfigContainer.vue?vue&type=style&index=0&id=1360f75f&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-browser fa-w-16\",classNames,staticClass],\n style: [style,staticStyle],\n attrs: Object.assign({\"aria-hidden\":\"true\",\"data-prefix\":\"far\",\"data-icon\":\"browser\",\"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\":\"M32 36v416c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48V36c0-26.5-21.5-48-48-48H80C53.5-12 32 9.5 32 36zm60 416c-6.6 0-12-5.4-12-12v-40c0-6.6 5.4-12 12-12h24c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12H92zM426 36c3.3 0 6 2.7 6 6v404c0 3.3-2.7 6-6 6H168V36h258zm-310 0c6.6 0 12 5.4 12 12v280c0 6.6-5.4 12-12 12H92c-6.6 0-12-5.4-12-12V48c0-6.6 5.4-12 12-12h24z\"}})])\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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ThemeSelector.vue?vue&type=style&index=0&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.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.getFooterText()}}):_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('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)}\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\":\"/\"}},[(_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))])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <router-link to=\"/\" class=\"page-titles\">\n <img v-if=\"logo\" :src=\"logo\" class=\"site-logo\" />\n <div class=\"text\">\n <h1>{{ title }}</h1>\n <span class=\"subtitle\">{{ description }}</span>\n </div>\n </router-link>\n</template>\n\n<script>\nexport default {\n name: 'PageTitle',\n props: {\n title: String,\n description: String,\n logo: String,\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 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}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=28f9cb72&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=28f9cb72&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 \"28f9cb72\",\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('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)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <nav id=\"nav\">\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</template>\n\n<script>\nexport default {\n name: 'Nav',\n props: {\n links: Array,\n },\n methods: {\n isUrl: (str) => new RegExp(/(http|https):\\/\\/(\\S+)(:[0-9]+)?/).test(str),\n },\n};\n</script>\n\n<style scoped lang=\"scss\">\n\nnav {\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 outline: none;\n border: none;\n border-radius: var(--curve-factor);\n -webkit-box-shadow: 1px 1px 2px #232323;\n box-shadow: 1px 1px 2px #232323;\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 }\n }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=68c1bd5c&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=68c1bd5c&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 \"68c1bd5c\",\n null\n \n)\n\nexport default component.exports","<template>\n <header>\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 { visibleComponents as defaultVisibleComponents } from '@/utils/defaults';\n\nexport default {\n name: 'Header',\n inject: ['visibleComponents'],\n components: {\n PageTitle,\n Nav,\n },\n props: {\n pageInfo: Object,\n },\n data() {\n return {\n titleVisible: (this.visibleComponents || defaultVisibleComponents).pageTitle,\n navVisible: (this.visibleComponents || defaultVisibleComponents).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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=73a6fa67&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=73a6fa67&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 \"73a6fa67\",\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 !== '')?_c('footer',{domProps:{\"innerHTML\":_vm._s(_vm.text)}}):_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(\". \")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <!-- User Footer -->\n <footer v-if=\"text && text !== ''\" v-html=\"text\"></footer>\n <!-- Default Footer -->\n <footer v-else>\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>\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};\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=64591bd5&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=64591bd5&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 \"64591bd5\",\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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","/**\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 language as defaultLanguage,\n} from '@/utils/defaults';\n\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 if (this.conf) {\n appConfigFile = this.conf.appConfig || {};\n }\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 usersAppConfig.layout = localStorage[localStorageKeys.LAYOUT_ORIENTATION]\n || appConfigFile.layout || defaultLayout;\n usersAppConfig.iconSize = localStorage[localStorageKeys.ICON_SIZE]\n || appConfigFile.iconSize || defaultIconSize;\n usersAppConfig.language = localStorage[localStorageKeys.LANGUAGE]\n || appConfigFile.language || defaultLanguage;\n return usersAppConfig;\n }\n\n /* Page Info */\n pageInfo() {\n const defaults = defaultPageInfo;\n let localPageInfo;\n try {\n localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]);\n } catch (e) {\n localPageInfo = {};\n }\n let filePageInfo = {};\n if (this.conf) {\n filePageInfo = this.conf.pageInfo || {};\n }\n const pi = filePageInfo || defaults; // The page info object to return\n pi.title = localPageInfo.title || filePageInfo.title || defaults.title;\n pi.logo = localPageInfo.logo || filePageInfo.logo || defaults.logo;\n pi.description = localPageInfo.description || filePageInfo.description || defaults.description;\n pi.navLinks = localPageInfo.navLinks || filePageInfo.navLinks || defaults.navLinks;\n pi.footerText = localPageInfo.footerText || filePageInfo.footerText || defaults.footerText;\n return pi;\n }\n\n /* Sections */\n 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) return json;\n } catch (e) {\n // The data in local storage has been malformed, will return conf.sections instead\n }\n }\n // If the function hasn't yet returned, then return the config file sections\n let sectionsFile = [];\n if (this.conf) sectionsFile = this.conf.sections || [];\n return sectionsFile;\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","// 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 fr from '@/assets/locales/fr.json';\n\n// Language data - Add your country name, locale code and imported file here\nexport const languages = [\n {\n name: 'English',\n code: 'en',\n locale: en,\n flag: '🇬🇧',\n },\n {\n name: 'German',\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: 'French',\n code: 'fr',\n locale: fr,\n flag: '🇲🇫',\n },\n // Including:\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\nconst i18nMessages = {};\nlanguages.forEach((lang) => {\n i18nMessages[lang.code] = lang.locale;\n});\nexport const messages = i18nMessages;\n","import ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport { languages } from '@/utils/languages';\nimport {\n visibleComponents,\n localStorageKeys,\n theme as defaultTheme,\n language as defaultLanguage,\n} from '@/utils/defaults';\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 Accumulator.config();\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","/* eslint no-console: [\"error\", { allow: [\"log\"] }] */\n\nexport const welcomeMsg = () => {\n const v = process.env.VUE_APP_VERSION ? `V${process.env.VUE_APP_VERSION}` : '';\n console.log(`%cDashy ${v} 🚀`, 'color:#00af87; background:#0b1021; font-size:36px; padding: 0.5rem 0.5rem 0; margin: 1rem auto; font-family: Rockwell; border: 2px solid #00af87; border-radius: 4px;font-weight: bold; text-shadow: 1px 1px 1px #00af87bf;');\n};\n\nexport const warningMsg = () => {\n console.log('%c⚠ Error ⚠️', \"background:#21bbca; color:#0b1021; font-size:20px; padding:0.25rem 0.5rem; margin: 1rem auto 0.25rem; font-family: 'Trebuchet MS', Helvetica; border: 2px solid yellow; border-radius: 4px; font-weight: bold;\");\n};\n\nexport const raiseBug = () => {\n console.log('%c🐛If you have found a bug, raise an issue on GitHub, at:\\nhttps://git.io/JnqPR', \"color:#dddd10; font-size: 14px; font-family: 'Trebuchet MS', Helvetica;\");\n};\n","<template>\n <div id=\"dashy\">\n <LoadingScreen :isLoading=\"isLoading\" v-if=\"shouldShowSplash()\" />\n <Header :pageInfo=\"pageInfo\" />\n <router-view />\n <Footer :text=\"getFooterText()\" 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 LoadingScreen from '@/components/PageStrcture/LoadingScreen.vue';\nimport { componentVisibility } from '@/utils/ConfigHelpers';\nimport ConfigAccumulator from '@/utils/ConfigAccumalator';\nimport { welcomeMsg } from '@/utils/CoolConsole';\nimport {\n localStorageKeys,\n splashScreenTime,\n visibleComponents as defaultVisibleComponents,\n language as defaultLanguage,\n} from '@/utils/defaults';\n\nconst Accumulator = new ConfigAccumulator();\nconst config = Accumulator.config();\nconst visibleComponents = componentVisibility(config.appConfig) || defaultVisibleComponents;\n\nexport default {\n name: 'app',\n components: {\n Header,\n Footer,\n LoadingScreen,\n },\n provide: {\n config,\n visibleComponents,\n },\n data() {\n return {\n isLoading: true, // Set to false after mount complete\n showFooter: visibleComponents.footer,\n appConfig: Accumulator.appConfig(),\n pageInfo: Accumulator.pageInfo(),\n visibleComponents,\n };\n },\n methods: {\n /* If the user has specified custom text for footer - get it */\n getFooterText() {\n if (this.pageInfo && this.pageInfo.footerText) {\n return this.pageInfo.footerText;\n }\n return '';\n },\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 /* Determine if splash screen should be shown */\n shouldShowSplash() {\n return (this.visibleComponents || defaultVisibleComponents).splashScreen\n || !localStorage[localStorageKeys.HIDE_WELCOME_BANNER];\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 /* Checks local storage, then appConfig, and if a custom language is specified, its applied */\n applyLanguage() {\n let language = defaultLanguage; // Language to apply\n const availibleLocales = this.$i18n.availableLocales; // All available locales\n\n // If user has specified a language, locally or in config, then check and apply it\n const usersLang = localStorage[localStorageKeys.LANGUAGE] || this.appConfig.language;\n if (usersLang && availibleLocales.includes(usersLang)) {\n language = usersLang;\n } else {\n // Otherwise, attempt to apply language automatically, based on their system language\n const usersBorwserLang1 = window.navigator.language || ''; // e.g. en-GB or or ''\n const usersBorwserLang2 = usersBorwserLang1.split('-')[0]; // e.g. en or undefined\n if (availibleLocales.includes(usersBorwserLang1)) {\n language = usersBorwserLang1;\n } else if (availibleLocales.includes(usersBorwserLang2)) {\n language = usersBorwserLang2;\n }\n }\n // Apply Language\n this.$i18n.locale = language;\n document.getElementsByTagName('html')[0].setAttribute('lang', language);\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 }\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--11-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../node_modules/thread-loader/dist/cjs.js!../node_modules/babel-loader/lib/index.js!../node_modules/cache-loader/dist/cjs.js??ref--0-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=2bf20c39&\"\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(),\"sections\":_vm.getSections(_vm.sections),\"appConfig\":_vm.appConfig,\"pageInfo\":_vm.pageInfo,\"modalOpen\":_vm.modalOpen},on:{\"user-is-searchin\":_vm.searching,\"change-display-layout\":_vm.setLayoutOrientation,\"change-icon-size\":_vm.setItemSize,\"change-modal-visibility\":_vm.updateModalVisibility}}),(_vm.checkTheresData(_vm.sections))?_c('div',{class:(\"item-group-container orientation-\" + _vm.layout + \" item-size-\" + _vm.itemSizeBound)},_vm._l((_vm.getSections(_vm.sections)),function(section,index){return _c('ItemGroup',{key:index,class:(_vm.filterTiles(section.items).length === 0 && _vm.searchValue) ? 'no-results' : '',attrs:{\"title\":section.name,\"icon\":section.icon || undefined,\"displayData\":_vm.getDisplayData(section),\"groupId\":(\"section-\" + index),\"items\":_vm.filterTiles(section.items),\"itemSize\":_vm.itemSizeBound},on:{\"itemClicked\":function($event){return _vm.finishedSearching()},\"change-modal-visibility\":_vm.updateModalVisibility}})}),1):_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()],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\",attrs:{\"active\":!_vm.modalOpen},on:{\"user-is-searchin\":_vm.userIsTypingSomething}}):_vm._e(),_c('div',{staticClass:\"options-outer\"},[_c('div',{class:(\"options-container \" + (!_vm.settingsVisible ? 'hide' : ''))},[_c('ThemeSelector',{attrs:{\"externalThemes\":_vm.externalThemes,\"confTheme\":_vm.getInitialTheme(),\"userThemes\":_vm.getUserThemes()},on:{\"modalChanged\":_vm.modalChanged}}),_c('LayoutSelector',{attrs:{\"displayLayout\":_vm.displayLayout},on:{\"layoutUpdated\":_vm.updateDisplayLayout}}),_c('ItemSizeSelector',{attrs:{\"iconSize\":_vm.iconSize},on:{\"iconSizeUpdated\":_vm.updateIconSize}}),_c('ConfigLauncher',{attrs:{\"sections\":_vm.sections,\"pageInfo\":_vm.pageInfo,\"appConfig\":_vm.appConfig},on:{\"modalChanged\":_vm.modalChanged}}),(_vm.isUserLoggedIn())?_c('AppButtons'):_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',[_c('label',{attrs:{\"for\":\"filter-tiles\"}},[_vm._v(_vm._s(_vm.$t('search.search-label')))]),_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.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","<template>\n <form>\n <label for=\"filter-tiles\">{{ $t('search.search-label') }}</label>\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 <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>\n\nimport ArrowKeyNavigation from '@/utils/ArrowKeyNavigation';\nimport { getCustomKeyShortcuts } from '@/utils/ConfigHelpers';\n\nexport default {\n name: 'FilterTile',\n props: {\n active: Boolean,\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 mounted() {\n window.addEventListener('keydown', (event) => {\n const currentElem = document.activeElement.id;\n const { key, keyCode } = event;\n /* If a modal is open, then do nothing */\n if (!this.active) return;\n if (/^[a-zA-Z]$/.test(key) && currentElem !== 'filter-tiles') {\n /* Letter 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 },\n methods: {\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 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 },\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 }\n form {\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 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 //position: absolute;\n color: var(--settings-text-color);\n padding: 0 0.4rem;\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 font-size: 1rem;\n margin: 0.5rem;\n &:hover {\n opacity: 1;\n background: var(--background-darker);\n }\n }\n }\n\n @include tablet {\n form {\n display: block;\n text-align: center;\n }\n }\n @include phone {\n form {\n flex: 1;\n border-radius: 0;\n text-align: center;\n padding: 0.25rem 0;\n display: block;\n }\n }\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=2350dd8e&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=2350dd8e&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 \"2350dd8e\",\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:\"config-options\"},[_c('span',[_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()}}})],1),_c('modal',{attrs:{\"name\":_vm.modalNames.CONF_EDITOR,\"resizable\":true,\"width\":\"60%\",\"height\":\"85%\",\"classes\":\"dashy-modal\"},on:{\"closed\":function($event){return _vm.$emit('modalChanged', false)}}},[_c('ConfigContainer',{attrs:{\"config\":_vm.combineConfig()}})],1),_c('modal',{attrs:{\"name\":_vm.modalNames.LANG_SWITCHER,\"classes\":\"dashy-modal\",\"resizable\":true,\"width\":\"35%\",\"height\":\"35%\"}},[_c('LanguageSwitcher')],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('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(\"Configuration Options\")]),_c('a',{staticClass:\"hyperlink-wrapper\",on:{\"click\":function($event){return _vm.downloadConfigFile('conf.yml', _vm.yaml)}}},[_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 () { 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.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($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',{attrs:{\"config\":_vm.config}})],1),_c('TabItem',{attrs:{\"name\":_vm.$t('cloud-sync.title')}},[_c('CloudBackupRestore',{attrs:{\"config\":_vm.config}})],1),_c('TabItem',{attrs:{\"name\":_vm.$t('config.custom-css-tab')}},[_c('CustomCssEditor',{attrs:{\"config\":_vm.config}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","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","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('div',{staticClass:\"save-options\"},[_c('span',{staticClass:\"save-option-title\"},[_vm._v(_vm._s(_vm.$t('config-editor.save-location-label'))+\":\")]),_c('div',{staticClass:\"option\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.saveMode),expression:\"saveMode\"}],staticClass:\"radio-option\",attrs:{\"type\":\"radio\",\"id\":\"local\",\"value\":\"local\",\"disabled\":!_vm.allowWriteToDisk},domProps:{\"checked\":_vm._q(_vm.saveMode,\"local\")},on:{\"change\":function($event){_vm.saveMode=\"local\"}}}),_c('label',{staticClass:\"save-option-label\",attrs:{\"for\":\"local\"}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.location-local-label'))+\" \")])]),_c('div',{staticClass:\"option\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.saveMode),expression:\"saveMode\"}],staticClass:\"radio-option\",attrs:{\"type\":\"radio\",\"id\":\"file\",\"value\":\"file\",\"disabled\":!_vm.allowWriteToDisk},domProps:{\"checked\":_vm._q(_vm.saveMode,\"file\")},on:{\"change\":function($event){_vm.saveMode=\"file\"}}}),_c('label',{staticClass:\"save-option-label\",attrs:{\"for\":\"file\"}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.location-disk-label'))+\" \")])])]),_c('button',{class:(\"save-button \" + (!_vm.isValid ? 'err' : '')),on:{\"click\":function($event){return _vm.save()}}},[_vm._v(\" \"+_vm._s(_vm.$t('config-editor.save-button'))+\" \")]),_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(),_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._s(_vm.$t('config-editor.success-note-l3'))+\" \")]):_vm._e(),_c('p',{staticClass:\"note\"},[_vm._v(_vm._s(_vm.$t('config.backup-note')))])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import sha256 from 'crypto-js/sha256';\nimport { cookieKeys, localStorageKeys } from './defaults';\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 = (users) => {\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/**\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 * 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 = (users) => {\n if (!users || users.length === 0) return true; // Authentication not setup\n if (!isLoggedIn(users)) 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","<template>\n <div class=\"json-editor-outer\">\n <!-- Main JSON editor -->\n <v-jsoneditor\n v-model=\"jsonData\"\n :options=\"options\"\n />\n <!-- Options raido, and save button -->\n <div class=\"save-options\">\n <span class=\"save-option-title\">{{ $t('config-editor.save-location-label') }}:</span>\n <div class=\"option\">\n <input type=\"radio\" id=\"local\" value=\"local\"\n v-model=\"saveMode\" class=\"radio-option\" :disabled=\"!allowWriteToDisk\" />\n <label for=\"local\" class=\"save-option-label\">\n {{ $t('config-editor.location-local-label') }}\n </label>\n </div>\n <div class=\"option\">\n <input type=\"radio\" id=\"file\" value=\"file\" v-model=\"saveMode\" class=\"radio-option\"\n :disabled=\"!allowWriteToDisk\" />\n <label for=\"file\" class=\"save-option-label\">\n {{ $t('config-editor.location-disk-label') }}\n </label>\n </div>\n </div>\n <button :class=\"`save-button ${!isValid ? 'err' : ''}`\" @click=\"save()\">\n {{ $t('config-editor.save-button') }}\n </button>\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 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 {{ $t('config-editor.success-note-l3') }}\n </p>\n <p class=\"note\">{{ $t('config.backup-note') }}</p>\n </div>\n</template>\n\n<script>\n\nimport axios from 'axios';\nimport VJsoneditor from 'v-jsoneditor';\nimport { localStorageKeys } from '@/utils/defaults';\nimport configSchema from '@/utils/ConfigSchema.json';\nimport JsonToYaml from '@/utils/JsonToYaml';\nimport { isUserAdmin } from '@/utils/Auth';\n\nexport default {\n name: 'JsonEditor',\n props: {\n config: Object,\n },\n components: {\n VJsoneditor,\n },\n data() {\n return {\n jsonData: this.config,\n errorMessages: [],\n saveMode: 'file',\n options: {\n schema: configSchema,\n mode: 'tree',\n modes: ['tree', 'code', 'preview'],\n name: 'config',\n onValidationError: this.validationErrors,\n },\n jsonParser: JsonToYaml,\n responseText: '',\n saveSuccess: undefined,\n allowWriteToDisk: this.shouldAllowWriteToDisk(),\n };\n },\n computed: {\n isValid() {\n return this.errorMessages.length < 1;\n },\n },\n mounted() {\n if (!this.allowWriteToDisk) this.saveMode = 'local';\n },\n methods: {\n shouldAllowWriteToDisk() {\n const { appConfig } = this.config;\n return appConfig.allowConfigEdit !== false && isUserAdmin(appConfig.auth);\n },\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 writeConfigToDisk() {\n // 1. Convert JSON into YAML\n const yaml = this.jsonParser(this.jsonData);\n // 2. Prepare the request\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const endpoint = `${baseUrl}/config-manager/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 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 })\n .catch((error) => {\n this.saveSuccess = false;\n this.responseText = error;\n this.showToast(error, false);\n });\n },\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 this.showToast(this.$t('config-editor.success-msg-local'), true);\n },\n carefullyClearLocalStorage() {\n localStorage.removeItem(localStorageKeys.PAGE_INFO);\n localStorage.removeItem(localStorageKeys.APP_CONFIG);\n localStorage.removeItem(localStorageKeys.CONF_SECTIONS);\n },\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 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\nbutton.save-button {\n padding: 0.5rem 1rem;\n margin: 0.25rem auto;\n font-size: 1.2rem;\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 cursor: pointer;\n &:hover {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-color: var(--config-settings-color);\n }\n &.err {\n opacity: 0.8;\n cursor: default;\n &:hover {\n background: var(--config-settings-color);\n color: var(--config-settings-background);\n border-color: var(--danger);\n }\n }\n}\n\ndiv.save-options {\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 0.5rem;\n margin-bottom: 0.5rem;\n background: var(--code-editor-background);\n color: var(--code-editor-color);\n border-top: 2px solid var(--config-settings-background);\n @include tablet-down { flex-direction: column; }\n .option {\n @include tablet-up { margin-left: 2rem; }\n }\n span.save-option-title {\n cursor: default;\n }\n input.radio-option {\n cursor: pointer;\n }\n label.save-option-label {\n cursor: pointer;\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=e01218b8&\"\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('prism-editor',{staticClass:\"my-editor\",attrs:{\"highlight\":_vm.highlighter,\"line-numbers\":\"\"},model:{value:(_vm.customCss),callback:function ($$v) {_vm.customCss=$$v},expression:\"customCss\"}}),_c('button',{staticClass:\"save-button\",on:{\"click\":function($event){return _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'))+\" \")]),_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',{staticClass:\"misc-input\",attrs:{\"id\":(\"color-input-\" + colorName)},domProps:{\"value\":_vm.customColors[colorName]},on:{\"input\":function($event){return _vm.setVariable(colorName, _vm.customColors[colorName])}}})],1)}),0),_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 show-all-vars-btn\",on:{\"click\":_vm.resetAndSave}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.reset-button'))+\" '\"+_vm._s(_vm.themeToEdit)+\"' \")]),_c('p',{staticClass:\"action-text-btn\",on:{\"click\":_vm.findAllVariableNames}},[_vm._v(\" \"+_vm._s(_vm.$t('theme-maker.show-all-button'))+\" \")]),_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 }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{class:_vm.disallow ? 'disallowed': '',attrs:{\"disabled\":_vm.disabled},on:{\"click\":function($event){return _vm.click()}}},[_vm._t(\"default\"),_vm._t(\"text\"),_vm._t(\"icon\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <button @click=\"click()\" :disabled=\"disabled\" :class=\"disallow ? 'disallowed': ''\">\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,\n click: Function,\n disabled: Boolean,\n disallow: Boolean,\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=ec408f00&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=ec408f00&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 \"ec408f00\",\n null\n \n)\n\nexport default component.exports","<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 <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 :value=\"customColors[colorName]\"\n class=\"misc-input\"\n @input=\"setVariable(colorName, customColors[colorName])\"\n />\n </div> <!-- End of color list -->\n </div>\n <p @click=\"exportToClipboard\" class=\"action-text-btn\">\n {{ $t('theme-maker.export-button') }}\n </p>\n <p @click=\"resetAndSave\" class=\"action-text-btn show-all-vars-btn\">\n {{ $t('theme-maker.reset-button') }} '{{ themeToEdit }}'\n </p>\n <p @click=\"findAllVariableNames\" class=\"action-text-btn\">\n {{ $t('theme-maker.show-all-button') }}\n </p>\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 { localStorageKeys, mainCssVars, swatches } from '@/utils/defaults';\n\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 /* Saves the users omdified variables in local storage */\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.$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 /* 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'\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 const hexToRgb = (hex) => {\n const colorParts = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\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 const getLightness = (rgb) => (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\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 '--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 },\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: 28rem;\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: 16rem;\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 }\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=57ccdb6d&\"\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","<template>\n <div class=\"css-editor-outer\">\n <prism-editor class=\"my-editor\" v-model=\"customCss\" :highlight=\"highlighter\" line-numbers />\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 <CustomThemeMaker :themeToEdit=\"currentTheme\" class=\"color-config\" />\n </div>\n</template>\n\n<script>\n\nimport { PrismEditor } from 'vue-prism-editor';\nimport { highlight, languages } from 'prismjs/components/prism-core';\nimport 'prismjs/components/prism-css';\nimport 'prismjs/themes/prism-funky.css';\nimport 'vue-prism-editor/dist/prismeditor.min.css';\n\nimport CustomThemeMaker from '@/components/Settings/CustomThemeMaker';\nimport { getTheme } from '@/utils/ConfigHelpers';\nimport { localStorageKeys } from '@/utils/defaults';\n\nexport default {\n name: 'JsonEditor',\n props: {\n config: Object,\n },\n components: {\n CustomThemeMaker,\n PrismEditor,\n },\n data() {\n return {\n customCss: this.config.appConfig.customCss || '\\n\\n\\n\\n\\n',\n currentTheme: getTheme(),\n };\n },\n methods: {\n validate(css) {\n return css === '' || css.match(/((?:^\\s*)([\\w#.@*,:\\-.:>,*\\s]+)\\s*{(?:[\\s]*)((?:[A-Za-z\\- \\s]+[:]\\s*['\"0-9\\w .,/()\\-!%]+;?)*)*\\s*}(?:\\s*))/gmi);\n },\n save() {\n let msg = '';\n if (this.validate(this.customCss)) {\n const appConfig = { ...this.config.appConfig };\n appConfig.customCss = this.customCss;\n localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(appConfig));\n msg = 'Changes saved succesfully';\n this.inject(this.customCss);\n if (this.customCss === '') setTimeout(() => { location.reload(); }, 1500); // eslint-disable-line no-restricted-globals\n } else {\n msg = 'Error - Invalid CSS';\n }\n this.$toasted.show(msg);\n },\n inject(userStyles) {\n const cleanedCss = userStyles.replace(/<\\/?[^>]+(>|$)/g, '');\n const style = document.createElement('style');\n style.textContent = cleanedCss;\n document.head.append(style);\n },\n highlighter(code) {\n return highlight(code, languages.css);\n },\n },\n};\n</script>\n\n<style lang=\"scss\">\n\ndiv.css-editor-outer {\n text-align: center;\n padding-bottom: 1rem;\n}\n\nbutton.save-button {\n padding: 0.5rem 1rem;\n margin: 0.25rem auto;\n font-size: 1.2rem;\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 cursor: pointer;\n &:hover {\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n border-color: var(--config-settings-color);\n }\n}\n\n.prism-editor-wrapper {\n min-height: 200px;\n border: 1px solid var(--transparent-70);\n border-radius: var(--curve-factor);\n width: 90%;\n margin: 0.5rem auto;\n background: var(--transparent-50);\n}\n\np.quick-note {\n text-align: left;\n width: 80%;\n margin: 1rem auto;\n padding: 0.5rem;\n border-radius: var(--curve-factor);\n}\n\n.color-config.theme-configurator-wrapper {\n border: 1px solid var(--config-settings-color);\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n position: relative;\n width: 80%;\n max-width: 24rem;\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}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=6b7430c0&\"\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},scopedSlots:_vm._u([{key:\"text\",fn:function(){return [_vm._v(\" \"+_vm._s(_vm.backupId ? _vm.$t('cloud-sync.backup-button-update') : _vm.$t('cloud-sync.backup-button-setup'))+\" \")]},proxy:true},{key:\"icon\",fn:function(){return [_c('IconBackup')]},proxy:true}])}),(_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},scopedSlots:_vm._u([{key:\"text\",fn:function(){return [_vm._v(_vm._s(_vm.$t('cloud-sync.restore-button')))]},proxy:true},{key:\"icon\",fn:function(){return [_c('IconRestore')]},proxy:true}])})],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',{attrs:{\"for\":\"name\"}},[_vm._v(_vm._s(_vm.label))]):_vm._e(),_c('input',{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)}}})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`input-container ${layout}`\">\n <label v-if=\"label\" for=\"name\">{{label}}</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 />\n </div>\n</template>\n\n<script>\n\nexport default {\n name: 'Input',\n props: {\n value: String, // 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 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\">\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 flex-direction: row;\n justify-content: space-between;\n label { margin-right: 0.25rem; }\n }\n\n input {\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\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=5df13ed2&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=5df13ed2&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 \"5df13ed2\",\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 <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 <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 <template v-slot:text>\n {{backupId\n ? $t('cloud-sync.backup-button-update') : $t('cloud-sync.backup-button-setup')}}\n </template>\n <template v-slot:icon><IconBackup /></template>\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 <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 <template v-slot:text>{{ $t('cloud-sync.restore-button') }}</template>\n <template v-slot:icon><IconRestore /></template>\n </Button>\n </div>\n </div>\n</template>\n\n<script>\n\nimport sha256 from 'crypto-js/sha256';\nimport Button from '@/components/FormElements/Button';\nimport Input from '@/components/FormElements/Input';\nimport IconBackup from '@/assets/interface-icons/config-backup.svg';\nimport IconRestore from '@/assets/interface-icons/config-restore.svg';\nimport { backup, update, restore } from '@/utils/CloudBackup';\nimport { localStorageKeys } from '@/utils/defaults';\n\nexport default {\n name: 'CloudBackupRestore',\n props: {\n config: Object,\n },\n data() {\n return {\n backupPassword: '',\n restorePassword: '',\n restoreCode: '',\n backupId: localStorage[localStorageKeys.BACKUP_ID] || '',\n };\n },\n components: {\n Button,\n Input,\n IconBackup,\n IconRestore,\n },\n methods: {\n restoreBackup() {\n restore(this.restoreCode, this.restorePassword)\n .then((response) => {\n this.restoreFromBackup(response, this.restoreCode);\n }).catch((msg) => {\n this.showErrorMsg(msg);\n });\n },\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 makeBackup() {\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 }).catch(() => {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-unknown'));\n });\n },\n makeUpdate() {\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 }).catch(() => {\n this.showErrorMsg(this.$t('cloud-sync.backup-error-unknown'));\n });\n },\n restoreFromBackup(config, backupId) {\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 this.setBackupIdLocally(backupId, this.restorePassword);\n this.showSuccessMsg(this.$t('cloud-sync.restore-success-msg'));\n setTimeout(() => { location.reload(); }, 1500); // eslint-disable-line no-restricted-globals\n },\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 showErrorMsg(errorMsg) {\n this.$toasted.show(errorMsg, { className: 'toast-error' });\n },\n showSuccessMsg(msg) {\n this.$toasted.show(msg, { className: 'toast-success' });\n },\n makeHash(pass) {\n return sha256(pass).toString();\n },\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-direction: row;\n flex-wrap: wrap;\n text-align: center;\n overflow: auto;\n height: 100%;\n background: var(--config-settings-background);\n color: var(--config-settings-color);\n @extend .scroll-bar;\n\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 &:first-child {\n border-bottom: 1px dashed var(--config-settings-color);\n }\n &.intro {\n width: 100%;\n height: fit-content;\n a {\n color: var(--config-settings-color);\n }\n }\n }\n\n h2 { font-size: 2rem; }\n 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\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(--config-settings-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(--config-settings-color);\n border: 1px solid var(--config-settings-color);\n background: none;\n width: 16rem;\n }\n input:focus {\n box-shadow: 1px 1px 6px var(--config-settings-color);\n }\n button:hover {\n color: var(--config-settings-background);\n border: 1px solid var(--config-settings-background);\n background: var(--config-settings-color);\n }\n h2, h3 {\n margin: 1rem;\n }\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=cdf206ac&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=cdf206ac&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 \"cdf206ac\",\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 Button from '@/components/FormElements/Button';\nimport { modalNames } from '@/utils/defaults';\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';\n\nexport default {\n name: 'RebuildApp',\n inject: ['config'],\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 }),\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}/config-manager/rebuild`;\n this.loading = true;\n axios.get(endpoint)\n .then((response) => {\n this.finished(response.data || false);\n })\n .catch((error) => {\n this.finished({ success: false, error });\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.config) {\n if (this.config.appConfig) {\n if (this.config.appConfig.allowConfigEdit === false) {\n this.allowRebuild = false;\n }\n }\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=306fcc3a&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=306fcc3a&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 \"306fcc3a\",\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:\"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-2'))+\" \"+_vm._s(_vm.latestVersion)+\" \")])]):_vm._e()]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"app-version\">\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-2') }} {{ latestVersion }}\n </span>\n </p>\n </div>\n </div>\n</template>\n\n<script>\nimport axios from 'axios';\n\nexport default {\n name: 'AppInfoModal',\n inject: ['config'],\n data() {\n return {\n appVersion: process.env.VUE_APP_VERSION, // Current version, from package.json\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 const appConfig = this.config.appConfig || {};\n if (!this.appVersion || (appConfig && 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 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 }\n }).catch(() => {\n this.error = true;\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 },\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=49d7ffdf&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=49d7ffdf&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 \"49d7ffdf\",\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>Configuration Options</h2>\n <a class=\"hyperlink-wrapper\" @click=\"downloadConfigFile('conf.yml', yaml)\">\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=\"() => 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=\"openLanguageSwitchModal()\">\n <LanguageIcon class=\"button-icon\"/>\n {{ $t('config.change-language-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 :config=\"config\" />\n </TabItem>\n <TabItem :name=\"$t('cloud-sync.title')\">\n <CloudBackupRestore :config=\"config\" />\n </TabItem>\n <TabItem :name=\"$t('config.custom-css-tab')\">\n <CustomCssEditor :config=\"config\" />\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 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 copyConfigToClipboard() {\n navigator.clipboard.writeText(this.jsonParser(this.config));\n this.$toasted.show(this.$t('config.data-copied-msg'));\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 setTimeout(() => {\n location.reload(true); // eslint-disable-line no-restricted-globals\n }, 1900);\n }\n },\n /* Generates a new file, with the YAML contents, and triggers a download */\n downloadConfigFile(filename, filecontents) {\n const element = document.createElement('a');\n element.setAttribute('href', `data:text/plain;charset=utf-8, ${encodeURIComponent(filecontents)}`);\n element.setAttribute('download', filename);\n element.style.display = 'none';\n document.body.appendChild(element);\n element.click();\n document.body.removeChild(element);\n },\n getLanguage() {\n const lang = getUsersLanguage();\n return lang ? `${lang.flag} ${lang.name}` : '';\n },\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% - 4rem);\n width: fit-content;\n margin: 0 auto;\n padding: 2rem 1rem;\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=1360f75f&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=1360f75f&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 \"1360f75f\",\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.availibleLanguages,\"label\":\"name\",\"input\":_vm.setLangLocally()},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',[_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=\"availibleLanguages\"\n class=\"language-dropdown\"\n label=\"name\"\n :input=\"setLangLocally()\"\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\">{{ language.flag }} {{ language.name }}</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 { languages } from '@/utils/languages';\nimport SaveConfigIcon from '@/assets/interface-icons/save-config.svg';\nimport { localStorageKeys, modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'LanguageSwitcher',\n inject: ['config'],\n components: {\n Button,\n SaveConfigIcon,\n },\n data() {\n return {\n availibleLanguages: languages,\n language: '',\n modalName: modalNames.LANG_SWITCHER,\n };\n },\n methods: {\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.setLangLocally();\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 }\n },\n /* Check language is supported, before saving */\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 setLangLocally() {\n if (this.language && this.language.code) {\n this.$i18n.locale = this.language.code;\n }\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\n h3.title {\n text-align: center;\n }\n p.intro {\n margin: 0;\n }\n\n button.save-button {\n margin: 0 auto;\n width: 100%;\n }\n\n p.sad-times {\n color: var(--warning);\n text-align: center;\n }\n\n .language-dropdown {\n margin: 1rem auto;\n div.vs__dropdown-toggle {\n padding: 0.2rem 0;\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=631f0843&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=631f0843&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 \"631f0843\",\n null\n \n)\n\nexport default component.exports","<template>\n <div class=\"config-options\">\n <!-- Button and label -->\n <span>{{ $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 </div>\n\n <!-- Modal containing all the configuration options -->\n <modal :name=\"modalNames.CONF_EDITOR\" :resizable=\"true\" width=\"60%\" height=\"85%\"\n @closed=\"$emit('modalChanged', false)\" 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=\"35%\">\n <LanguageSwitcher />\n </modal>\n\n </div>\n</template>\n\n<script>\n\nimport IconSpanner from '@/assets/interface-icons/config-editor.svg';\nimport ConfigContainer from '@/components/Configuration/ConfigContainer';\nimport LanguageSwitcher from '@/components/Settings/LanguageSwitcher';\nimport { topLevelConfKeys, localStorageKeys, modalNames } from '@/utils/defaults';\n\nexport default {\n name: 'ConfigLauncher',\n data() {\n return {\n modalNames,\n };\n },\n components: {\n IconSpanner,\n ConfigContainer,\n LanguageSwitcher,\n },\n props: {\n sections: Array,\n pageInfo: Object,\n appConfig: Object,\n },\n methods: {\n showEditor: function show() {\n // TODO: If users first time, then show note explaining that config is only stored locally\n this.$modal.show(modalNames.CONF_EDITOR);\n this.$emit('modalChanged', true);\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 },\n};\n</script>\n\n<style scoped lang=\"scss\">\n.config-options {\n display: flex;\n flex-direction: column;\n color: var(--settings-text-color);\n min-width: 3.2rem;\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</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=785e1d43&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=785e1d43&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 \"785e1d43\",\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,\"tabindex\":-2},model:{value:(_vm.selectedTheme),callback:function ($$v) {_vm.selectedTheme=$$v},expression:\"selectedTheme\"}})],1),_c('IconPalette',{staticClass:\"color-button\",on:{\"click\":_vm.openThemeConfigurator}}),(_vm.themeConfiguratorOpen)?_c('CustomThemeMaker',{attrs:{\"themeToEdit\":_vm.selectedTheme},on:{\"closeThemeConfigurator\":function($event){return _vm.closeThemeConfigurator()}}}):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","/* eslint no-console: [\"error\", { allow: [\"warn\", \"error\"] }] */\n\nimport { warningMsg, raiseBug } from '@/utils/CoolConsole';\n\n/**\n * Function called when an error happens\n * If you wish to use an error logging service, put code for it here\n */\nconst ErrorHandler = function handler(msg) {\n warningMsg();\n console.warn(msg);\n raiseBug();\n};\n\nexport default ErrorHandler;\n","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 class=\"theme-dropdown\"\n :tabindex=\"-2\"\n />\n </div>\n <IconPalette\n class=\"color-button\"\n @click=\"openThemeConfigurator\"\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 IconPalette from '@/assets/interface-icons/config-color-palette.svg';\n\nexport default {\n name: 'ThemeSelector',\n props: {\n externalThemes: Object,\n confTheme: String,\n userThemes: Array,\n },\n components: {\n CustomThemeMaker,\n IconPalette,\n },\n watch: {\n /* When the theme changes, then call the update method */\n selectedTheme(newTheme) {\n this.updateTheme(newTheme);\n },\n },\n data() {\n return {\n selectedTheme: this.getInitialTheme(),\n builtInThemes: [...Defaults.builtInThemes, ...this.userThemes],\n themeHelper: new LoadExternalTheme(),\n themeConfiguratorOpen: false, // Control the opening of theme config popup\n ApplyLocalTheme,\n ApplyCustomVariables,\n };\n },\n computed: {\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, ...this.builtInThemes, ...specialThemes];\n },\n },\n created() {\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(this.selectedTheme)) {\n this.updateTheme(this.selectedTheme);\n // If it's an external stylesheet, then wait for promise to resolve\n } else if (this.selectedTheme !== Defaults.theme) {\n Promise.all(added).then(() => {\n this.updateTheme(this.selectedTheme);\n });\n }\n },\n methods: {\n /* Get default theme */\n getInitialTheme() {\n return localStorage[localStorageKeys.THEME] || this.confTheme || Defaults.theme;\n },\n /* Determines if a given theme is local / not a custom user stylesheet */\n isThemeLocal(themeToCheck) {\n return this.builtInThemes.includes(themeToCheck);\n },\n /* Opens the theme color configurator popup */\n openThemeConfigurator() {\n this.$emit('modalChanged', true);\n this.themeConfiguratorOpen = true;\n },\n /* Closes the theme color configurator popup */\n closeThemeConfigurator() {\n // this.$emit('modalChanged', false);\n this.themeConfiguratorOpen = false;\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: 5;\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 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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=ce625fe4&\"\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","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 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 data() {\n return {\n input: '',\n };\n },\n props: {\n displayLayout: String,\n },\n components: {\n IconDeafault,\n IconHorizontal,\n IconVertical,\n },\n methods: {\n updateDisplayLayout(layout) {\n this.$emit('layoutUpdated', 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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=b3a6111c&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=b3a6111c&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 \"b3a6111c\",\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 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.$emit('iconSizeUpdated', 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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=1ff45660&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=1ff45660&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 \"1ff45660\",\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',{staticClass:\"display-options\"},[_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()}}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div>\n <div class=\"display-options\">\n <IconLogout @click=\"logout()\" v-tooltip=\"tooltip($t('settings.sign-out-tooltip'))\"\n class=\"layout-icon\" tabindex=\"-2\" />\n </div>\n </div>\n</template>\n\n<script>\nimport { logout as registerLogout } from '@/utils/Auth';\nimport IconLogout from '@/assets/interface-icons/user-logout.svg';\n\nexport default {\n name: 'AppButtons',\n components: {\n IconLogout,\n },\n methods: {\n logout() {\n registerLogout();\n this.$toasted.show(this.$t('login.logout-message'));\n setTimeout(() => {\n location.reload(true); // eslint-disable-line no-restricted-globals\n }, 500);\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppButtons.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppButtons.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AppButtons.vue?vue&type=template&id=57c401c7&scoped=true&\"\nimport script from \"./AppButtons.vue?vue&type=script&lang=js&\"\nexport * from \"./AppButtons.vue?vue&type=script&lang=js&\"\nimport style0 from \"./AppButtons.vue?vue&type=style&index=0&id=57c401c7&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 \"57c401c7\",\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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\":\"40%\",\"height\":\"60%\",\"classes\":\"dashy-modal\"}},[_c('div',{staticClass:\"about-modal\"},[_c('router-link',{attrs:{\"to\":\"/about\"}},[_c('h2',[_vm._v(\"Dashy\")])]),_c('AppVersion'),_c('h3',[_vm._v(\"Service Worker Status\")]),_c('code',{domProps:{\"innerHTML\":_vm._s(_vm.serviceWorkerInfo)}},[_vm._v(_vm._s(_vm.serviceWorkerInfo))]),_c('br'),_c('h3',[_vm._v(\"Config Validation Status\")]),_c('code',[_vm._v(_vm._s(_vm.getIsConfigValidStatus()))]),_c('br'),_c('h3',[_vm._v(\"Help & Support\")]),_c('ul',[_c('li',[_c('a',{attrs:{\"href\":\"https://git.io/JnqPR\"}},[_vm._v(\"Report a Bug\")])]),_c('li',[_c('a',{attrs:{\"href\":\"https://git.io/JnDxL\"}},[_vm._v(\"Request a Feature\")])]),_c('li',[_c('a',{attrs:{\"href\":\"https://git.io/JnDxs\"}},[_vm._v(\"Ask a Question\")])]),_c('li',[_c('a',{attrs:{\"href\":\"https://git.io/JnDxn\"}},[_vm._v(\"Leave Feedback\")])]),_c('li',[_c('a',{attrs:{\"href\":\"https://github.com/Lissy93/dashy/discussions\"}},[_vm._v(\"Join the Discussion\")])])]),_c('p',{staticClass:\"small-note\"},[_vm._v(\"Please include the following info in your bug report:\")]),_c('a',{on:{\"click\":function($event){_vm.showInfo = !_vm.showInfo}}},[_vm._v(_vm._s(_vm.showInfo ? 'Hide' : 'Show')+\" system info\")]),(_vm.showInfo)?_c('div',{staticClass:\"system-info\"},[_c('h4',[_vm._v(\"System Info\")]),_c('code',[_c('b',[_vm._v(\"Dashy Version:\")]),_vm._v(\" V \"+_vm._s(_vm.appVersion))]),_c('br'),_c('code',[_c('b',[_vm._v(\"Browser:\")]),_vm._v(\" \"+_vm._s(_vm.systemInfo.browser))]),_c('br'),_c('code',[_c('b',[_vm._v(\"Is Mobile?\")]),_vm._v(\" \"+_vm._s(_vm.systemInfo.isMobile ? 'Yes' : 'No'))]),_c('br'),_c('code',[_c('b',[_vm._v(\"OS:\")]),_vm._v(\" \"+_vm._s(_vm.systemInfo.os))]),_c('br')]):_vm._e(),_c('h3',[_vm._v(\"About\")]),_c('p',{staticClass:\"about-text\"},[_vm._v(\" Documentation and Source Code available on \"),_c('a',{attrs:{\"href\":\"https://github.com/lissy93/dashy\"}},[_vm._v(\"GitHub\")])]),_c('h3',[_vm._v(\"License\")]),_c('code',[_vm._v(\"Licensed under MIT X11. Copyright © 2021\")])],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <modal :name=\"modalName\" :resizable=\"true\" width=\"40%\" height=\"60%\" classes=\"dashy-modal\">\n <div class=\"about-modal\">\n <router-link to=\"/about\">\n <h2>Dashy</h2>\n </router-link>\n <AppVersion />\n <h3>Service Worker Status</h3>\n <code v-html=\"serviceWorkerInfo\">{{ serviceWorkerInfo }}</code>\n <br>\n <h3>Config Validation Status</h3>\n <code>{{getIsConfigValidStatus()}}</code>\n <br>\n <h3>Help & Support</h3>\n <ul>\n <li><a href=\"https://git.io/JnqPR\">Report a Bug</a></li>\n <li><a href=\"https://git.io/JnDxL\">Request a Feature</a></li>\n <li><a href=\"https://git.io/JnDxs\">Ask a Question</a></li>\n <li><a href=\"https://git.io/JnDxn\">Leave Feedback</a></li>\n <li><a href=\"https://github.com/Lissy93/dashy/discussions\">Join the Discussion</a></li>\n </ul>\n <p class=\"small-note\">Please include the following info in your bug report:</p>\n <a @click=\"showInfo = !showInfo\">{{ showInfo ? 'Hide' : 'Show'}} system info</a>\n <div class=\"system-info\" v-if=\"showInfo\">\n <h4>System Info</h4>\n <code><b>Dashy Version:</b> V {{appVersion}}</code><br>\n <code><b>Browser:</b> {{systemInfo.browser}}</code><br>\n <code><b>Is Mobile?</b> {{systemInfo.isMobile ? 'Yes' : 'No'}}</code><br>\n <code><b>OS:</b> {{systemInfo.os}}</code><br>\n </div>\n <h3>About</h3>\n <p class=\"about-text\">\n Documentation and Source Code available on\n <a href=\"https://github.com/lissy93/dashy\">GitHub</a>\n </p>\n <h3>License</h3>\n <code>Licensed under MIT X11. Copyright © 2021</code>\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 systemInfo: this.getSystemInfo(),\n serviceWorkerInfo: 'Checking...',\n showInfo: false,\n };\n },\n mounted() {\n setTimeout(() => {\n this.serviceWorkerInfo = this.getSwStatus();\n }, 100);\n },\n methods: {\n getIsConfigValidStatus() {\n const isValidVar = process.env.VUE_APP_CONFIG_VALID;\n if (isValidVar === undefined) return 'Config validation status is missing';\n return `Config is ${isValidVar ? 'Valid' : 'Invalid'}`;\n },\n getSwStatus() {\n const sessionData = sessionStorage[sessionStorageKeys.SW_STATUS];\n const swInfo = sessionData ? JSON.parse(sessionData) : {};\n let swStatus = '';\n if (swInfo.registered) swStatus += 'Service worker registered<br>';\n if (swInfo.ready) swStatus += 'Dashy is being served from service worker<br>';\n if (swInfo.cached) swStatus += 'Content has been cached for offline use<br>';\n if (swInfo.updateFound) swStatus += 'New content is downloading<br>';\n if (swInfo.updated) swStatus += 'New content is available; please refresh<br>';\n if (swInfo.offline) swStatus += 'No internet connection found. App is running in offline mode<br>';\n if (swInfo.error) swStatus += 'Error during service worker registration<br>';\n if (swInfo.devMode) swStatus += 'App running in dev mode, no need for service worker<br>';\n if (swStatus.length === 0) swStatus += 'No service worker info available';\n return swStatus;\n },\n getSystemInfo() {\n const { userAgent } = navigator;\n\n // Find Operating System\n let os = 'Unknown';\n if (userAgent.indexOf('Win') !== -1) os = 'Windows';\n else if (userAgent.indexOf('Mac') !== -1) os = 'MacOS';\n else if (userAgent.indexOf('Android') !== -1) os = 'Android';\n else if (userAgent.indexOf('iPhone') !== -1) os = 'iOS';\n else if (userAgent.indexOf('Linux') !== -1) os = 'Linux';\n else if (userAgent.indexOf('X11') !== -1) os = 'UNIX';\n\n // Find Browser\n let browser = 'Unknown';\n if (userAgent.indexOf('Opera') !== -1) browser = 'Opera';\n else if (userAgent.indexOf('Chrome') !== -1) browser = 'Chrome';\n else if (userAgent.indexOf('Safari') !== -1) browser = 'Safari';\n else if (userAgent.indexOf('Firefox') !== -1) browser = 'Firefox';\n else if (userAgent.indexOf('MSIE') !== -1) browser = 'IE';\n else browser = 'Unknown';\n\n const isMobile = !!navigator.userAgent.match(/iphone|android|blackberry/ig) || false;\n\n return {\n os,\n browser,\n userAgent,\n isMobile,\n };\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\ndiv.about-modal {\n background: var(--about-page-background);\n color: var(--about-page-color);\n padding: 1rem;\n height: 100%;\n hr {\n border-color: var(--about-page-accent);\n }\n h2 {\n text-decoration: none;\n font-size: 1.8rem;\n text-align: center;\n margin: 0.2rem;\n }\n h3 {\n font-size: 1.3rem;\n margin: 0.75rem 0 0.2rem 0;\n color: var(--about-page-accent);\n }\n p.small-note {\n font-size: 0.9rem;\n margin: 0.2rem 0;\n }\n p.about-text {\n margin: 0.2rem 0;\n }\n a {\n color: var(--about-page-accent);\n }\n ul {\n margin-top: 0.2rem;\n }\n .system-info {\n font-size: 0.8rem;\n background: var(--black);\n color: var(--white);\n border-radius: var(--curve-factor-small);\n padding: 0.5rem;\n border: 1px solid var(--white);\n width: fit-content;\n h4 {\n font-size: 0.8rem;\n margin: 0 0 0.2rem 0;\n text-decoration: underline;\n }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=77ccbcae&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=77ccbcae&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 \"77ccbcae\",\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 :active=\"!modalOpen\"\n />\n <div class=\"options-outer\">\n <div :class=\"`options-container ${!settingsVisible ? 'hide' : ''}`\">\n <ThemeSelector :externalThemes=\"externalThemes\" @modalChanged=\"modalChanged\"\n :confTheme=\"getInitialTheme()\" :userThemes=\"getUserThemes()\" />\n <LayoutSelector :displayLayout=\"displayLayout\" @layoutUpdated=\"updateDisplayLayout\"/>\n <ItemSizeSelector :iconSize=\"iconSize\" @iconSizeUpdated=\"updateIconSize\" />\n <ConfigLauncher :sections=\"sections\" :pageInfo=\"pageInfo\" :appConfig=\"appConfig\"\n @modalChanged=\"modalChanged\" />\n <AppButtons v-if=\"isUserLoggedIn()\" />\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 AppButtons from '@/components/Settings/AppButtons';\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\nexport default {\n name: 'SettingsContainer',\n props: {\n displayLayout: String,\n iconSize: String,\n externalThemes: Object,\n appConfig: Object,\n pageInfo: Object,\n sections: Array,\n modalOpen: Boolean,\n },\n components: {\n SearchBar,\n ConfigLauncher,\n ThemeSelector,\n LayoutSelector,\n ItemSizeSelector,\n AppButtons,\n KeyboardShortcutInfo,\n AppInfoModal,\n IconOpen,\n IconClose,\n },\n inject: ['visibleComponents'],\n methods: {\n userIsTypingSomething(something) {\n this.$emit('user-is-searchin', something);\n },\n clearFilterInput() {\n this.$refs.SearchBar.clearFilterInput();\n },\n updateDisplayLayout(layout) {\n this.$emit('change-display-layout', layout);\n },\n updateIconSize(iconSize) {\n this.$emit('change-icon-size', iconSize);\n },\n modalChanged(changedTo) {\n this.$emit('change-modal-visibility', changedTo);\n },\n getInitialTheme() {\n return this.appConfig.theme || '';\n },\n isUserLoggedIn() {\n return !!localStorage[localStorageKeys.USERNAME];\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 return JSON.parse(localStorage[localStorageKeys.HIDE_SETTINGS]\n || (this.visibleComponents || defaultVisibleComponents).settings);\n },\n },\n data() {\n return {\n settingsVisible: this.getSettingsVisibility(),\n searchVisible: (this.visibleComponents || defaultVisibleComponents).searchBar,\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 }\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=25781e16&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=25781e16&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 \"25781e16\",\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}},[(!_vm.items || _vm.items.length < 1)?_c('div',{staticClass:\"no-items\"},[_vm._v(\" No Items to Show Yet \")]):_c('div',{class:(\"there-are-items \" + (_vm.isGridLayout? 'item-group-grid': '')),style:(_vm.gridStyle)},[_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.newItemSize,\"hotkey\":item.hotkey,\"enableStatusCheck\":_vm.shouldEnableStatusCheck(item.statusCheck),\"statusCheckInterval\":_vm.getStatusCheckInterval()},on:{\"itemClicked\":function($event){return _vm.$emit('itemClicked')},\"triggerModal\":_vm.triggerModal}})}),_c('div',{ref:\"modalContainer\"})],2),_c('IframeModal',{ref:(\"iframeModal-\" + _vm.groupId),attrs:{\"name\":(\"iframeModal-\" + _vm.groupId)},on:{\"closed\":function($event){return _vm.$emit('itemClicked')},\"modalChanged\":_vm.modalChanged}})],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:\"item-wrapper\"},[_c('a',{directives:[{name:\"tooltip\",rawName:\"v-tooltip\",value:(_vm.getTooltipOptions()),expression:\"getTooltipOptions()\"}],class:(\"item \" + (!_vm.icon? 'short': '') + \" size-\" + _vm.itemSize),style:((\"--open-icon: \" + (_vm.getUnicodeOpeningIcon()) + \"; \" + _vm.customStyles)),attrs:{\"href\":(_vm.target !== 'modal' && _vm.target !== 'workspace') ? _vm.url : '#',\"target\":_vm.target === 'newtab' ? '_blank' : '',\"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': '')),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.target,\"position\":_vm.itemSize === 'medium'? 'bottom right' : 'top 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()],1),_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.id)},on:{\"contextItemClick\":_vm.contextItemClick}})],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:\"item-icon\"},[(_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('object',{class:(\"simple-icons \" + _vm.size),attrs:{\"type\":\"image/svg+xml\",\"data\":_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\">\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 <object v-else-if=\"iconType === 'si'\" :class=\"`simple-icons ${size}`\"\n type=\"image/svg+xml\" :data=\"getSimpleIcon(icon)\"></object>\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 BrokenImage from '@/assets/interface-icons/broken-icon.svg';\nimport ErrorHandler from '@/utils/ErrorHandler';\nimport { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';\nimport EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';\nimport emojiLookup from '@/utils/emojis.json';\n\nexport default {\n name: 'Icon',\n inject: ['config'],\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 /* 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 = ['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) {\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 = this.config.appConfig.faviconApi || defaultFaviconApi;\n const endpoint = faviconApiEndpoints[faviconApi];\n return endpoint.replace('$URL', host);\n }\n return '';\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.config.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 return `${iconCdns.generative}/${this.getHostName(url)}.svg`;\n },\n /* Formats the URL for getting Simple-Icons SVG asset */\n getSimpleIcon(img) {\n const imageName = img.replace('si-', '');\n return `${iconCdns.si}/${imageName}.svg`;\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 'generative': return this.getGenerativeIcon(url);\n case 'mdi': return img; // Material design icons\n case 'simple-icons': return this.getSimpleIcon(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 (img.endsWith('.svg')) imgType = 'svg';\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 === '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 /* Default Image Icon */\n .tile-icon {\n width: 2rem;\n // filter: var(--item-icon-transform);\n border-radius: var(--curve-factor);\n &.broken { display: none; }\n &.small {\n width: 1.5rem;\n }\n &.large {\n width: 3rem;\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 object.simple-icons {\n width: 2rem;\n &.small { width: 1.5rem; }\n &.large { width: 2.5rem; }\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=6db43a24&\"\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._e()],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 </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';\n\nexport default {\n name: 'ItemOpenMethodIcon',\n props: {\n openingMethod: String, // newtab | sametab | 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 },\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=b0684bc4&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=b0684bc4&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 \"b0684bc4\",\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, classes: ['status-tooltip', (\"tip-\" + (_vm.color()))] }),expression:\"{\\n content: statusText || otherStatusText, classes: ['status-tooltip', `tip-${color()}`] }\"}],staticClass:\"indicator\",on:{\"click\":function($event){return _vm.showToast()}}},[_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\n v-tooltip=\"{\n content: statusText || otherStatusText, classes: ['status-tooltip', `tip-${color()}`] }\"\n class=\"indicator\"\n @click=\"showToast()\">\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 &: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) !important;\n font-size: 1rem;\n z-index: 10;\n &.tip-green { border: 1px solid var(--success); }\n &.tip-yellow { border: 1px solid var(--warning); }\n &.tip-red { border: 1px solid var(--danger); }\n}\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=46972ad8&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=46972ad8&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 \"46972ad8\",\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.menuEnabled)?_c('div',{staticClass:\"context-menu\",style:(_vm.posX && _vm.posY ? (\"top:\" + _vm.posY + \"px;left:\" + _vm.posX + \"px;\") : '')},[_c('ul',[_c('li',{on:{\"click\":function($event){return _vm.launch('sametab')}}},[_c('SameTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('menu.sametab')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('newtab')}}},[_c('NewTabOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('menu.newtab')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('modal')}}},[_c('IframeOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('menu.modal')))])],1),_c('li',{on:{\"click\":function($event){return _vm.launch('workspace')}}},[_c('WorkspaceOpenIcon'),_c('span',[_vm._v(_vm._s(_vm.$t('menu.workspace')))])],1)])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"slide\">\n <div class=\"context-menu\" v-if=\"show && menuEnabled\"\n :style=\"posX && posY ? `top:${posY}px;left:${posX}px;` : ''\">\n <ul>\n <li @click=\"launch('sametab')\">\n <SameTabOpenIcon />\n <span>{{ $t('menu.sametab') }}</span>\n </li>\n <li @click=\"launch('newtab')\">\n <NewTabOpenIcon />\n <span>{{ $t('menu.newtab') }}</span>\n </li>\n <li @click=\"launch('modal')\">\n <IframeOpenIcon />\n <span>{{ $t('menu.modal') }}</span>\n </li>\n <li @click=\"launch('workspace')\">\n <WorkspaceOpenIcon />\n <span>{{ $t('menu.workspace') }}</span>\n </li>\n </ul>\n </div>\n </transition>\n</template>\n\n<script>\n// Import icons for each element\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 inject: ['config'],\n components: {\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 data() {\n return {\n menuEnabled: !this.isMenuDisabled(), // Specifies if the context menu should be used\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('contextItemClick', target);\n },\n /* Checks if the user as disabled context menu in config */\n isMenuDisabled() {\n if (this.config && this.config.appConfig) {\n return !!this.config.appConfig.disableContextMenu;\n }\n return false;\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 {\n list-style-type: none;\n margin: 0;\n padding: 0;\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 {\n background: 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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ContextMenu.vue?vue&type=template&id=583ec03e&\"\nimport script from \"./ContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ContextMenu.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ContextMenu.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\">\n <a @click=\"itemOpened\"\n @mouseup.right=\"openContextMenu\"\n @contextmenu.prevent\n :href=\"(target !== 'modal' && target !== 'workspace') ? url : '#'\"\n :target=\"target === 'newtab' ? '_blank' : ''\"\n :class=\"`item ${!icon? 'short': ''} size-${itemSize}`\"\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': ''}`\" :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=\"target\" :position=\"itemSize === 'medium'? 'bottom right' : 'top 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 </a>\n <ContextMenu\n :show=\"contextMenuOpen\"\n v-click-outside=\"closeContextMenu\"\n :posX=\"contextPos.posX\"\n :posY=\"contextPos.posY\"\n :id=\"`context-menu-${id}`\"\n @contextItemClick=\"contextItemClick\"\n />\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 ContextMenu from '@/components/LinkItems/ContextMenu';\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 hotkey: Number, // Shortcut for quickly launching app\n target: { // Where resource will open, either 'newtab', 'sametab' or 'modal'\n type: String,\n default: 'newtab',\n validator: (value) => ['newtab', 'sametab', 'modal', 'workspace'].indexOf(value) !== -1,\n },\n itemSize: String,\n enableStatusCheck: Boolean,\n statusCheckHeaders: Object,\n statusCheckUrl: String,\n statusCheckInterval: Number,\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 };\n },\n components: {\n Icon,\n ItemOpenMethodIcon,\n StatusIndicator,\n ContextMenu,\n },\n methods: {\n /* Called when an item is clicked, manages the opening of modal & resets the search field */\n itemOpened(e) {\n if (e.altKey || this.target === 'modal') {\n e.preventDefault();\n this.$emit('triggerModal', this.url);\n } else if (this.target === 'workspace') {\n router.push({ name: 'workspace', query: { url: this.url } });\n } else {\n this.$emit('itemClicked');\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 const hotkeyText = this.hotkey ? `\\nPress '${this.hotkey}' to launch` : '';\n return {\n disabled: !this.description,\n content: this.description + hotkeyText,\n trigger: 'hover focus',\n hideOnTargetClick: true,\n html: false,\n placement: this.statusResponse ? 'left' : 'auto',\n delay: { show: 600, hide: 200 },\n classes: 'item-description-tooltip',\n };\n },\n /* Used by certain themes, which display an icon with animated CSS */\n getUnicodeOpeningIcon() {\n switch (this.target) {\n case 'newtab': return '\"\\\\f360\"';\n case 'sametab': return '\"\\\\f24d\"';\n case 'modal': return '\"\\\\f2d0\"';\n default: return '\"\\\\f054\"';\n }\n },\n /* Checks if a given service is currently online */\n checkWebsiteStatus() {\n this.statusResponse = undefined;\n const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;\n const urlToCheck = this.statusCheckUrl || this.url;\n const headers = this.statusCheckHeaders || {};\n const endpoint = `${baseUrl}/ping?url=${urlToCheck}`;\n axios.get(endpoint, { headers })\n .then((response) => {\n if (response.data) this.statusResponse = response.data;\n })\n .catch(() => {\n this.statusResponse = {\n statusText: 'Failed to make request',\n statusSuccess: false,\n };\n });\n },\n /* Handle navigation options from the context menu */\n contextItemClick(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 },\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}\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 {\n height: 18px;\n }\n}\n\n/* Text in tile */\n.tile-title {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n min-width: 120px;\n height: 30px;\n position: relative;\n padding: 0;\n z-index: 2;\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/* 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 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:140px;\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 }\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 display: block;\n margin: 0;\n white-space: pre-wrap;\n font-size: .9em;\n text-overflow: ellipsis;\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</style>\n\n<!-- An un-scoped style tag, since tooltip is outside this DOM tree -->\n<style lang=\"scss\">\n.tooltip {\n padding: 0.2rem 0.5rem;\n background: #0b1021cc;\n border: 1px solid #0b1021;\n border-radius: 3px;\n color: #fff;\n max-width: 250px;\n}\n.tooltip-arrow {\n border-width: 5px 5px 0 5px;\n border-left-color: transparent!important;\n border-right-color: transparent!important;\n border-bottom-color: transparent!important;\n bottom: -11px;\n left: calc(50% - 5px);\n margin-top: 0;\n margin-bottom: 0;\n width: 0;\n height: 0;\n border-style: solid;\n position: absolute;\n margin: 5px;\n border-color: #0b1021cc;\n z-index: 3;\n}\n\n.disabled-link {\n pointer-events: none;\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=1373337f&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.checkSpanNum(_vm.cols, 'col')) + \" \" + (_vm.checkSpanNum(_vm.rows, 'row'))),style:(((_vm.color ? 'background: '+_vm.color : '') + \"; \" + (_vm.sanitizeCustomStyles(_vm.customStyles)) + \";\"))},[_c('input',{staticClass:\"toggle\",attrs:{\"id\":(\"collapsible-\" + _vm.uniqueKey),\"type\":\"checkbox\",\"tabIndex\":\"-1\"},domProps:{\"checked\":_vm.getCollapseState()},on:{\"change\":_vm.collapseChanged}}),_c('label',{staticClass:\"lbl-toggle\",attrs:{\"for\":(\"collapsible-\" + _vm.uniqueKey),\"tabindex\":\"-1\"}},[(_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))])],1),_c('div',{staticClass:\"collapsible-content\"},[_c('div',{staticClass:\"content-inner\"},[_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div :class=\"`collapsable ${checkSpanNum(cols, 'col')} ${checkSpanNum(rows, 'row')}`\"\n :style=\"`${color ? 'background: '+color : ''}; ${sanitizeCustomStyles(customStyles)};`\"\n >\n <input\n :id=\"`collapsible-${uniqueKey}`\"\n class=\"toggle\"\n type=\"checkbox\"\n :checked=\"getCollapseState()\"\n @change=\"collapseChanged\"\n tabIndex=\"-1\"\n >\n <label :for=\"`collapsible-${uniqueKey}`\" class=\"lbl-toggle\" tabindex=\"-1\">\n <Icon v-if=\"icon\" :icon=\"icon\" size=\"small\" :url=\"title\" class=\"section-icon\" />\n <h3>{{ title }}</h3>\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';\n\nexport default {\n name: 'CollapsableContainer',\n props: {\n uniqueKey: String,\n title: String,\n icon: String,\n collapsed: Boolean,\n cols: Number,\n rows: Number,\n color: String,\n customStyles: String,\n },\n components: {\n Icon,\n },\n methods: {\n /* Check that row & column span is valid, and not over the max */\n checkSpanNum(span, classPrefix) {\n const maxSpan = 4;\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 /* If not already done, then add object structure to local storage */\n initialiseStorage() {\n /* Initialize function will create and set a blank object to storage */\n const initStorage = () => localStorage.setItem(\n localStorageKeys.COLLAPSE_STATE, JSON.stringify({}),\n );\n if (!localStorage[localStorageKeys.COLLAPSE_STATE]) initStorage(); // Initialise if not set\n try { // Check storage is valid JSON, and has not been corrupted\n JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);\n } catch {\n initStorage();\n }\n return JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);\n },\n getCollapseState() {\n const collapseStateObject = this.initialiseStorage();\n let collapseState = !this.collapsed;\n if (collapseStateObject[this.uniqueKey] !== undefined) {\n collapseState = collapseStateObject[this.uniqueKey];\n }\n return collapseState;\n },\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 collapseChanged(whatChanged) {\n this.initialiseStorage();\n this.setCollapseState(this.uniqueKey.toString(), whatChanged.srcElement.checked);\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\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 }\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 }\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 }\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); //var(--item-group-background);\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</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=ac1beaa4&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=ac1beaa4&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 \"ac1beaa4\",\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>\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.$emit('modalChanged', true);\n },\n hide() {\n this.$modal.hide(this.name);\n },\n modalClosed() {\n this.$emit('modalChanged', 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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=08cda45c&\"\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","<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 >\n <div v-if=\"!items || items.length < 1\" class=\"no-items\">\n No Items to Show Yet\n </div>\n <div v-else\n :class=\"`there-are-items ${isGridLayout? 'item-group-grid': ''}`\"\n :style=\"gridStyle\"\n >\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=\"newItemSize\"\n :hotkey=\"item.hotkey\"\n :enableStatusCheck=\"shouldEnableStatusCheck(item.statusCheck)\"\n :statusCheckInterval=\"getStatusCheckInterval()\"\n @itemClicked=\"$emit('itemClicked')\"\n @triggerModal=\"triggerModal\"\n />\n <div ref=\"modalContainer\"></div>\n </div>\n <IframeModal\n :ref=\"`iframeModal-${groupId}`\"\n :name=\"`iframeModal-${groupId}`\"\n @closed=\"$emit('itemClicked')\"\n @modalChanged=\"modalChanged\"\n />\n </Collapsable>\n</template>\n\n<script>\nimport Item from '@/components/LinkItems/Item.vue';\nimport Collapsable from '@/components/LinkItems/Collapsable.vue';\nimport IframeModal from '@/components/LinkItems/IframeModal.vue';\n\nexport default {\n name: 'ItemGroup',\n inject: ['config'],\n props: {\n groupId: String,\n title: String,\n icon: String,\n displayData: Object,\n items: Array,\n itemSize: String,\n modalOpen: Boolean,\n },\n components: {\n Collapsable,\n Item,\n IframeModal,\n },\n computed: {\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 styles += this.displayData.itemCountX\n ? `grid-template-columns: repeat(${this.displayData.itemCountX}, 1fr);` : '';\n styles += this.displayData.itemCountY\n ? `grid-template-rows: repeat(${this.displayData.itemCountY}, 1fr);` : '';\n return styles;\n },\n },\n methods: {\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 modalChanged(changedTo) {\n this.$emit('change-modal-visibility', changedTo);\n },\n shouldEnableStatusCheck(itemPreference) {\n const globalPreference = this.config.appConfig.statusCheck || false;\n return itemPreference !== undefined ? itemPreference : globalPreference;\n },\n getStatusCheckInterval() {\n let interval = this.config.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.no-items {\n width: 100px;\n margin: 0 auto;\n padding: 0.8rem;\n text-align: center;\n cursor: default;\n border-radius: var(--curve-factor);\n background: #607d8b33;\n color: var(--primary);\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 { grid-template-columns: repeat(1, 1fr); }\n @include tablet { grid-template-columns: repeat(2, 1fr); }\n @include laptop { grid-template-columns: repeat(2, 1fr); }\n @include monitor { grid-template-columns: repeat(3, 1fr); }\n @include big-screen { grid-template-columns: repeat(4, 1fr); }\n @include big-screen-up { grid-template-columns: repeat(5, 1fr); }\n }\n}\n.orientation-horizontal {\n display: flex;\n flex-direction: column;\n .there-are-items {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n @include phone { grid-template-columns: repeat(2, 1fr); }\n @include tablet { grid-template-columns: repeat(4, 1fr); }\n @include laptop { grid-template-columns: repeat(6, 1fr); }\n @include monitor { grid-template-columns: repeat(8, 1fr); }\n @include big-screen { grid-template-columns: repeat(10, 1fr); }\n @include big-screen-up { grid-template-columns: repeat(12, 1fr); }\n }\n}\n\n</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemGroup.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemGroup.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ItemGroup.vue?vue&type=template&id=cce3e8c4&scoped=true&\"\nimport script from \"./ItemGroup.vue?vue&type=script&lang=js&\"\nexport * from \"./ItemGroup.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ItemGroup.vue?vue&type=style&index=0&id=cce3e8c4&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 \"cce3e8c4\",\n null\n \n)\n\nexport default component.exports","<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-display-layout=\"setLayoutOrientation\"\n @change-icon-size=\"setItemSize\"\n @change-modal-visibility=\"updateModalVisibility\"\n :displayLayout=\"layout\"\n :iconSize=\"itemSizeBound\"\n :externalThemes=\"getExternalCSSLinks()\"\n :sections=\"getSections(sections)\"\n :appConfig=\"appConfig\"\n :pageInfo=\"pageInfo\"\n :modalOpen=\"modalOpen\"\n class=\"settings-outer\"\n />\n <!-- Main content, section for each group of items -->\n <div v-if=\"checkTheresData(sections)\"\n :class=\"`item-group-container orientation-${layout} item-size-${itemSizeBound}`\">\n <ItemGroup\n v-for=\"(section, index) in getSections(sections)\"\n :key=\"index\"\n :title=\"section.name\"\n :icon=\"section.icon || undefined\"\n :displayData=\"getDisplayData(section)\"\n :groupId=\"`section-${index}`\"\n :items=\"filterTiles(section.items)\"\n :itemSize=\"itemSizeBound\"\n @itemClicked=\"finishedSearching()\"\n @change-modal-visibility=\"updateModalVisibility\"\n :class=\"(filterTiles(section.items).length === 0 && searchValue) ? 'no-results' : ''\"\n />\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 </div>\n</template>\n\n<script>\n\nimport SettingsContainer from '@/components/Settings/SettingsContainer.vue';\nimport ItemGroup from '@/components/LinkItems/ItemGroup.vue';\nimport Defaults, { localStorageKeys, iconCdns } from '@/utils/defaults';\n\nexport default {\n name: 'home',\n props: {\n sections: Array, // Main site content\n appConfig: Object, // Main site configuation (optional)\n pageInfo: Object, // Page metadata (optional)\n },\n components: {\n SettingsContainer,\n ItemGroup,\n },\n data: () => ({\n searchValue: '',\n layout: '',\n itemSizeBound: '',\n modalOpen: false, // When true, keybindings are disabled\n }),\n computed: {\n /* Updates layout (when button clicked), and saves in local storage */\n layoutOrientation: {\n get() { return this.appConfig.layout || Defaults.layout; },\n set: function setLayout(layout) {\n localStorage.setItem(localStorageKeys.LAYOUT_ORIENTATION, layout);\n this.layout = layout;\n },\n },\n /* Updates icon size (when button clicked), and saves in local storage */\n iconSize: {\n get() { return this.appConfig.iconSize || Defaults.iconSize; },\n set: function setIconSize(iconSize) {\n localStorage.setItem(localStorageKeys.ICON_SIZE, iconSize);\n this.itemSizeBound = iconSize;\n },\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 /* 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.clearFilterInput();\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 allTiles.filter((tile) => {\n const {\n title, description, provider, url,\n } = tile;\n const searchTerm = this.searchValue.toLowerCase();\n return (title && title.toLowerCase().includes(searchTerm))\n || (provider && provider.toLowerCase().includes(searchTerm))\n || (description && description.toLowerCase().includes(searchTerm))\n || this.getDomainFromUrl(url).includes(searchTerm);\n });\n },\n /* Returns optional section display preferences if available */\n getDisplayData(section) {\n return !section.displayData ? {} : section.displayData;\n },\n /* Sets layout attribute, which is used by ItemGroup */\n setLayoutOrientation(layout) {\n this.layoutOrientation = layout;\n },\n /* Sets item size attribute, which is used by ItemGroup */\n setItemSize(itemSize) {\n this.iconSize = itemSize;\n },\n /* Update data when modal is open (so that key bindings can be disabled) */\n updateModalVisibility(modalState) {\n this.modalOpen = modalState;\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).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(100vh - 126px);\n min-height: calc(99.9vh - var(--footer-height));\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\n /* Specify number of columns, based on screen size */\n @include phone {\n grid-template-columns: repeat(1, 1fr);\n }\n @include tablet {\n grid-template-columns: repeat(2, 1fr);\n }\n @include laptop {\n grid-template-columns: repeat(2, 1fr);\n }\n @include monitor {\n grid-template-columns: repeat(3, 1fr);\n }\n @include big-screen {\n grid-template-columns: repeat(4, 1fr);\n }\n @include big-screen-up {\n grid-template-columns: repeat(5, 1fr);\n }\n\n /* Hide when search term returns nothing */\n .no-results { display: none; }\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--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-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=9b847cc8&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=9b847cc8&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 \"9b847cc8\",\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\"},[_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)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"login-page\">\n <form class=\"login-form\">\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 </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 { checkCredentials, login } from '@/utils/Auth';\n\nexport default {\n name: 'login',\n components: {\n Button,\n Input,\n },\n props: {\n appConfig: Object,\n },\n data() {\n return {\n username: '',\n password: '',\n message: '',\n status: 'waiting', // wating, error, success\n timeout: { label: this.$t('login.remember-me-never'), time: 0 },\n };\n },\n computed: {\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 },\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.appConfig.auth || [], // 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 setTimeout(() => { // Wait a short while, then redirect back home\n router.push({ path: '/' });\n }, 250);\n }\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 },\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 min-height: calc(100vh - var(--footer-height));\n\n /* Login form container */\n form.login-form {\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 auto;\n display: flex;\n flex-direction: column;\n\n /* Login form title */\n h2.login-title {\n font-size: 3rem;\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 }\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--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-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=5799c3b4&\"\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},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},[_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)}),0)}\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 inject: ['config'],\n props: {\n icon: String,\n title: String,\n url: String,\n click: Function,\n },\n components: {\n Icon,\n },\n methods: {\n itemClicked() {\n if (this.url) this.$emit('launch-app', this.url);\n },\n },\n data() {\n return {\n tooltip: {\n disabled: !this.title,\n content: this.title,\n trigger: 'hover focus',\n hideOnTargetClick: true,\n html: false,\n placement: 'right-start',\n delay: { show: 800, hide: 1000 },\n },\n };\n },\n};\n</script>\n\n<style lang=\"scss\" scoped>\n\ndiv.side-bar-item {\n color: var(--side-bar-color);\n background: var(--side-bar-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=783199a0&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=783199a0&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 \"783199a0\",\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},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 @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 inject: ['config'],\n props: {\n items: Array,\n },\n components: {\n SideBarItem,\n },\n methods: {\n launchApp(url) {\n this.$emit('launch-app', url);\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=56ddb963&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=56ddb963&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 \"56ddb963\",\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\">\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 </nav>\n</template>\n\n<script>\n\nimport SideBarItem from '@/components/Workspace/SideBarItem.vue';\nimport SideBarSection from '@/components/Workspace/SideBarSection.vue';\n\nexport default {\n name: 'SideBar',\n inject: ['config'],\n props: {\n sections: Array,\n },\n data() {\n return {\n isOpen: new Array(this.sections.length).fill(false),\n };\n },\n components: {\n SideBarItem,\n SideBarSection,\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 launchApp(url) {\n this.$emit('launch-app', url);\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</style>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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=31476576&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=31476576&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 \"31476576\",\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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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\" />\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 props: {\n sections: Array,\n appConfig: Object,\n },\n data: () => ({\n url: '', // this.$route.query.url || '',\n GetTheme,\n ApplyLocalTheme,\n ApplyCustomVariables,\n }),\n computed: {\n isMultiTaskingEnabled() {\n return this.appConfig.enableMultiTasking || false;\n },\n },\n components: {\n SideBar,\n WebContent,\n MultiTaskingWebComtent,\n },\n methods: {\n launchApp(url) {\n this.url = url;\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 repositionFooter() {\n document.getElementsByTagName('footer')[0].style.position = 'fixed';\n },\n },\n mounted() {\n const route = this.$route;\n if (route.query && route.query.url) this.url = decodeURI(route.query.url);\n this.setTheme();\n this.initiateFontAwesome();\n // this.repositionFooter();\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--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-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--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-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=0b61868d&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=0b61868d&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 \"0b61868d\",\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('pre',[_c('code',[_vm._v(_vm._s(_vm.jsonParser(_vm.config)))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <pre><code>{{ jsonParser(config) }}</code></pre>\n</template>\n\n<script>\nimport JsonToYaml from '@/utils/JsonToYaml';\n\nexport default {\n name: 'DownloadConfig',\n props: {\n sections: Array,\n appConfig: Object,\n pageInfo: Object,\n },\n data() {\n return {\n config: {\n appConfig: this.appConfig,\n pageInfo: this.pageInfo,\n sections: this.sections,\n },\n jsonParser: JsonToYaml,\n };\n },\n};\n\n</script>\n\n<style scoped lang=\"scss\">\npre {\n background: var(--code-editor-background);\n color: var(--code-editor-color);\n padding: 1rem;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DownloadConfig.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--11-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DownloadConfig.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DownloadConfig.vue?vue&type=template&id=33cd2d90&scoped=true&\"\nimport script from \"./DownloadConfig.vue?vue&type=script&lang=js&\"\nexport * from \"./DownloadConfig.vue?vue&type=script&lang=js&\"\nimport style0 from \"./DownloadConfig.vue?vue&type=style&index=0&id=33cd2d90&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 \"33cd2d90\",\n null\n \n)\n\nexport default component.exports","import Vue from 'vue';\nimport Router from 'vue-router';\n\nimport Home from '@/views/Home.vue';\nimport Login from '@/views/Login.vue';\nimport Workspace from '@/views/Workspace.vue';\nimport DownloadConfig from '@/views/DownloadConfig.vue';\nimport { isLoggedIn } from '@/utils/Auth';\nimport { config } from '@/utils/ConfigHelpers';\nimport { metaTagData } from '@/utils/defaults';\n\nVue.use(Router);\n\n/**\n * Checks if the current user is either authenticated,\n * or if authentication is not enabled\n * @returns true if user logged in, or user management not enabled\n */\nconst isAuthenticated = () => {\n const users = config.appConfig.auth;\n return (!users || users.length === 0 || isLoggedIn(users));\n};\n\nconst router = new Router({\n routes: [\n {\n path: '/',\n name: 'home',\n component: Home,\n props: config,\n meta: {\n title: config.pageInfo.title || 'Home Page',\n metaTags: metaTagData,\n },\n },\n {\n path: '/workspace',\n name: 'workspace',\n component: Workspace,\n props: config,\n meta: {\n title: config.pageInfo.title || 'Dashy Workspace',\n metaTags: metaTagData,\n },\n },\n {\n path: '/login',\n name: 'login',\n component: Login,\n props: {\n appConfig: config.appConfig,\n },\n beforeEnter: (to, from, next) => {\n if (isAuthenticated()) router.push({ path: '/' });\n next();\n },\n },\n {\n path: '/about',\n name: 'about',\n component: () => import(/* webpackChunkName: \"about\" */ './views/About.vue'),\n },\n {\n path: '/download',\n name: 'download',\n component: DownloadConfig,\n props: config,\n meta: {\n title: config.pageInfo.title || 'Download Dashy Config',\n metaTags: metaTagData,\n },\n },\n ],\n});\n\nrouter.beforeEach((to, from, next) => {\n if (to.name !== 'login' && !isAuthenticated()) next({ name: 'login' });\n else next();\n});\n\nconst defaultTitle = 'Dashy';\nrouter.afterEach((to) => {\n Vue.nextTick(() => {\n document.title = to.meta.title || defaultTitle;\n });\n});\n\nexport default router;\n","/* eslint-disable no-console */\n\nimport { register } from 'register-service-worker';\nimport { sessionStorageKeys } from '@/utils/defaults';\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 console.warn('Error setting SW data', 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 let shouldEnable = true;\n if (conf && conf.appConfig) { // Check if app Config available\n if (conf.appConfig.disableServiceWorker) { // Disable if user requested\n shouldEnable = false;\n setSwStatus({ disabledByUser: true });\n }\n }\n if (process.env.NODE_ENV !== 'production') {\n shouldEnable = false; // Disable if not in production\n setSwStatus({ devMode: true });\n }\n return shouldEnable;\n};\n\nconst registerServiceWorker = () => {\n if (shouldEnableServiceWorker()) {\n register(`${process.env.BASE_URL}service-worker.js`, {\n ready() {\n setSwStatus({ ready: true });\n console.log(\n 'App 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 console.log('Service worker has been registered.');\n },\n cached() {\n setSwStatus({ cached: true });\n console.log('Content has been cached for offline use.');\n },\n updatefound() {\n setSwStatus({ updateFound: true });\n console.log('New content is downloading.');\n },\n updated() {\n setSwStatus({ updated: true });\n console.log('New content is available; please refresh.');\n },\n offline() {\n setSwStatus({ offline: true });\n console.log('No internet connection found. App is running in offline mode.');\n },\n error(error) {\n setSwStatus({ error: true });\n console.error('Error during service worker 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 ErrorTracking = (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 // 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 });\n } else {\n // Error reporting not enabled. Do Nothing.\n }\n};\n\nexport default ErrorTracking;\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\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\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 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, language as defaultLanguage } from '@/utils/defaults'; // Defaults\n\n// Initialize global Vue components\nVue.use(VueI18n);\nVue.use(VTooltip);\nVue.use(VModal);\nVue.use(VTabs);\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// All done, now just initialize main Vue app!\nnew Vue({ router, render, i18n }).$mount('#app');\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 ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LanguageSwitcher.vue?vue&type=style&index=0&id=631f0843&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-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--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Workspace.vue?vue&type=style&index=0&id=0b61868d&scoped=true&lang=scss&\"","export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-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 /* 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 /* List of built-in themes, to be displayed within the theme-switcher dropdown */\n builtInThemes: [\n 'callisto',\n 'thebe',\n 'dracula',\n 'material',\n 'material-dark',\n 'colorful',\n 'nord',\n 'nord-frost',\n 'minimal-dark',\n 'minimal-light',\n 'oblivion',\n 'matrix',\n 'matrix-red',\n 'hacker-girl',\n 'raspberry-jam',\n 'bee',\n 'tiger',\n 'blue-purple',\n 'material-original',\n 'material-dark-original',\n 'cyberpunk',\n 'vaporware',\n 'high-contrast-dark',\n 'high-contrast-light',\n ],\n /* Which structural components should be visible by default */\n visibleComponents: {\n pageTitle: true,\n navigation: true,\n searchBar: true,\n settings: true,\n footer: true,\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 },\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 },\n /* Unique IDs of modals within the app */\n modalNames: {\n CONF_EDITOR: 'CONF_EDITOR',\n CLOUD_BACKUP: 'CLOUD_BACKUP',\n REBUILD_APP: 'REBUILD_APP',\n THEME_MAKER: 'THEME_MAKER',\n ABOUT_APP: 'ABOUT_APP',\n LANG_SWITCHER: 'LANG_SWITCHER',\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 /* 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 /* 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 // favicongrabber: 'https://favicongrabber.com//api/grab/$URL',\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://ipsicon.io',\n localPath: '/item-icons',\n faviconName: 'favicon.ico',\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};\n","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LayoutSelector.vue?vue&type=style&index=0&id=b3a6111c&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-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SettingsContainer.vue?vue&type=style&index=0&id=25781e16&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-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=style&index=0&lang=scss&\"","export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DownloadConfig.vue?vue&type=style&index=0&id=33cd2d90&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Header.vue?vue&type=style&index=0&id=73a6fa67&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-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 ","\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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBar.vue?vue&type=style&index=0&id=31476576&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemSizeSelector.vue?vue&type=style&index=0&id=1ff45660&scoped=true&lang=scss&\"","module.exports = {\"pageInfo\":{\"title\":\"Dashy\",\"navLinks\":[{\"title\":\"Home\",\"path\":\"/\"},{\"title\":\"About\",\"path\":\"/about\"},{\"title\":\"Source Code\",\"path\":\"https://github.com/Lissy93/dashy\"}]},\"appConfig\":{\"theme\":\"colorful\",\"fontAwesomeKey\":\"0821c65656\"},\"sections\":[{\"name\":\"Getting Started\",\"items\":[{\"title\":\"Source\",\"description\":\"Source code and documentation on GitHub\",\"icon\":\"fab fa-github\",\"url\":\"https://github.com/Lissy93/dashy\"},{\"title\":\"Issues\",\"description\":\"View currently open issues, or raise a new one\",\"icon\":\"fas fa-bug\",\"url\":\"https://github.com/Lissy93/dashy/issues\"},{\"title\":\"Demo 1\",\"description\":\"Live Demo #1\",\"icon\":\"far fa-rocket\",\"url\":\"https://dashy-demo-1.netlify.app\"},{\"title\":\"Demo 2\",\"description\":\"Live Demo #2\",\"icon\":\"fad fa-planet-ringed\",\"url\":\"https://dashy-demo-2.netlify.app\"}]}]}","\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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SearchBar.vue?vue&type=style&index=0&id=2350dd8e&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemOpenMethodIcon.vue?vue&type=style&index=0&id=b0684bc4&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 ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./CloudBackupRestore.vue?vue&type=style&index=0&id=cdf206ac&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\":\"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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SideBarSection.vue?vue&type=style&index=0&id=56ddb963&lang=scss&scoped=true&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Nav.vue?vue&type=style&index=0&id=68c1bd5c&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppInfoModal.vue?vue&type=style&index=0&id=77ccbcae&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-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ItemIcon.vue?vue&type=style&index=0&lang=scss&\"","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","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./StatusIndicator.vue?vue&type=style&index=0&id=46972ad8&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-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 ","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Collapsable.vue?vue&type=style&index=0&id=ac1beaa4&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./PageTitle.vue?vue&type=style&index=0&id=28f9cb72&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Footer.vue?vue&type=style&index=0&id=64591bd5&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AppVersion.vue?vue&type=style&index=0&id=49d7ffdf&scoped=true&lang=scss&\"","export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--7-oneOf-1-0!../../../node_modules/css-loader/dist/cjs.js??ref--7-oneOf-1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/src/index.js??ref--7-oneOf-1-2!../../../node_modules/sass-loader/dist/cjs.js??ref--7-oneOf-1-3!../../../node_modules/cache-loader/dist/cjs.js??ref--0-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 "],"sourceRoot":""}