diff --git a/REUSE.toml b/REUSE.toml index e1e801fbeba38..d9cfce23cb756 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -10,7 +10,7 @@ SPDX-FileCopyrightText = "2016 ownCloud, Inc., 2016-2024 Nextcloud translators" SPDX-License-Identifier = "AGPL-3.0-only OR AGPL-3.0-or-later" [[annotations]] -path = ["apps/cloud_federation_api/l10n/**.js", "apps/cloud_federation_api/l10n/**.json", "apps/contactsinteraction/l10n/**.js", "apps/contactsinteraction/l10n/**.json", "apps/dashboard/l10n/**.js", "apps/dashboard/l10n/**.json", "apps/files_reminders/l10n/**.js", "apps/files_reminders/l10n/**.json", "apps/lookup_server_connector/l10n/**.js", "apps/lookup_server_connector/l10n/**.json", "apps/profile/l10n/**.js", "apps/profile/l10n/**.json", "apps/sharebymail/l10n/**.js", "apps/oauth2/l10n/**.js", "apps/oauth2/l10n/**.json", "apps/sharebymail/l10n/**.json", "apps/theming/l10n/**.js", "apps/theming/l10n/**.json", "apps/twofactor_backupcodes/l10n/**.js", "apps/twofactor_backupcodes/l10n/**.json", "apps/user_status/l10n/**.js", "apps/user_status/l10n/**.json", "apps/weather_status/l10n/**.js", "apps/weather_status/l10n/**.json", "apps/webhook_listeners/l10n/**.js", "apps/webhook_listeners/l10n/**.json", "apps/workflowengine/l10n/**.js", "apps/workflowengine/l10n/**.json"] +path = ["apps/appstore/l10n/**.js", "apps/appstore/l10n/**.json", "apps/cloud_federation_api/l10n/**.js", "apps/cloud_federation_api/l10n/**.json", "apps/contactsinteraction/l10n/**.js", "apps/contactsinteraction/l10n/**.json", "apps/dashboard/l10n/**.js", "apps/dashboard/l10n/**.json", "apps/files_reminders/l10n/**.js", "apps/files_reminders/l10n/**.json", "apps/lookup_server_connector/l10n/**.js", "apps/lookup_server_connector/l10n/**.json", "apps/profile/l10n/**.js", "apps/profile/l10n/**.json", "apps/sharebymail/l10n/**.js", "apps/oauth2/l10n/**.js", "apps/oauth2/l10n/**.json", "apps/sharebymail/l10n/**.json", "apps/theming/l10n/**.js", "apps/theming/l10n/**.json", "apps/twofactor_backupcodes/l10n/**.js", "apps/twofactor_backupcodes/l10n/**.json", "apps/user_status/l10n/**.js", "apps/user_status/l10n/**.json", "apps/weather_status/l10n/**.js", "apps/weather_status/l10n/**.json", "apps/webhook_listeners/l10n/**.js", "apps/webhook_listeners/l10n/**.json", "apps/workflowengine/l10n/**.js", "apps/workflowengine/l10n/**.json"] precedence = "aggregate" SPDX-FileCopyrightText = "2016-2024 Nextcloud translators" SPDX-License-Identifier = "AGPL-3.0-or-later" diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php index 467caef40a01e..bbd598a2c288a 100644 --- a/apps/theming/lib/Controller/ThemingController.php +++ b/apps/theming/lib/Controller/ThemingController.php @@ -372,7 +372,13 @@ public function getImage(string $key, bool $useSvg = true) { $csp->allowInlineStyle(); $response->setContentSecurityPolicy($csp); $response->cacheFor(3600); - $response->addHeader('Content-Type', $file->getMimeType()); + // The original stored file has no extension (e.g. "logo"), so getMimeType() returns + // application/octet-stream for it. Use the config-stored MIME type for the original + // file, and getMimeType() only for converted files which have a proper extension. + $mimeType = $file->getName() === $key + ? $this->appConfig->getAppValueString($key . 'Mime', '') + : $file->getMimeType(); + $response->addHeader('Content-Type', $mimeType); $response->addHeader('Content-Disposition', 'attachment; filename="' . $key . '"'); return $response; } @@ -450,7 +456,7 @@ public function getThemeStylesheet(string $themeId, bool $plain = false, bool $w #[BruteForceProtection(action: 'manifest')] #[OpenAPI(scope: OpenAPI::SCOPE_DEFAULT)] public function getManifest(string $app): JSONResponse { - $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + $cacheBusterValue = $this->appConfig->getAppValueString('cachebuster', '0'); if ($app === 'core' || $app === 'settings') { $name = $this->themingDefaults->getName(); $shortName = $this->themingDefaults->getName(); diff --git a/apps/theming/lib/ImageManager.php b/apps/theming/lib/ImageManager.php index 1979656dd1e82..ad3903f148e9b 100644 --- a/apps/theming/lib/ImageManager.php +++ b/apps/theming/lib/ImageManager.php @@ -8,6 +8,7 @@ use OCA\Theming\AppInfo\Application; use OCA\Theming\Service\BackgroundService; +use OCP\AppFramework\Services\IAppConfig; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; @@ -30,6 +31,7 @@ public function __construct( private LoggerInterface $logger, private ITempManager $tempManager, private BackgroundService $backgroundService, + private IAppConfig $appConfig, ) { } @@ -40,7 +42,7 @@ public function __construct( * @return string the image url */ public function getImageUrl(string $key): string { - $cacheBusterCounter = $this->config->getAppValue(Application::APP_ID, 'cachebuster', '0'); + $cacheBusterCounter = (string)$this->appConfig->getAppValueInt(ConfigLexicon::CACHE_BUSTER); if ($this->hasImage($key)) { return $this->urlGenerator->linkToRoute('theming.Theming.getImage', [ 'key' => $key ]) . '?v=' . $cacheBusterCounter; } elseif ($key === 'backgroundDark' && $this->hasImage('background')) { @@ -85,31 +87,14 @@ public function getImageUrlAbsolute(string $key): string { public function getImage(string $key, bool $useSvg = true): ISimpleFile { $mime = $this->config->getAppValue('theming', $key . 'Mime', ''); $folder = $this->getRootFolder()->getFolder('images'); - $useSvg = $useSvg && $this->canConvert('SVG'); if ($mime === '' || !$folder->fileExists($key)) { throw new NotFoundException(); } - // if SVG was requested and is supported - if ($useSvg) { - if (!$folder->fileExists($key . '.svg')) { - try { - $finalIconFile = new \Imagick(); - $finalIconFile->setBackgroundColor('none'); - $finalIconFile->readImageBlob($folder->getFile($key)->getContent()); - $finalIconFile->setImageFormat('SVG'); - $svgFile = $folder->newFile($key . '.svg'); - $svgFile->putContent($finalIconFile->getImageBlob()); - return $svgFile; - } catch (\ImagickException $e) { - $this->logger->info('The image was requested to be no SVG file, but converting it to SVG failed: ' . $e->getMessage()); - } - } else { - return $folder->getFile($key . '.svg'); - } - } - // if SVG was not requested, but PNG is supported - if (!$useSvg && $this->canConvert('PNG')) { + // only convert SVG originals to PNG when SVG output is not desired; + // converting raster images to SVG produces broken output and is not useful + $isOriginalSvg = ($mime === 'image/svg+xml' || $mime === 'image/svg'); + if ($isOriginalSvg && !$useSvg && $this->canConvert('SVG') && $this->canConvert('PNG')) { if (!$folder->fileExists($key . '.png')) { try { $finalIconFile = new \Imagick(); @@ -120,13 +105,12 @@ public function getImage(string $key, bool $useSvg = true): ISimpleFile { $pngFile->putContent($finalIconFile->getImageBlob()); return $pngFile; } catch (\ImagickException $e) { - $this->logger->info('The image was requested to be no SVG file, but converting it to PNG failed: ' . $e->getMessage()); + $this->logger->info('Converting SVG to PNG failed: ' . $e->getMessage()); } } else { return $folder->getFile($key . '.png'); } } - // fallback to the original file return $folder->getFile($key); } @@ -157,7 +141,7 @@ public function getCustomImages(): array { * @throws NotPermittedException */ public function getCacheFolder(): ISimpleFolder { - $cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0'); + $cacheBusterValue = (string)$this->appConfig->getAppValueInt(ConfigLexicon::CACHE_BUSTER); try { $folder = $this->getRootFolder()->getFolder($cacheBusterValue); } catch (NotFoundException $e) { @@ -214,6 +198,12 @@ public function delete(string $key): void { } catch (NotFoundException $e) { } catch (NotPermittedException $e) { } + try { + $file = $this->getRootFolder()->getFolder('images')->getFile($key . '.svg'); + $file->delete(); + } catch (NotFoundException $e) { + } catch (NotPermittedException $e) { + } if ($key === 'logo') { $this->config->deleteAppValue('theming', 'logoDimensions'); diff --git a/apps/theming/src/components/admin/FileInputField.vue b/apps/theming/src/components/admin/FileInputField.vue index 0e60e89d100c7..2b7b45a370239 100644 --- a/apps/theming/src/components/admin/FileInputField.vue +++ b/apps/theming/src/components/admin/FileInputField.vue @@ -29,12 +29,13 @@ const emit = defineEmits<{ const isSaving = ref(false) const mime = ref(loadState('theming', 'adminThemingParameters')[props.name + 'Mime'] as string) +const cacheKey = ref(Date.now()) const inputElement = useTemplateRef('input') const background = computed(() => { const baseUrl = generateUrl('/apps/theming/image/{key}', { key: props.name }) - return `url(${baseUrl}?v=${Date.now()}&m=${encodeURIComponent(mime.value)})` + return `url(${baseUrl}?v=${cacheKey.value}&m=${encodeURIComponent(mime.value)})` }) /** @@ -75,6 +76,7 @@ async function onChange() { }, }) mime.value = file.type + cacheKey.value = Date.now() emit('updated') } catch (error) { if (isAxiosError(error) && error.response?.status === 422) { diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php index 6f734b635108c..b452b0e85811e 100644 --- a/apps/theming/tests/Controller/ThemingControllerTest.php +++ b/apps/theming/tests/Controller/ThemingControllerTest.php @@ -669,6 +669,29 @@ public function testGetLogo(): void { } + public function testGetLogoOriginalFile(): void { + $file = $this->createMock(ISimpleFile::class); + $file->method('getName')->willReturn('logo'); + $file->method('getMTime')->willReturn(42); + $this->imageManager->expects($this->once()) + ->method('getImage') + ->willReturn($file); + $this->appConfig + ->expects($this->once()) + ->method('getAppValueString') + ->with('logoMime', '') + ->willReturn('image/png'); + + @$expected = new FileDisplayResponse($file); + $expected->cacheFor(3600); + $expected->addHeader('Content-Type', 'image/png'); + $expected->addHeader('Content-Disposition', 'attachment; filename="logo"'); + $csp = new ContentSecurityPolicy(); + $csp->allowInlineStyle(); + $expected->setContentSecurityPolicy($csp); + @$this->assertEquals($expected, $this->themingController->getImage('logo', false)); + } + public function testGetLoginBackgroundNotExistent(): void { $this->imageManager->method('getImage') ->with($this->equalTo('background')) @@ -711,10 +734,10 @@ public static function dataGetManifest(): array { #[\PHPUnit\Framework\Attributes\DataProvider(methodName: 'dataGetManifest')] public function testGetManifest(bool $standalone): void { - $this->config + $this->appConfig ->expects($this->once()) - ->method('getAppValue') - ->with('theming', 'cachebuster', '0') + ->method('getAppValueString') + ->with('cachebuster', '0') ->willReturn('0'); $this->themingDefaults ->expects($this->any()) diff --git a/apps/theming/tests/ImageManagerTest.php b/apps/theming/tests/ImageManagerTest.php index 9f64dd6a3854e..d4f54b24257f5 100644 --- a/apps/theming/tests/ImageManagerTest.php +++ b/apps/theming/tests/ImageManagerTest.php @@ -9,6 +9,7 @@ use OCA\Theming\ImageManager; use OCA\Theming\Service\BackgroundService; +use OCP\AppFramework\Services\IAppConfig; use OCP\Files\IAppData; use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; @@ -29,6 +30,7 @@ class ImageManagerTest extends TestCase { private LoggerInterface&MockObject $logger; private ITempManager&MockObject $tempManager; private ISimpleFolder&MockObject $rootFolder; + private IAppConfig&MockObject $appConfig; protected ImageManager $imageManager; protected function setUp(): void { @@ -41,6 +43,7 @@ protected function setUp(): void { $this->tempManager = $this->createMock(ITempManager::class); $this->rootFolder = $this->createMock(ISimpleFolder::class); $backgroundService = $this->createMock(BackgroundService::class); + $this->appConfig = $this->createMock(IAppConfig::class); $this->imageManager = new ImageManager( $this->config, $this->appData, @@ -49,6 +52,7 @@ protected function setUp(): void { $this->logger, $this->tempManager, $backgroundService, + $this->appConfig, ); $this->appData ->expects($this->any()) @@ -79,26 +83,14 @@ public function mockGetImage($key, $file) { ->with('logo') ->willThrowException(new NotFoundException()); } else { - $file->expects($this->once()) - ->method('getContent') - ->willReturn(file_get_contents(__DIR__ . '/../../../tests/data/testimage.png')); - $folder->expects($this->exactly(2)) + $folder->expects($this->once()) ->method('fileExists') - ->willReturnMap([ - ['logo', true], - ['logo.png', false], - ]); + ->with('logo') + ->willReturn(true); $folder->expects($this->once()) ->method('getFile') ->with('logo') ->willReturn($file); - $newFile = $this->createMock(ISimpleFile::class); - $folder->expects($this->once()) - ->method('newFile') - ->with('logo.png') - ->willReturn($newFile); - $newFile->expects($this->once()) - ->method('putContent'); $this->rootFolder->expects($this->once()) ->method('getFolder') ->with('images') @@ -108,12 +100,14 @@ public function mockGetImage($key, $file) { public function testGetImageUrl(): void { $this->checkImagick(); - $this->config->expects($this->exactly(2)) + $this->appConfig->expects($this->once()) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(0); + $this->config->expects($this->once()) ->method('getAppValue') - ->willReturnMap([ - ['theming', 'cachebuster', '0', '0'], - ['theming', 'logoMime', '', '0'], - ]); + ->with('theming', 'logoMime', '') + ->willReturn('image/png'); $this->urlGenerator->expects($this->once()) ->method('linkToRoute') ->willReturn('url-to-image'); @@ -121,12 +115,14 @@ public function testGetImageUrl(): void { } public function testGetImageUrlDefault(): void { - $this->config->expects($this->exactly(2)) + $this->appConfig->expects($this->once()) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(0); + $this->config->expects($this->once()) ->method('getAppValue') - ->willReturnMap([ - ['theming', 'cachebuster', '0', '0'], - ['theming', 'logoMime', '', ''], - ]); + ->with('theming', 'logoMime', '') + ->willReturn(''); $this->urlGenerator->expects($this->once()) ->method('imagePath') ->with('core', 'logo/logo.png') @@ -136,12 +132,14 @@ public function testGetImageUrlDefault(): void { public function testGetImageUrlAbsolute(): void { $this->checkImagick(); - $this->config->expects($this->exactly(2)) + $this->appConfig->expects($this->once()) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(0); + $this->config->expects($this->once()) ->method('getAppValue') - ->willReturnMap([ - ['theming', 'cachebuster', '0', '0'], - ['theming', 'logoMime', '', ''], - ]); + ->with('theming', 'logoMime', '') + ->willReturn(''); $this->urlGenerator->expects($this->any()) ->method('getAbsoluteUrl') ->willReturn('url-to-image-absolute?v=0'); @@ -149,15 +147,69 @@ public function testGetImageUrlAbsolute(): void { } public function testGetImage(): void { - $this->checkImagick(); $this->config->expects($this->once()) - ->method('getAppValue')->with('theming', 'logoMime', false) - ->willReturn('png'); + ->method('getAppValue')->with('theming', 'logoMime', '') + ->willReturn('image/png'); $file = $this->createMock(ISimpleFile::class); $this->mockGetImage('logo', $file); $this->assertEquals($file, $this->imageManager->getImage('logo', false)); } + public function testGetImageSvgToSvg(): void { + $this->config->expects($this->once()) + ->method('getAppValue')->with('theming', 'logoMime', '') + ->willReturn('image/svg+xml'); + $folder = $this->createMock(ISimpleFolder::class); + $file = $this->createMock(ISimpleFile::class); + $folder->expects($this->once()) + ->method('fileExists') + ->with('logo') + ->willReturn(true); + $folder->expects($this->once()) + ->method('getFile') + ->with('logo') + ->willReturn($file); + $this->rootFolder->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willReturn($folder); + $this->assertEquals($file, $this->imageManager->getImage('logo', true)); + } + + public function testGetImageSvgToPng(): void { + $this->checkImagick(); + $this->config->expects($this->once()) + ->method('getAppValue')->with('theming', 'logoMime', '') + ->willReturn('image/svg+xml'); + $folder = $this->createMock(ISimpleFolder::class); + $svgFile = $this->createMock(ISimpleFile::class); + $pngFile = $this->createMock(ISimpleFile::class); + $svgFile->expects($this->once()) + ->method('getContent') + ->willReturn(file_get_contents(__DIR__ . '/../../../core/img/logo/logo.svg')); + $folder->expects($this->exactly(2)) + ->method('fileExists') + ->willReturnMap([ + ['logo', true], + ['logo.png', false], + ]); + $folder->expects($this->once()) + ->method('getFile') + ->with('logo') + ->willReturn($svgFile); + $folder->expects($this->once()) + ->method('newFile') + ->with('logo.png') + ->willReturn($pngFile); + $pngFile->expects($this->once()) + ->method('putContent'); + $this->rootFolder->expects($this->once()) + ->method('getFolder') + ->with('images') + ->willReturn($folder); + $this->assertEquals($pngFile, $this->imageManager->getImage('logo', false)); + } + public function testGetImageUnset(): void { $this->expectException(NotFoundException::class); @@ -170,10 +222,10 @@ public function testGetImageUnset(): void { public function testGetCacheFolder(): void { $folder = $this->createMock(ISimpleFolder::class); - $this->config->expects($this->once()) - ->method('getAppValue') - ->with('theming', 'cachebuster', '0') - ->willReturn('0'); + $this->appConfig->expects($this->once()) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(0); $this->rootFolder->expects($this->once()) ->method('getFolder') ->with('0') @@ -182,10 +234,10 @@ public function testGetCacheFolder(): void { } public function testGetCacheFolderCreate(): void { $folder = $this->createMock(ISimpleFolder::class); - $this->config->expects($this->exactly(2)) - ->method('getAppValue') - ->with('theming', 'cachebuster', '0') - ->willReturn('0'); + $this->appConfig->expects($this->exactly(2)) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(0); $this->rootFolder->expects($this->exactly(2)) ->method('getFolder') ->with('0') @@ -261,10 +313,10 @@ public function testSetCachedImageCreate(): void { private function setupCacheFolder() { $folder = $this->createMock(ISimpleFolder::class); - $this->config->expects($this->once()) - ->method('getAppValue') - ->with('theming', 'cachebuster', '0') - ->willReturn('0'); + $this->appConfig->expects($this->once()) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(0); $this->rootFolder->expects($this->once()) ->method('getFolder') ->with('0') @@ -286,10 +338,10 @@ public function testCleanup(): void { $folders[0]->expects($this->once())->method('delete'); $folders[1]->expects($this->once())->method('delete'); $folders[2]->expects($this->never())->method('delete'); - $this->config->expects($this->once()) - ->method('getAppValue') - ->with('theming', 'cachebuster', '0') - ->willReturn('2'); + $this->appConfig->expects($this->once()) + ->method('getAppValueInt') + ->with('cachebuster') + ->willReturn(2); $this->rootFolder->expects($this->once()) ->method('getDirectoryListing') ->willReturn($folders); diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml index 82d21c1f27e1d..9f538d32c484b 100644 --- a/build/psalm-baseline.xml +++ b/build/psalm-baseline.xml @@ -2594,11 +2594,6 @@ - - - - - diff --git a/dist/theming-settings-admin.css b/dist/theming-settings-admin.css index 9c5e4e1330624..f3bbb4ca8798d 100644 --- a/dist/theming-settings-admin.css +++ b/dist/theming-settings-admin.css @@ -1,5 +1,5 @@ /* extracted by css-entry-points-plugin */ -@import './theming-theming-settings-admin-ljDcYh_G.chunk.css'; +@import './theming-theming-settings-admin-B-lUvcqL.chunk.css'; @import './common-Web-C_oBIsvc.chunk.css'; @import './common-ArrowRight-D7L4ZBkR.chunk.css'; @import './common-mdi-Jq77EThs.chunk.css'; diff --git a/dist/theming-settings-admin.mjs b/dist/theming-settings-admin.mjs index 738ab351439b1..0431cb547c2ce 100644 --- a/dist/theming-settings-admin.mjs +++ b/dist/theming-settings-admin.mjs @@ -1,2 +1,2 @@ -import{b as P,U as K,l as b,z as $,o as p,c as _,w as g,g as v,t as y,u as e,k as m,j as U,f as C,h as B,a8 as N,a9 as Q,Z as te,aa as le,q as ne,a5 as L,y as k,Q as ie,i as oe,v as X,a7 as se,p as re,F as Z,e as ue}from"./preload-helper-CX9gtE7n.chunk.mjs";import{l as V,_ as A}from"./public-C1mLBHT3.chunk.mjs";import{n as de,o as Y,p as me,N as ce}from"./mdi-BjKyjJ9m.chunk.mjs";import{c as T,i as R}from"./index-BpWtOFbq.chunk.mjs";import{a as x}from"./index-C1xmmKTZ-BdqLiU2K.chunk.mjs";import{t}from"./translation-DoG5ZELJ-CPJIGC2H.chunk.mjs";import{b as w}from"./index-CziSTDUD.chunk.mjs";import{N as q}from"./NcCheckboxRadioSwitch-D0gFwEVl-DUWN1FjH.chunk.mjs";import{N as pe}from"./index-Ck6YKth1.chunk.mjs";import{N as G}from"./ContentCopy-DS0QzQtq.chunk.mjs";import{A as ge,l as D,g as he,r as S}from"./refreshStyles-DppQGmxm.chunk.mjs";import{N as O}from"./TrashCanOutline-B-GxU5E3.chunk.mjs";import{_ as fe}from"./NcTextField.vue_vue_type_script_setup_true_lang-B-4HNjYH-CTxKDSgI.chunk.mjs";import{w as ee}from"./index-DZVjGEW7.chunk.mjs";import{N as M}from"./ArrowRight-JDdFcric.chunk.mjs";import ye from"./index-blkJtiu8.chunk.mjs";import{N as z}from"./Web-lLWc6zap.chunk.mjs";import"./modulepreload-polyfill-BxzAKjcf.chunk.mjs";import"./util-BUyb4W9M.chunk.mjs";import"./index-C6zIcU-d.chunk.mjs";import"./NcModal-kyWZ3UFC-CV6Hvf6d.chunk.mjs";import"./NcInputField-CPL-a_MM-WQA5jsOf.chunk.mjs";import"./colors-BfjxNgsx-CknPG731.chunk.mjs";const ve={class:"info-note"},be=["aria-labelledby"],_e=["id"],ke={class:"info-note"},we=P({__name:"AdminSectionAppMenu",setup(l){const d=K(),{defaultApps:a}=V("theming","adminThemingParameters"),n=V("core","apps").map(({id:r,name:s,icon:u})=>({label:s,id:r,icon:u})),i=b(a.map(r=>n.find(s=>s.id===r)).filter(Boolean));$(i,async r=>{try{await c("defaultApps",r.map(s=>s.id))}catch(s){D.error("Could not set global default apps",{error:s}),x(t("theming","Could not set global default apps"))}});const o=b(a.length>0);$(o,r=>{i.value=r?n.filter(s=>["dashboard","files"].includes(s.id)):[]});async function c(r,s){const u=w("/apps/theming/ajax/updateAppMenu");return await T.put(u,{setting:r,value:s})}return(r,s)=>(p(),_(e(G),{name:e(t)("theming","Navigation bar settings")},{default:g(()=>[v("h3",null,y(e(t)("theming","Default app")),1),v("p",ve,y(e(t)("theming","The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.")),1),m(e(q),{modelValue:o.value,"onUpdate:modelValue":s[0]||(s[0]=u=>o.value=u),type:"switch"},{default:g(()=>[U(y(e(t)("theming","Use custom default app")),1)]),_:1},8,["modelValue"]),o.value?(p(),C("section",{key:0,"aria-labelledby":e(d)},[v("h4",{id:e(d)},y(e(t)("theming","Global default app")),9,_e),m(e(pe),{modelValue:i.value,"onUpdate:modelValue":s[1]||(s[1]=u=>i.value=u),keepOpen:"",multiple:"",placeholder:e(t)("theming","Global default apps"),options:e(n)},null,8,["modelValue","placeholder","options"]),v("h5",null,y(e(t)("theming","Default app priority")),1),v("p",ke,y(e(t)("theming","If an app is not enabled for a user, the next app with lower priority is used.")),1),m(ge,{modelValue:i.value,"onUpdate:modelValue":s[2]||(s[2]=u=>i.value=u)},null,8,["modelValue"])],8,be)):B("",!0)]),_:1},8,["name"]))}}),Ve=A(we,[["__scopeId","data-v-a9baec70"]]);function E(l,d,a){let n=!1;const i=b(!1),o=b(!1);ee(d,async()=>{if(!i.value){if(n){n=!1;return}i.value=!0,o.value=!1;try{await Fe(N(l),N(d)),o.value=!0,window.setTimeout(()=>{o.value=!1},2e3)}finally{i.value=!1}}},{debounce:800,flush:"sync"});async function c(){i.value=!0,o.value=!1;try{const r=await Te(N(l));r&&te(a)&&!le(a)&&(a.value=r),n=!0,d.value=N(a)}finally{i.value=!1}}return{isSaving:Q(i),isSaved:Q(o),reset:c}}async function Fe(l,d){const a=w("/apps/theming/ajax/updateStylesheet");try{await T.post(a,{setting:l,value:String(d)})}catch(n){throw D.error("Failed to save changes",{error:n,setting:l,value:d}),R(n)&&n.response?.data?.data?.message&&x(n.response.data.data.message),n}}async function Te(l){const d=w("/apps/theming/ajax/undoChanges");try{const{data:a}=await T.post(d,{setting:l});return a.data.value}catch(a){if(D.error("Failed to reset theming value",{error:a,setting:l}),R(a)&&a.response?.data?.data?.message)return x(a.response.data.data.message),!1;throw a}}const I=P({__name:"TextField",props:{name:{},label:{},defaultValue:{},type:{default:"text"}},setup(l){const d=l,a=b(V("theming","adminThemingParameters")[d.name].toString()),{isSaving:n,isSaved:i,reset:o}=E(L(()=>d.name),a,L(()=>d.defaultValue));return ee(a,c=>{if(d.type==="url"&&c.includes('"'))try{const r=new URL(c);r.pathname=r.pathname.replaceAll(/"/g,"%22"),a.value=r.href}catch{return}},{debounce:600}),(c,r)=>(p(),_(e(fe),{modelValue:a.value,"onUpdate:modelValue":r[0]||(r[0]=s=>a.value=s),label:l.label,readonly:e(n),success:e(i),type:l.type,showTrailingButton:a.value!==l.defaultValue,trailingButtonIcon:l.defaultValue?"undo":"close",onTrailingButtonClick:e(o)},ne({_:2},[e(n)?{name:"icon",fn:g(()=>[m(e(O))]),key:"0"}:void 0]),1032,["modelValue","label","readonly","success","type","showTrailingButton","trailingButtonIcon","onTrailingButtonClick"]))}}),Ue=P({__name:"AdminSectionTheming",setup(l){const d=V("theming","adminThemingInfo");return(a,n)=>(p(),_(e(G),{name:e(t)("theming","Theming"),description:e(t)("theming","Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users."),docUrl:e(d).docUrl,"data-admin-theming-settings":""},{default:g(()=>[v("div",{class:k(a.$style.adminSectionTheming)},[m(I,{name:"name",label:e(t)("theming","Name"),defaultValue:"Nextcloud",maxlength:"250"},null,8,["label"]),m(I,{name:"url",label:e(t)("theming","Web link"),defaultValue:"https://nextcloud.com",placeholder:"https://…",type:"url",maxlength:"500"},null,8,["label"]),m(I,{name:"slogan",label:e(t)("theming","Slogan"),defaultValue:e(t)("settings","a safe home for all your data"),maxlength:"500"},null,8,["label","defaultValue"]),n[0]||(n[0]=v("hr",null,null,-1)),m(I,{name:"legalNoticeUrl",label:e(t)("theming","Legal notice link"),defaultValue:"",type:"url",placeholder:"https://…",maxlength:"500"},null,8,["label"]),m(I,{name:"privacyPolicyUrl",label:e(t)("theming","Privacy policy link"),defaultValue:"",type:"url",placeholder:"https://…",maxlength:"500"},null,8,["label"])],2)]),_:1},8,["name","description","docUrl"]))}}),xe="_adminSectionTheming_1p8pd_2",Pe={adminSectionTheming:xe},Se={$style:Pe},Ce=A(Ue,[["__cssModules",Se]]),Ie=P({__name:"ColorPickerField",props:{name:{},label:{},defaultValue:{}},emits:["updated"],setup(l,{emit:d}){const a=l,n=d,i=K(),o=b(V("theming","adminThemingParameters")[a.name]),c=b(o.value);$(o,h=>{c.value=h});const{isSaving:r,reset:s}=E(()=>a.name,o,L(a,"defaultValue"));$(r,h=>!h&&n("updated"));const u=X(()=>he(c.value));return(h,f)=>(p(),C("div",{class:k(h.$style.colorPickerField)},[v("div",{class:k(h.$style.colorPickerField__row)},[m(e(ye),{id:e(i),modelValue:c.value,"onUpdate:modelValue":f[0]||(f[0]=F=>c.value=F),advancedFields:"",onSubmit:f[1]||(f[1]=F=>o.value=F)},{default:g(()=>[m(e(M),{class:k(h.$style.colorPickerField__button),size:"large",variant:"primary",style:ie({"--color-primary-element":c.value,"--color-primary-element-text":u.value,"--color-primary-element-hover":"color-mix(in srgb, var(--color-primary-element) 70%, var(--color-primary-element-text))"})},{icon:g(()=>[e(r)?(p(),_(e(O),{key:0,appearance:u.value==="#ffffff"?"light":"dark"},null,8,["appearance"])):(p(),_(e(z),{key:1,path:e(de)},null,8,["path"]))]),default:g(()=>[U(" "+y(l.label),1)]),_:1},8,["class","style"])]),_:1},8,["id","modelValue"]),o.value!==l.defaultValue?(p(),_(e(M),{key:0,variant:"tertiary","aria-label":e(t)("theming","Reset to default"),title:e(t)("theming","Reset to default"),onClick:e(s)},{icon:g(()=>[m(e(z),{path:e(Y)},null,8,["path"])]),_:1},8,["aria-label","title","onClick"])):B("",!0)],2),v("p",{class:k(h.$style.colorPickerField__description)},[oe(h.$slots,"description")],2)],2))}}),$e="_colorPickerField_o0yey_2",Ae="_colorPickerField__row_o0yey_7",Ne="_colorPickerField__button_o0yey_14",je="_colorPickerField__description_o0yey_18",Be={colorPickerField:$e,colorPickerField__row:Ae,colorPickerField__button:Ne,colorPickerField__description:je},Me={$style:Be},H=A(Ie,[["__cssModules",Me]]),ze=["aria-label"],Re=["disabled","name"],De=P({__name:"FileInputField",props:{name:{},label:{},disabled:{type:Boolean}},emits:["updated"],setup(l,{emit:d}){se(f=>({v64992c7e:r.value}));const a=l,n=d,i=b(!1),o=b(V("theming","adminThemingParameters")[a.name+"Mime"]),c=re("input"),r=X(()=>`url(${w("/apps/theming/image/{key}",{key:a.name})}?v=${Date.now()}&m=${encodeURIComponent(o.value)})`);function s(){i.value||(c.value.files=null,c.value.click())}async function u(){if(!c.value.files?.[0])return;const f=c.value.files[0];if(f.type&&!f.type.startsWith("image/")){x(t("theming","Non image file selected"));return}i.value=!0;const F=new FormData;F.append("image",f),F.append("key",a.name);try{await T.post(w("/apps/theming/ajax/uploadImage"),F,{headers:{"Content-Type":"multipart/form-data"}}),o.value=f.type,n("updated")}catch(W){if(R(W)&&W.response?.status===422){const ae=W.response.data?.data?.message;x(ae||t("theming","Failed to upload image"))}else x(t("theming","Failed to upload image"))}finally{i.value=!1,c.value.value=""}}async function h(){if(!i.value){i.value=!0;try{await T.post(w("/apps/theming/ajax/undoChanges"),{setting:a.name}),o.value="",n("updated")}finally{i.value=!1}}}return(f,F)=>(p(),C("div",{class:k(f.$style.fileInputField)},[m(e(M),{class:k(f.$style.fileInputField__button),alignment:"start",disabled:l.disabled,size:"large",onClick:s},{icon:g(()=>[i.value?(p(),_(e(O),{key:0})):(p(),_(e(z),{key:1,path:e(me)},null,8,["path"]))]),default:g(()=>[U(" "+y(l.label),1)]),_:1},8,["class","disabled"]),o.value.startsWith("image/")?(p(),C("div",{key:0,class:k(f.$style.fileInputField__preview),role:"img","aria-label":e(t)("theming","Preview of the selected image")},null,10,ze)):B("",!0),o.value&&!l.disabled?(p(),_(e(M),{key:1,"aria-label":e(t)("theming","Reset to default"),title:e(t)("theming","Reset to default"),size:"large",variant:"tertiary",onClick:h},{icon:g(()=>[m(e(z),{path:e(Y)},null,8,["path"])]),_:1},8,["aria-label","title"])):B("",!0),v("input",{ref:"input",class:"hidden-visually","aria-hidden":"true",disabled:l.disabled,type:"file",accept:"image/*",name:l.name,onChange:u},null,40,Re)],2))}}),We="_fileInputField_1u7zs_2",Le="_fileInputField__button_1u7zs_10",qe="_fileInputField__preview_1u7zs_14",Ge={fileInputField:We,fileInputField__button:Le,fileInputField__preview:qe},Oe={$style:Ge},j=A(De,[["__cssModules",Oe]]),Ee=P({__name:"AdminSectionThemingAdvanced",setup(l){const{defaultBackgroundColor:d}=V("theming","adminThemingInfo"),a=V("theming","adminThemingParameters"),n=b(a.disableUserTheming),{isSaving:i}=E("disableUserTheming",n,!1),o=b(!1),c=b(a.backgroundMime==="backgroundColor");$(c,r);async function r(s){o.value=!0;try{s?(await T.post(w("/apps/theming/ajax/undoChanges"),{setting:"background"}),await T.post(w("/apps/theming/ajax/updateStylesheet"),{setting:"backgroundMime",value:"backgroundColor"})):await T.post(w("/apps/theming/ajax/undoChanges"),{setting:"backgroundMime"}),await S()}catch(u){if(D.error("Failed to remove background image",{error:u}),R(u)&&u.response?.data?.data?.message){x(u.response.data.data.message);return}throw u}finally{o.value=!1}}return(s,u)=>(p(),_(e(G),{name:e(t)("theming","Background and color")},{default:g(()=>[v("div",{class:k(s.$style.adminSectionThemingAdvanced)},[m(H,{name:"primaryColor",label:e(t)("theming","Primary color"),defaultValue:"#00679e",onUpdated:e(S)},{description:g(()=>[U(y(e(t)("theming","Set the default primary color, used to highlight important elements."))+" "+y(e(t)("theming","The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements.")),1)]),_:1},8,["label","onUpdated"]),m(H,{name:"backgroundColor",label:e(t)("theming","Background color"),defaultValue:e(d),onUpdated:e(S)},{description:g(()=>[U(y(e(t)("theming","When no background image is set the background color will be used."))+" "+y(e(t)("theming","Otherwise the background color is by default generated from the background image, but can be adjusted to fine tune the color of the navigation icons.")),1)]),_:1},8,["label","defaultValue","onUpdated"]),m(e(q),{modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=h=>c.value=h),type:"switch",loading:o.value,description:e(t)("theming","Use a plain background color instead of a background image.")},{default:g(()=>[U(y(e(t)("theming","Remove background image")),1)]),_:1},8,["modelValue","loading","description"]),m(j,{name:"background",disabled:c.value,label:e(t)("theming","Background image"),onUpdated:e(S)},null,8,["disabled","label","onUpdated"]),m(j,{name:"favicon",label:e(t)("theming","Favicon")},null,8,["label"]),m(j,{name:"logo",label:e(t)("theming","Logo"),onUpdated:e(S)},null,8,["label","onUpdated"]),m(j,{name:"logoheader",label:e(t)("theming","Navigation bar logo"),onUpdated:e(S)},null,8,["label","onUpdated"]),u[2]||(u[2]=v("hr",null,null,-1)),m(e(q),{modelValue:n.value,"onUpdate:modelValue":u[1]||(u[1]=h=>n.value=h),type:"switch",loading:e(i),description:e(t)("theming","Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.")},{default:g(()=>[U(y(e(t)("theming","Disable user theming")),1)]),_:1},8,["modelValue","loading","description"])],2)]),_:1},8,["name"]))}}),Qe="_adminSectionThemingAdvanced_dyaj4_2",Ze={adminSectionThemingAdvanced:Qe},He={$style:Ze},Je=A(Ee,[["__cssModules",He]]),Ke=P({__name:"AdminTheming",setup(l){const{isThemeable:d,notThemeableErrorMessage:a}=V("theming","adminThemingInfo");return(n,i)=>(p(),C(Z,null,[e(d)?(p(),C(Z,{key:1},[m(Ce),m(Je)],64)):(p(),_(e(ce),{key:0,text:e(a),showAlert:"",type:"error"},null,8,["text"])),m(Ve)],64))}}),J=ue(Ke);J.config.idPrefix="settings",J.mount("#settings-admin-theming"); +import{b as x,U as X,l as v,z as $,o as p,c as _,w as g,g as b,t as f,u as e,k as m,j as T,f as C,h as M,a8 as j,a9 as Z,Z as te,aa as ne,q as ie,a5 as q,y as k,Q as oe,i as se,v as Y,a7 as re,p as ue,F as H,e as de}from"./preload-helper-CX9gtE7n.chunk.mjs";import{l as V,_ as A}from"./public-C1mLBHT3.chunk.mjs";import{n as me,o as ee,p as ce,N as pe}from"./mdi-BjKyjJ9m.chunk.mjs";import{c as F,i as D}from"./index-BpWtOFbq.chunk.mjs";import{a as U}from"./index-C1xmmKTZ-BdqLiU2K.chunk.mjs";import{t as l}from"./translation-DoG5ZELJ-CPJIGC2H.chunk.mjs";import{b as w}from"./index-CziSTDUD.chunk.mjs";import{N as G}from"./NcCheckboxRadioSwitch-D0gFwEVl-DUWN1FjH.chunk.mjs";import{N as ge}from"./index-Ck6YKth1.chunk.mjs";import{N as O}from"./ContentCopy-DS0QzQtq.chunk.mjs";import{A as he,l as W,g as fe,r as S}from"./refreshStyles-DppQGmxm.chunk.mjs";import{N as E}from"./TrashCanOutline-B-GxU5E3.chunk.mjs";import{_ as ye}from"./NcTextField.vue_vue_type_script_setup_true_lang-B-4HNjYH-CTxKDSgI.chunk.mjs";import{w as ae}from"./index-DZVjGEW7.chunk.mjs";import{N as z}from"./ArrowRight-JDdFcric.chunk.mjs";import ve from"./index-blkJtiu8.chunk.mjs";import{N as R}from"./Web-lLWc6zap.chunk.mjs";import"./modulepreload-polyfill-BxzAKjcf.chunk.mjs";import"./util-BUyb4W9M.chunk.mjs";import"./index-C6zIcU-d.chunk.mjs";import"./NcModal-kyWZ3UFC-CV6Hvf6d.chunk.mjs";import"./NcInputField-CPL-a_MM-WQA5jsOf.chunk.mjs";import"./colors-BfjxNgsx-CknPG731.chunk.mjs";const be={class:"info-note"},_e=["aria-labelledby"],ke=["id"],we={class:"info-note"},Ve=x({__name:"AdminSectionAppMenu",setup(n){const d=X(),{defaultApps:a}=V("theming","adminThemingParameters"),i=V("core","apps").map(({id:t,name:r,icon:u})=>({label:r,id:t,icon:u})),o=v(a.map(t=>i.find(r=>r.id===t)).filter(Boolean));$(o,async t=>{try{await c("defaultApps",t.map(r=>r.id))}catch(r){W.error("Could not set global default apps",{error:r}),U(l("theming","Could not set global default apps"))}});const s=v(a.length>0);$(s,t=>{o.value=t?i.filter(r=>["dashboard","files"].includes(r.id)):[]});async function c(t,r){const u=w("/apps/theming/ajax/updateAppMenu");return await F.put(u,{setting:t,value:r})}return(t,r)=>(p(),_(e(O),{name:e(l)("theming","Navigation bar settings")},{default:g(()=>[b("h3",null,f(e(l)("theming","Default app")),1),b("p",be,f(e(l)("theming","The default app is the app that is e.g. opened after login or when the logo in the menu is clicked.")),1),m(e(G),{modelValue:s.value,"onUpdate:modelValue":r[0]||(r[0]=u=>s.value=u),type:"switch"},{default:g(()=>[T(f(e(l)("theming","Use custom default app")),1)]),_:1},8,["modelValue"]),s.value?(p(),C("section",{key:0,"aria-labelledby":e(d)},[b("h4",{id:e(d)},f(e(l)("theming","Global default app")),9,ke),m(e(ge),{modelValue:o.value,"onUpdate:modelValue":r[1]||(r[1]=u=>o.value=u),keepOpen:"",multiple:"",placeholder:e(l)("theming","Global default apps"),options:e(i)},null,8,["modelValue","placeholder","options"]),b("h5",null,f(e(l)("theming","Default app priority")),1),b("p",we,f(e(l)("theming","If an app is not enabled for a user, the next app with lower priority is used.")),1),m(he,{modelValue:o.value,"onUpdate:modelValue":r[2]||(r[2]=u=>o.value=u)},null,8,["modelValue"])],8,_e)):M("",!0)]),_:1},8,["name"]))}}),Fe=A(Ve,[["__scopeId","data-v-a9baec70"]]);function Q(n,d,a){let i=!1;const o=v(!1),s=v(!1);ae(d,async()=>{if(!o.value){if(i){i=!1;return}o.value=!0,s.value=!1;try{await Te(j(n),j(d)),s.value=!0,window.setTimeout(()=>{s.value=!1},2e3)}finally{o.value=!1}}},{debounce:800,flush:"sync"});async function c(){o.value=!0,s.value=!1;try{const t=await Ue(j(n));t&&te(a)&&!ne(a)&&(a.value=t),i=!0,d.value=j(a)}finally{o.value=!1}}return{isSaving:Z(o),isSaved:Z(s),reset:c}}async function Te(n,d){const a=w("/apps/theming/ajax/updateStylesheet");try{await F.post(a,{setting:n,value:String(d)})}catch(i){throw W.error("Failed to save changes",{error:i,setting:n,value:d}),D(i)&&i.response?.data?.data?.message&&U(i.response.data.data.message),i}}async function Ue(n){const d=w("/apps/theming/ajax/undoChanges");try{const{data:a}=await F.post(d,{setting:n});return a.data.value}catch(a){if(W.error("Failed to reset theming value",{error:a,setting:n}),D(a)&&a.response?.data?.data?.message)return U(a.response.data.data.message),!1;throw a}}const I=x({__name:"TextField",props:{name:{},label:{},defaultValue:{},type:{default:"text"}},setup(n){const d=n,a=v(V("theming","adminThemingParameters")[d.name].toString()),{isSaving:i,isSaved:o,reset:s}=Q(q(()=>d.name),a,q(()=>d.defaultValue));return ae(a,c=>{if(d.type==="url"&&c.includes('"'))try{const t=new URL(c);t.pathname=t.pathname.replaceAll(/"/g,"%22"),a.value=t.href}catch{return}},{debounce:600}),(c,t)=>(p(),_(e(ye),{modelValue:a.value,"onUpdate:modelValue":t[0]||(t[0]=r=>a.value=r),label:n.label,readonly:e(i),success:e(o),type:n.type,showTrailingButton:a.value!==n.defaultValue,trailingButtonIcon:n.defaultValue?"undo":"close",onTrailingButtonClick:e(s)},ie({_:2},[e(i)?{name:"icon",fn:g(()=>[m(e(E))]),key:"0"}:void 0]),1032,["modelValue","label","readonly","success","type","showTrailingButton","trailingButtonIcon","onTrailingButtonClick"]))}}),xe=x({__name:"AdminSectionTheming",setup(n){const d=V("theming","adminThemingInfo");return(a,i)=>(p(),_(e(O),{name:e(l)("theming","Theming"),description:e(l)("theming","Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users."),docUrl:e(d).docUrl,"data-admin-theming-settings":""},{default:g(()=>[b("div",{class:k(a.$style.adminSectionTheming)},[m(I,{name:"name",label:e(l)("theming","Name"),defaultValue:"Nextcloud",maxlength:"250"},null,8,["label"]),m(I,{name:"url",label:e(l)("theming","Web link"),defaultValue:"https://nextcloud.com",placeholder:"https://…",type:"url",maxlength:"500"},null,8,["label"]),m(I,{name:"slogan",label:e(l)("theming","Slogan"),defaultValue:e(l)("settings","a safe home for all your data"),maxlength:"500"},null,8,["label","defaultValue"]),i[0]||(i[0]=b("hr",null,null,-1)),m(I,{name:"legalNoticeUrl",label:e(l)("theming","Legal notice link"),defaultValue:"",type:"url",placeholder:"https://…",maxlength:"500"},null,8,["label"]),m(I,{name:"privacyPolicyUrl",label:e(l)("theming","Privacy policy link"),defaultValue:"",type:"url",placeholder:"https://…",maxlength:"500"},null,8,["label"])],2)]),_:1},8,["name","description","docUrl"]))}}),Pe="_adminSectionTheming_1p8pd_2",Se={adminSectionTheming:Pe},Ce={$style:Se},Ie=A(xe,[["__cssModules",Ce]]),$e=x({__name:"ColorPickerField",props:{name:{},label:{},defaultValue:{}},emits:["updated"],setup(n,{emit:d}){const a=n,i=d,o=X(),s=v(V("theming","adminThemingParameters")[a.name]),c=v(s.value);$(s,h=>{c.value=h});const{isSaving:t,reset:r}=Q(()=>a.name,s,q(a,"defaultValue"));$(t,h=>!h&&i("updated"));const u=Y(()=>fe(c.value));return(h,P)=>(p(),C("div",{class:k(h.$style.colorPickerField)},[b("div",{class:k(h.$style.colorPickerField__row)},[m(e(ve),{id:e(o),modelValue:c.value,"onUpdate:modelValue":P[0]||(P[0]=y=>c.value=y),advancedFields:"",onSubmit:P[1]||(P[1]=y=>s.value=y)},{default:g(()=>[m(e(z),{class:k(h.$style.colorPickerField__button),size:"large",variant:"primary",style:oe({"--color-primary-element":c.value,"--color-primary-element-text":u.value,"--color-primary-element-hover":"color-mix(in srgb, var(--color-primary-element) 70%, var(--color-primary-element-text))"})},{icon:g(()=>[e(t)?(p(),_(e(E),{key:0,appearance:u.value==="#ffffff"?"light":"dark"},null,8,["appearance"])):(p(),_(e(R),{key:1,path:e(me)},null,8,["path"]))]),default:g(()=>[T(" "+f(n.label),1)]),_:1},8,["class","style"])]),_:1},8,["id","modelValue"]),s.value!==n.defaultValue?(p(),_(e(z),{key:0,variant:"tertiary","aria-label":e(l)("theming","Reset to default"),title:e(l)("theming","Reset to default"),onClick:e(r)},{icon:g(()=>[m(e(R),{path:e(ee)},null,8,["path"])]),_:1},8,["aria-label","title","onClick"])):M("",!0)],2),b("p",{class:k(h.$style.colorPickerField__description)},[se(h.$slots,"description")],2)],2))}}),Ae="_colorPickerField_o0yey_2",Ne="_colorPickerField__row_o0yey_7",je="_colorPickerField__button_o0yey_14",Be="_colorPickerField__description_o0yey_18",Me={colorPickerField:Ae,colorPickerField__row:Ne,colorPickerField__button:je,colorPickerField__description:Be},ze={$style:Me},J=A($e,[["__cssModules",ze]]),Re=["aria-label"],De=["disabled","name"],We=x({__name:"FileInputField",props:{name:{},label:{},disabled:{type:Boolean}},emits:["updated"],setup(n,{emit:d}){re(y=>({v6c51c3da:r.value}));const a=n,i=d,o=v(!1),s=v(V("theming","adminThemingParameters")[a.name+"Mime"]),c=v(Date.now()),t=ue("input"),r=Y(()=>`url(${w("/apps/theming/image/{key}",{key:a.name})}?v=${c.value}&m=${encodeURIComponent(s.value)})`);function u(){o.value||(t.value.files=null,t.value.click())}async function h(){if(!t.value.files?.[0])return;const y=t.value.files[0];if(y.type&&!y.type.startsWith("image/")){U(l("theming","Non image file selected"));return}o.value=!0;const N=new FormData;N.append("image",y),N.append("key",a.name);try{await F.post(w("/apps/theming/ajax/uploadImage"),N,{headers:{"Content-Type":"multipart/form-data"}}),s.value=y.type,c.value=Date.now(),i("updated")}catch(L){if(D(L)&&L.response?.status===422){const le=L.response.data?.data?.message;U(le||l("theming","Failed to upload image"))}else U(l("theming","Failed to upload image"))}finally{o.value=!1,t.value.value=""}}async function P(){if(!o.value){o.value=!0;try{await F.post(w("/apps/theming/ajax/undoChanges"),{setting:a.name}),s.value="",i("updated")}finally{o.value=!1}}}return(y,N)=>(p(),C("div",{class:k(y.$style.fileInputField)},[m(e(z),{class:k(y.$style.fileInputField__button),alignment:"start",disabled:n.disabled,size:"large",onClick:u},{icon:g(()=>[o.value?(p(),_(e(E),{key:0})):(p(),_(e(R),{key:1,path:e(ce)},null,8,["path"]))]),default:g(()=>[T(" "+f(n.label),1)]),_:1},8,["class","disabled"]),s.value.startsWith("image/")?(p(),C("div",{key:0,class:k(y.$style.fileInputField__preview),role:"img","aria-label":e(l)("theming","Preview of the selected image")},null,10,Re)):M("",!0),s.value&&!n.disabled?(p(),_(e(z),{key:1,"aria-label":e(l)("theming","Reset to default"),title:e(l)("theming","Reset to default"),size:"large",variant:"tertiary",onClick:P},{icon:g(()=>[m(e(R),{path:e(ee)},null,8,["path"])]),_:1},8,["aria-label","title"])):M("",!0),b("input",{ref:"input",class:"hidden-visually","aria-hidden":"true",disabled:n.disabled,type:"file",accept:"image/*",name:n.name,onChange:h},null,40,De)],2))}}),Le="_fileInputField_1u7zs_2",qe="_fileInputField__button_1u7zs_10",Ge="_fileInputField__preview_1u7zs_14",Oe={fileInputField:Le,fileInputField__button:qe,fileInputField__preview:Ge},Ee={$style:Oe},B=A(We,[["__cssModules",Ee]]),Qe=x({__name:"AdminSectionThemingAdvanced",setup(n){const{defaultBackgroundColor:d}=V("theming","adminThemingInfo"),a=V("theming","adminThemingParameters"),i=v(a.disableUserTheming),{isSaving:o}=Q("disableUserTheming",i,!1),s=v(!1),c=v(a.backgroundMime==="backgroundColor");$(c,t);async function t(r){s.value=!0;try{r?(await F.post(w("/apps/theming/ajax/undoChanges"),{setting:"background"}),await F.post(w("/apps/theming/ajax/updateStylesheet"),{setting:"backgroundMime",value:"backgroundColor"})):await F.post(w("/apps/theming/ajax/undoChanges"),{setting:"backgroundMime"}),await S()}catch(u){if(W.error("Failed to remove background image",{error:u}),D(u)&&u.response?.data?.data?.message){U(u.response.data.data.message);return}throw u}finally{s.value=!1}}return(r,u)=>(p(),_(e(O),{name:e(l)("theming","Background and color")},{default:g(()=>[b("div",{class:k(r.$style.adminSectionThemingAdvanced)},[m(J,{name:"primaryColor",label:e(l)("theming","Primary color"),defaultValue:"#00679e",onUpdated:e(S)},{description:g(()=>[T(f(e(l)("theming","Set the default primary color, used to highlight important elements."))+" "+f(e(l)("theming","The color used for elements such as primary buttons might differ a bit as it gets adjusted to fulfill accessibility requirements.")),1)]),_:1},8,["label","onUpdated"]),m(J,{name:"backgroundColor",label:e(l)("theming","Background color"),defaultValue:e(d),onUpdated:e(S)},{description:g(()=>[T(f(e(l)("theming","When no background image is set the background color will be used."))+" "+f(e(l)("theming","Otherwise the background color is by default generated from the background image, but can be adjusted to fine tune the color of the navigation icons.")),1)]),_:1},8,["label","defaultValue","onUpdated"]),m(e(G),{modelValue:c.value,"onUpdate:modelValue":u[0]||(u[0]=h=>c.value=h),type:"switch",loading:s.value,description:e(l)("theming","Use a plain background color instead of a background image.")},{default:g(()=>[T(f(e(l)("theming","Remove background image")),1)]),_:1},8,["modelValue","loading","description"]),m(B,{name:"background",disabled:c.value,label:e(l)("theming","Background image"),onUpdated:e(S)},null,8,["disabled","label","onUpdated"]),m(B,{name:"favicon",label:e(l)("theming","Favicon")},null,8,["label"]),m(B,{name:"logo",label:e(l)("theming","Logo"),onUpdated:e(S)},null,8,["label","onUpdated"]),m(B,{name:"logoheader",label:e(l)("theming","Navigation bar logo"),onUpdated:e(S)},null,8,["label","onUpdated"]),u[2]||(u[2]=b("hr",null,null,-1)),m(e(G),{modelValue:i.value,"onUpdate:modelValue":u[1]||(u[1]=h=>i.value=h),type:"switch",loading:e(o),description:e(l)("theming","Although you can select and customize your instance, users can change their background and colors. If you want to enforce your customization, you can toggle this on.")},{default:g(()=>[T(f(e(l)("theming","Disable user theming")),1)]),_:1},8,["modelValue","loading","description"])],2)]),_:1},8,["name"]))}}),Ze="_adminSectionThemingAdvanced_dyaj4_2",He={adminSectionThemingAdvanced:Ze},Je={$style:He},Ke=A(Qe,[["__cssModules",Je]]),Xe=x({__name:"AdminTheming",setup(n){const{isThemeable:d,notThemeableErrorMessage:a}=V("theming","adminThemingInfo");return(i,o)=>(p(),C(H,null,[e(d)?(p(),C(H,{key:1},[m(Ie),m(Ke)],64)):(p(),_(e(pe),{key:0,text:e(a),showAlert:"",type:"error"},null,8,["text"])),m(Fe)],64))}}),K=de(Xe);K.config.idPrefix="settings",K.mount("#settings-admin-theming"); //# sourceMappingURL=theming-settings-admin.mjs.map diff --git a/dist/theming-settings-admin.mjs.map b/dist/theming-settings-admin.mjs.map index 8ab9c9518e21c..43be94e8a0d11 100644 --- a/dist/theming-settings-admin.mjs.map +++ b/dist/theming-settings-admin.mjs.map @@ -1 +1 @@ -{"version":3,"file":"theming-settings-admin.mjs","sources":["../build/frontend/apps/theming/src/components/AdminSectionAppMenu.vue","../build/frontend/apps/theming/src/composables/useAdminThemingValue.ts","../build/frontend/apps/theming/src/components/admin/TextField.vue","../build/frontend/apps/theming/src/components/AdminSectionTheming.vue","../build/frontend/apps/theming/src/components/admin/ColorPickerField.vue","../build/frontend/apps/theming/src/components/admin/FileInputField.vue","../build/frontend/apps/theming/src/components/AdminSectionThemingAdvanced.vue","../build/frontend/apps/theming/src/views/AdminTheming.vue","../build/frontend/apps/theming/src/settings-admin.ts"],"sourcesContent":["\n\n\n\n\n\n\n","/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { MaybeRef, MaybeRefOrGetter, Ref } from 'vue'\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { generateUrl } from '@nextcloud/router'\nimport { watchDebounced } from '@vueuse/core'\nimport { isReadonly, isRef, readonly, ref, toValue } from 'vue'\nimport { logger } from '../utils/logger.ts'\n\n/**\n * @param name - The property name\n * @param modelValue - The model value\n * @param defaultValue - The default value\n */\nexport function useAdminThemingValue(name: MaybeRefOrGetter, modelValue: Ref, defaultValue: MaybeRef) {\n\tlet resetted = false\n\tconst isSaving = ref(false)\n\tconst isSaved = ref(false)\n\n\twatchDebounced(modelValue, async () => {\n\t\tif (isSaving.value) {\n\t\t\treturn\n\t\t}\n\n\t\tif (resetted) {\n\t\t\tresetted = false\n\t\t\treturn\n\t\t}\n\n\t\tisSaving.value = true\n\t\tisSaved.value = false\n\t\ttry {\n\t\t\tawait setValue(toValue(name), toValue(modelValue))\n\t\t\tisSaved.value = true\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tisSaved.value = false\n\t\t\t}, 2000)\n\t\t} finally {\n\t\t\tisSaving.value = false\n\t\t}\n\t}, { debounce: 800, flush: 'sync' })\n\n\t/**\n\t * Reset to default value\n\t */\n\tasync function reset() {\n\t\tisSaving.value = true\n\t\tisSaved.value = false\n\t\ttry {\n\t\t\tconst result = await resetValue(toValue(name))\n\t\t\tif (result && isRef(defaultValue) && !isReadonly(defaultValue)) {\n\t\t\t\tdefaultValue.value = result as T\n\t\t\t}\n\t\t\tresetted = true\n\t\t\tmodelValue.value = toValue(defaultValue)\n\t\t} finally {\n\t\t\tisSaving.value = false\n\t\t}\n\t}\n\n\treturn {\n\t\tisSaving: readonly(isSaving),\n\t\tisSaved: readonly(isSaved),\n\t\treset,\n\t}\n}\n\n/**\n * @param setting - The setting name\n * @param value - The setting value\n */\nasync function setValue(setting: string, value: unknown) {\n\tconst url = generateUrl('/apps/theming/ajax/updateStylesheet')\n\ttry {\n\t\tawait axios.post(url, {\n\t\t\tsetting,\n\t\t\tvalue: String(value),\n\t\t})\n\t} catch (error) {\n\t\tlogger.error('Failed to save changes', { error, setting, value })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * Reset theming value for a given setting\n *\n * @param setting - The setting name\n */\nasync function resetValue(setting: string) {\n\tconst url = generateUrl('/apps/theming/ajax/undoChanges')\n\ttry {\n\t\tconst { data } = await axios.post<{ data: { value?: string } }>(url, { setting })\n\t\treturn data.data.value\n\t} catch (error) {\n\t\tlogger.error('Failed to reset theming value', { error, setting })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t\treturn false\n\t\t}\n\t\tthrow error\n\t}\n}\n","\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n","/*!\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport AdminTheming from './views/AdminTheming.vue'\n\nimport 'vite/modulepreload-polyfill'\n\nconst app = createApp(AdminTheming)\napp.config.idPrefix = 'settings'\napp.mount('#settings-admin-theming')\n"],"names":["idGlobalDefaultApp","useId","defaultApps","loadState","allApps","id","name","icon","selectedApps","ref","app","watch","value","saveSetting","error","logger","showError","t","hasCustomDefaultApp","checked","key","url","generateUrl","axios","_createBlock","_unref","NcSettingsSection","_createElementVNode","_hoisted_1","_toDisplayString","_createVNode","NcCheckboxRadioSwitch","$event","_createElementBlock","_hoisted_3","NcSelect","_hoisted_4","AppOrderSelector","useAdminThemingValue","modelValue","defaultValue","resetted","isSaving","isSaved","watchDebounced","setValue","toValue","reset","result","resetValue","isRef","isReadonly","readonly","setting","isAxiosError","data","props","__props","toRef","NcTextField","NcLoadingIcon","ADMIN_INFO","_normalizeClass","$style","TextField","emit","__emit","previewColor","v","textColor","computed","getTextColor","NcColorPicker","_cache","NcButton","_normalizeStyle","NcIconSvgWrapper","mdiPaletteOutline","_createTextVNode","mdiUndo","_renderSlot","_ctx","mime","inputElement","useTemplateRef","background","pickFile","onChange","file","formData","serverMessage","resetToDefault","mdiImageOutline","defaultBackgroundColor","adminThemingParameters","userThemingDisabled","isRemovingBackgroundImage","removeBackgroundImage","toggleBackground","refreshStyles","ColorPickerField","FileInputField","isThemeable","notThemeableErrorMessage","_Fragment","AdminSectionTheming","AdminSectionThemingAdvanced","NcNoteCard","AdminSectionAppMenu","createApp","AdminTheming"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"theming-settings-admin.mjs","sources":["../build/frontend/apps/theming/src/components/AdminSectionAppMenu.vue","../build/frontend/apps/theming/src/composables/useAdminThemingValue.ts","../build/frontend/apps/theming/src/components/admin/TextField.vue","../build/frontend/apps/theming/src/components/AdminSectionTheming.vue","../build/frontend/apps/theming/src/components/admin/ColorPickerField.vue","../build/frontend/apps/theming/src/components/admin/FileInputField.vue","../build/frontend/apps/theming/src/components/AdminSectionThemingAdvanced.vue","../build/frontend/apps/theming/src/views/AdminTheming.vue","../build/frontend/apps/theming/src/settings-admin.ts"],"sourcesContent":["\n\n\n\n\n\n\n","/*!\n * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { MaybeRef, MaybeRefOrGetter, Ref } from 'vue'\n\nimport axios, { isAxiosError } from '@nextcloud/axios'\nimport { showError } from '@nextcloud/dialogs'\nimport { generateUrl } from '@nextcloud/router'\nimport { watchDebounced } from '@vueuse/core'\nimport { isReadonly, isRef, readonly, ref, toValue } from 'vue'\nimport { logger } from '../utils/logger.ts'\n\n/**\n * @param name - The property name\n * @param modelValue - The model value\n * @param defaultValue - The default value\n */\nexport function useAdminThemingValue(name: MaybeRefOrGetter, modelValue: Ref, defaultValue: MaybeRef) {\n\tlet resetted = false\n\tconst isSaving = ref(false)\n\tconst isSaved = ref(false)\n\n\twatchDebounced(modelValue, async () => {\n\t\tif (isSaving.value) {\n\t\t\treturn\n\t\t}\n\n\t\tif (resetted) {\n\t\t\tresetted = false\n\t\t\treturn\n\t\t}\n\n\t\tisSaving.value = true\n\t\tisSaved.value = false\n\t\ttry {\n\t\t\tawait setValue(toValue(name), toValue(modelValue))\n\t\t\tisSaved.value = true\n\t\t\twindow.setTimeout(() => {\n\t\t\t\tisSaved.value = false\n\t\t\t}, 2000)\n\t\t} finally {\n\t\t\tisSaving.value = false\n\t\t}\n\t}, { debounce: 800, flush: 'sync' })\n\n\t/**\n\t * Reset to default value\n\t */\n\tasync function reset() {\n\t\tisSaving.value = true\n\t\tisSaved.value = false\n\t\ttry {\n\t\t\tconst result = await resetValue(toValue(name))\n\t\t\tif (result && isRef(defaultValue) && !isReadonly(defaultValue)) {\n\t\t\t\tdefaultValue.value = result as T\n\t\t\t}\n\t\t\tresetted = true\n\t\t\tmodelValue.value = toValue(defaultValue)\n\t\t} finally {\n\t\t\tisSaving.value = false\n\t\t}\n\t}\n\n\treturn {\n\t\tisSaving: readonly(isSaving),\n\t\tisSaved: readonly(isSaved),\n\t\treset,\n\t}\n}\n\n/**\n * @param setting - The setting name\n * @param value - The setting value\n */\nasync function setValue(setting: string, value: unknown) {\n\tconst url = generateUrl('/apps/theming/ajax/updateStylesheet')\n\ttry {\n\t\tawait axios.post(url, {\n\t\t\tsetting,\n\t\t\tvalue: String(value),\n\t\t})\n\t} catch (error) {\n\t\tlogger.error('Failed to save changes', { error, setting, value })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t}\n\t\tthrow error\n\t}\n}\n\n/**\n * Reset theming value for a given setting\n *\n * @param setting - The setting name\n */\nasync function resetValue(setting: string) {\n\tconst url = generateUrl('/apps/theming/ajax/undoChanges')\n\ttry {\n\t\tconst { data } = await axios.post<{ data: { value?: string } }>(url, { setting })\n\t\treturn data.data.value\n\t} catch (error) {\n\t\tlogger.error('Failed to reset theming value', { error, setting })\n\t\tif (isAxiosError(error) && error.response?.data?.data?.message) {\n\t\t\tshowError(error.response.data.data.message)\n\t\t\treturn false\n\t\t}\n\t\tthrow error\n\t}\n}\n","\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n\n\n","\n\n\n\n\n","/*!\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport AdminTheming from './views/AdminTheming.vue'\n\nimport 'vite/modulepreload-polyfill'\n\nconst app = createApp(AdminTheming)\napp.config.idPrefix = 'settings'\napp.mount('#settings-admin-theming')\n"],"names":["idGlobalDefaultApp","useId","defaultApps","loadState","allApps","id","name","icon","selectedApps","ref","app","watch","value","saveSetting","error","logger","showError","t","hasCustomDefaultApp","checked","key","url","generateUrl","axios","_createBlock","_unref","NcSettingsSection","_createElementVNode","_hoisted_1","_toDisplayString","_createVNode","NcCheckboxRadioSwitch","$event","_createElementBlock","_hoisted_3","NcSelect","_hoisted_4","AppOrderSelector","useAdminThemingValue","modelValue","defaultValue","resetted","isSaving","isSaved","watchDebounced","setValue","toValue","reset","result","resetValue","isRef","isReadonly","readonly","setting","isAxiosError","data","props","__props","toRef","NcTextField","NcLoadingIcon","ADMIN_INFO","_normalizeClass","$style","TextField","emit","__emit","previewColor","v","textColor","computed","getTextColor","NcColorPicker","_cache","NcButton","_normalizeStyle","NcIconSvgWrapper","mdiPaletteOutline","_createTextVNode","mdiUndo","_renderSlot","_ctx","mime","cacheKey","inputElement","useTemplateRef","background","pickFile","onChange","file","formData","serverMessage","resetToDefault","mdiImageOutline","defaultBackgroundColor","adminThemingParameters","userThemingDisabled","isRemovingBackgroundImage","removeBackgroundImage","toggleBackground","refreshStyles","ColorPickerField","FileInputField","isThemeable","notThemeableErrorMessage","_Fragment","AdminSectionTheming","AdminSectionThemingAdvanced","NcNoteCard","AdminSectionAppMenu","createApp","AdminTheming"],"mappings":"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"} \ No newline at end of file diff --git a/dist/theming-theming-settings-admin-ljDcYh_G.chunk.css b/dist/theming-theming-settings-admin-B-lUvcqL.chunk.css similarity index 91% rename from dist/theming-theming-settings-admin-ljDcYh_G.chunk.css rename to dist/theming-theming-settings-admin-B-lUvcqL.chunk.css index ec55917278c5b..2d06d1ba006fb 100644 --- a/dist/theming-theming-settings-admin-ljDcYh_G.chunk.css +++ b/dist/theming-theming-settings-admin-B-lUvcqL.chunk.css @@ -1 +1 @@ -h3[data-v-a9baec70],h4[data-v-a9baec70]{font-weight:700}h4[data-v-a9baec70],h5[data-v-a9baec70]{margin-block-start:12px}.info-note[data-v-a9baec70]{color:var(--color-text-maxcontrast)}._adminSectionTheming_1p8pd_2{max-width:650px;display:flex;flex-direction:column;gap:calc(2 * var(--default-grid-baseline))}._colorPickerField_o0yey_2{display:flex;flex-direction:column}._colorPickerField__row_o0yey_7{display:flex;flex-direction:row;align-items:center;gap:calc(1.5 * var(--default-grid-baseline))}._colorPickerField__button_o0yey_14{min-width:clamp(200px,25vw,300px)!important}._colorPickerField__description_o0yey_18{color:var(--color-text-maxcontrast);margin-block:calc(.5 * var(--default-grid-baseline)) var(--default-grid-baseline)}._colorPickerField__description_o0yey_18:empty{display:none}._fileInputField_1u7zs_2{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:calc(1.5 * var(--default-grid-baseline))}._fileInputField__button_1u7zs_10{min-width:clamp(200px,25vw,300px)!important}._fileInputField__preview_1u7zs_14{height:var(--clickable-area-large);width:calc(var(--clickable-area-large) / 9 * 16);background:var(--v64992c7e);background-size:contain;background-repeat:no-repeat;background-position:center;border:2px solid var(--color-border-maxcontrast);border-radius:var(--border-radius-element)}._adminSectionThemingAdvanced_dyaj4_2{display:flex;flex-direction:column;gap:calc(2 * var(--default-grid-baseline));max-width:650px} +h3[data-v-a9baec70],h4[data-v-a9baec70]{font-weight:700}h4[data-v-a9baec70],h5[data-v-a9baec70]{margin-block-start:12px}.info-note[data-v-a9baec70]{color:var(--color-text-maxcontrast)}._adminSectionTheming_1p8pd_2{max-width:650px;display:flex;flex-direction:column;gap:calc(2 * var(--default-grid-baseline))}._colorPickerField_o0yey_2{display:flex;flex-direction:column}._colorPickerField__row_o0yey_7{display:flex;flex-direction:row;align-items:center;gap:calc(1.5 * var(--default-grid-baseline))}._colorPickerField__button_o0yey_14{min-width:clamp(200px,25vw,300px)!important}._colorPickerField__description_o0yey_18{color:var(--color-text-maxcontrast);margin-block:calc(.5 * var(--default-grid-baseline)) var(--default-grid-baseline)}._colorPickerField__description_o0yey_18:empty{display:none}._fileInputField_1u7zs_2{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:calc(1.5 * var(--default-grid-baseline))}._fileInputField__button_1u7zs_10{min-width:clamp(200px,25vw,300px)!important}._fileInputField__preview_1u7zs_14{height:var(--clickable-area-large);width:calc(var(--clickable-area-large) / 9 * 16);background:var(--v6c51c3da);background-size:contain;background-repeat:no-repeat;background-position:center;border:2px solid var(--color-border-maxcontrast);border-radius:var(--border-radius-element)}._adminSectionThemingAdvanced_dyaj4_2{display:flex;flex-direction:column;gap:calc(2 * var(--default-grid-baseline));max-width:650px} diff --git a/lib/private/Server.php b/lib/private/Server.php index 2a33c18eb05d9..c379932e93650 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -1078,6 +1078,11 @@ public function __construct( $c->get(LoggerInterface::class), $c->get(ITempManager::class), $backgroundService, + new AppConfig( + $c->get(IConfig::class), + $c->get(IAppConfig::class), + 'theming', + ), ); return new ThemingDefaults( new AppConfig(