From 1c2d8faf34e661ce6444b4a1dc257d0c60d6bd94 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 26 Jun 2020 09:58:45 +0200 Subject: [PATCH] Precalculate the primary element color for dark mode too Signed-off-by: Joas Schilling --- apps/theming/lib/Capabilities.php | 2 ++ apps/theming/lib/Util.php | 17 +++++++++++++---- apps/theming/tests/CapabilitiesTest.php | 14 ++++++++++++-- apps/theming/tests/UtilTest.php | 5 +++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/apps/theming/lib/Capabilities.php b/apps/theming/lib/Capabilities.php index f3ae5e1b71..be8f421a3d 100644 --- a/apps/theming/lib/Capabilities.php +++ b/apps/theming/lib/Capabilities.php @@ -78,6 +78,8 @@ class Capabilities implements IPublicCapability { 'color' => $color, 'color-text' => $this->theming->getTextColorPrimary(), 'color-element' => $this->util->elementColor($color), + 'color-element-bright' => $this->util->elementColor($color), + 'color-element-dark' => $this->util->elementColor($color, false), 'logo' => $this->url->getAbsoluteURL($this->theming->getLogo()), 'background' => $backgroundLogo === 'backgroundColor' ? $this->theming->getColorPrimary() : diff --git a/apps/theming/lib/Util.php b/apps/theming/lib/Util.php index d3c0043b2a..5df132f382 100644 --- a/apps/theming/lib/Util.php +++ b/apps/theming/lib/Util.php @@ -76,14 +76,23 @@ class Util { /** * get color for on-page elements: * theme color by default, grey if theme color is to bright - * @param $color + * @param string $color + * @param bool $brightBackground * @return string */ - public function elementColor($color) { - $l = $this->calculateLuminance($color); - if ($l>0.8) { + public function elementColor($color, bool $brightBackground = true) { + $luminance = $this->calculateLuminance($color); + + if ($brightBackground && $luminance > 0.8) { + // If the color is too bright in bright mode, we fall back to a darker gray return '#aaaaaa'; } + + if (!$brightBackground && $luminance < 0.2) { + // If the color is too dark in dark mode, we fall back to a brighter gray + return '#555555'; + } + return $color; } diff --git a/apps/theming/tests/CapabilitiesTest.php b/apps/theming/tests/CapabilitiesTest.php index 60cebb37cf..216672a881 100644 --- a/apps/theming/tests/CapabilitiesTest.php +++ b/apps/theming/tests/CapabilitiesTest.php @@ -78,6 +78,8 @@ class CapabilitiesTest extends TestCase { 'color' => '#FFFFFF', 'color-text' => '#000000', 'color-element' => '#aaaaaa', + 'color-element-bright' => '#aaaaaa', + 'color-element-dark' => '#FFFFFF', 'logo' => 'http://absolute/logo', 'background' => 'http://absolute/background', 'background-plain' => false, @@ -92,6 +94,8 @@ class CapabilitiesTest extends TestCase { 'color' => '#01e4a0', 'color-text' => '#ffffff', 'color-element' => '#01e4a0', + 'color-element-bright' => '#01e4a0', + 'color-element-dark' => '#01e4a0', 'logo' => 'http://localhost/logo5', 'background' => 'http://localhost/background6', 'background-plain' => false, @@ -106,6 +110,8 @@ class CapabilitiesTest extends TestCase { 'color' => '#000000', 'color-text' => '#ffffff', 'color-element' => '#000000', + 'color-element-bright' => '#000000', + 'color-element-dark' => '#555555', 'logo' => 'http://localhost/logo5', 'background' => '#000000', 'background-plain' => true, @@ -120,6 +126,8 @@ class CapabilitiesTest extends TestCase { 'color' => '#000000', 'color-text' => '#ffffff', 'color-element' => '#000000', + 'color-element-bright' => '#000000', + 'color-element-dark' => '#555555', 'logo' => 'http://localhost/logo5', 'background' => '#000000', 'background-plain' => true, @@ -167,10 +175,12 @@ class CapabilitiesTest extends TestCase { ->willReturn($textColor); $util = new Util($this->config, $this->createMock(IAppManager::class), $this->createMock(IAppData::class)); - $this->util->expects($this->once()) + $this->util->expects($this->exactly(3)) ->method('elementColor') ->with($color) - ->willReturn($util->elementColor($color)); + ->willReturnCallback(static function(string $color, bool $brightBackground = true) use ($util) { + return $util->elementColor($color, $brightBackground); + }); $this->util->expects($this->once()) ->method('isBackgroundThemed') diff --git a/apps/theming/tests/UtilTest.php b/apps/theming/tests/UtilTest.php index 6f7e195e46..10013e7d61 100644 --- a/apps/theming/tests/UtilTest.php +++ b/apps/theming/tests/UtilTest.php @@ -106,6 +106,11 @@ class UtilTest extends TestCase { $this->assertEquals('#000000', $elementColor); } + public function testElementColorOnDarkBackground() { + $elementColor = $this->util->elementColor("#000000", false); + $this->assertEquals('#555555', $elementColor); + } + public function testElementColorOnBrightBackground() { $elementColor = $this->util->elementColor('#ffffff'); $this->assertEquals('#aaaaaa', $elementColor);