diff --git a/src-ui/src/app/components/common/input/color/color.component.ts b/src-ui/src/app/components/common/input/color/color.component.ts index b31259200..ebaa50327 100644 --- a/src-ui/src/app/components/common/input/color/color.component.ts +++ b/src-ui/src/app/components/common/input/color/color.component.ts @@ -1,7 +1,7 @@ import { Component, Input, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { ColorEvent, ColorMode } from 'ngx-color'; -import { randomColor } from 'src/app/utils/color'; +import { randomColor, hslToHex } from 'src/app/utils/color'; import { AbstractInputComponent } from '../abstract-input'; @Component({ @@ -24,15 +24,18 @@ export class ColorComponent extends AbstractInputComponent<string> { } randomize() { - this.colorChanged(randomColor()) + const color = randomColor(this.colorMode) + let colorHex = color + if (this.colorMode == ColorMode.HSL) { + const hsl = color.split(',') + colorHex = hslToHex(+hsl[0], +hsl[1], +hsl[2]) + } + this.value = colorHex + this.onChange(color) } sliderChanged(colorEvent:ColorEvent) { - this.colorChanged(colorEvent.color[this.colorMode].toString()) - } - - colorChanged(color:string) { - this.value = color - this.onChange(color) + this.value = colorEvent.color.hex + this.onChange(colorEvent.color[this.colorMode].toString()) } } diff --git a/src-ui/src/app/components/manage/settings/settings.component.html b/src-ui/src/app/components/manage/settings/settings.component.html index 530ea13fb..ac37547a6 100644 --- a/src-ui/src/app/components/manage/settings/settings.component.html +++ b/src-ui/src/app/components/manage/settings/settings.component.html @@ -105,7 +105,7 @@ <span i18n>Theme Color</span> </div> <div class="col-3"> - <app-input-color i18n-title title="" formControlName="themeColor" [error]="error?.color"></app-input-color> + <app-input-color i18n-title colorMode="hsl" formControlName="themeColor" [error]="error?.color"></app-input-color> </div> <div class="col-2"> <button class="btn btn-link btn-sm pt-2 ps-0" [disabled]="!this.settingsForm.get('themeColor').value" (click)="clearThemeColor()"> diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index 0923ccdde..ecc13fcbf 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -1,5 +1,5 @@ import { DOCUMENT } from '@angular/common'; -import { Inject, Injectable, LOCALE_ID, Renderer2, RendererFactory2 } from '@angular/core'; +import { Inject, Injectable, LOCALE_ID, Renderer2, RendererFactory2, RendererStyleFlags2 } from '@angular/core'; import { Meta } from '@angular/platform-browser'; import { CookieService } from 'ngx-cookie-service'; @@ -87,7 +87,12 @@ export class SettingsService { } if (themeColor) { - console.log('set theme color') + const hsl = themeColor.split(',') + this.renderer.setStyle(document.documentElement, '--pngx-primary',`${+hsl[0] * 360},${hsl[1] * 100}%`, RendererStyleFlags2.DashCase) + this.renderer.setStyle(document.documentElement, '--pngx-primary-lightness',`${hsl[2] * 100}%`, RendererStyleFlags2.DashCase) + } else { + this.renderer.removeStyle(document.documentElement, '--pngx-primary', RendererStyleFlags2.DashCase) + this.renderer.removeStyle(document.documentElement, '--pngx-primary-lightness', RendererStyleFlags2.DashCase) } } diff --git a/src-ui/src/app/utils/color.ts b/src-ui/src/app/utils/color.ts index d320cc2b9..72462cc37 100644 --- a/src-ui/src/app/utils/color.ts +++ b/src-ui/src/app/utils/color.ts @@ -1,3 +1,4 @@ +import { ColorMode } from "ngx-color" function componentToHex(c) { var hex = Math.floor(c).toString(16) @@ -42,7 +43,21 @@ function hslToRgb(h, s, l){ return [r * 255, g * 255, b * 255] } -export function randomColor() { - let rgb = hslToRgb(Math.random(), 0.6, Math.random() * 0.4 + 0.4) +export function hslToHex(h: number, s: number, l:number): string { + const rgb = hslToRgb(h,s,l) return `#${componentToHex(rgb[0])}${componentToHex(rgb[1])}${componentToHex(rgb[2])}` } + +export function randomColor(colorMode: ColorMode = ColorMode.HEX) { + const h = Math.random() + const s = 0.6 + const l = Math.random() * 0.4 + 0.4 + switch (colorMode) { + case ColorMode.HSL: + return `${h},${s},${l}` + break; + default: // HEX + return hslToHex(h,s,l) + break; + } +}