Precalculate the primary element color for dark mode too

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2020-06-26 09:58:45 +02:00 committed by backportbot[bot]
parent e5e833a519
commit 1c2d8faf34
4 changed files with 32 additions and 6 deletions

View File

@ -78,6 +78,8 @@ class Capabilities implements IPublicCapability {
'color' => $color, 'color' => $color,
'color-text' => $this->theming->getTextColorPrimary(), 'color-text' => $this->theming->getTextColorPrimary(),
'color-element' => $this->util->elementColor($color), '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()), 'logo' => $this->url->getAbsoluteURL($this->theming->getLogo()),
'background' => $backgroundLogo === 'backgroundColor' ? 'background' => $backgroundLogo === 'backgroundColor' ?
$this->theming->getColorPrimary() : $this->theming->getColorPrimary() :

View File

@ -76,14 +76,23 @@ class Util {
/** /**
* get color for on-page elements: * get color for on-page elements:
* theme color by default, grey if theme color is to bright * theme color by default, grey if theme color is to bright
* @param $color * @param string $color
* @param bool $brightBackground
* @return string * @return string
*/ */
public function elementColor($color) { public function elementColor($color, bool $brightBackground = true) {
$l = $this->calculateLuminance($color); $luminance = $this->calculateLuminance($color);
if ($l>0.8) {
if ($brightBackground && $luminance > 0.8) {
// If the color is too bright in bright mode, we fall back to a darker gray
return '#aaaaaa'; 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; return $color;
} }

View File

@ -78,6 +78,8 @@ class CapabilitiesTest extends TestCase {
'color' => '#FFFFFF', 'color' => '#FFFFFF',
'color-text' => '#000000', 'color-text' => '#000000',
'color-element' => '#aaaaaa', 'color-element' => '#aaaaaa',
'color-element-bright' => '#aaaaaa',
'color-element-dark' => '#FFFFFF',
'logo' => 'http://absolute/logo', 'logo' => 'http://absolute/logo',
'background' => 'http://absolute/background', 'background' => 'http://absolute/background',
'background-plain' => false, 'background-plain' => false,
@ -92,6 +94,8 @@ class CapabilitiesTest extends TestCase {
'color' => '#01e4a0', 'color' => '#01e4a0',
'color-text' => '#ffffff', 'color-text' => '#ffffff',
'color-element' => '#01e4a0', 'color-element' => '#01e4a0',
'color-element-bright' => '#01e4a0',
'color-element-dark' => '#01e4a0',
'logo' => 'http://localhost/logo5', 'logo' => 'http://localhost/logo5',
'background' => 'http://localhost/background6', 'background' => 'http://localhost/background6',
'background-plain' => false, 'background-plain' => false,
@ -106,6 +110,8 @@ class CapabilitiesTest extends TestCase {
'color' => '#000000', 'color' => '#000000',
'color-text' => '#ffffff', 'color-text' => '#ffffff',
'color-element' => '#000000', 'color-element' => '#000000',
'color-element-bright' => '#000000',
'color-element-dark' => '#555555',
'logo' => 'http://localhost/logo5', 'logo' => 'http://localhost/logo5',
'background' => '#000000', 'background' => '#000000',
'background-plain' => true, 'background-plain' => true,
@ -120,6 +126,8 @@ class CapabilitiesTest extends TestCase {
'color' => '#000000', 'color' => '#000000',
'color-text' => '#ffffff', 'color-text' => '#ffffff',
'color-element' => '#000000', 'color-element' => '#000000',
'color-element-bright' => '#000000',
'color-element-dark' => '#555555',
'logo' => 'http://localhost/logo5', 'logo' => 'http://localhost/logo5',
'background' => '#000000', 'background' => '#000000',
'background-plain' => true, 'background-plain' => true,
@ -167,10 +175,12 @@ class CapabilitiesTest extends TestCase {
->willReturn($textColor); ->willReturn($textColor);
$util = new Util($this->config, $this->createMock(IAppManager::class), $this->createMock(IAppData::class)); $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') ->method('elementColor')
->with($color) ->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()) $this->util->expects($this->once())
->method('isBackgroundThemed') ->method('isBackgroundThemed')

View File

@ -106,6 +106,11 @@ class UtilTest extends TestCase {
$this->assertEquals('#000000', $elementColor); $this->assertEquals('#000000', $elementColor);
} }
public function testElementColorOnDarkBackground() {
$elementColor = $this->util->elementColor("#000000", false);
$this->assertEquals('#555555', $elementColor);
}
public function testElementColorOnBrightBackground() { public function testElementColorOnBrightBackground() {
$elementColor = $this->util->elementColor('#ffffff'); $elementColor = $this->util->elementColor('#ffffff');
$this->assertEquals('#aaaaaa', $elementColor); $this->assertEquals('#aaaaaa', $elementColor);