mirror of
https://github.com/wwiinnddyy/LanMountainDesktop.git
synced 2026-06-23 01:44:26 +08:00
0.1.5
This commit is contained in:
@@ -3,12 +3,29 @@ using Avalonia.Media;
|
||||
namespace LanMontainDesktop.Theme;
|
||||
|
||||
public sealed record AppThemePalette(
|
||||
Color Primary,
|
||||
Color Secondary,
|
||||
Color Accent,
|
||||
Color OnAccent,
|
||||
Color AccentLight1,
|
||||
Color AccentLight2,
|
||||
Color AccentLight3,
|
||||
Color AccentDark1,
|
||||
Color AccentDark2,
|
||||
Color AccentDark3,
|
||||
Color SurfaceBase,
|
||||
Color SurfaceRaised,
|
||||
Color SurfaceOverlay,
|
||||
Color TextPrimary,
|
||||
Color TextSecondary,
|
||||
Color TextMuted,
|
||||
Color TextAccent,
|
||||
Color NavText,
|
||||
Color NavSelectedText,
|
||||
Color NavSelectionIndicator,
|
||||
Color NavItemBackground,
|
||||
Color NavItemHoverBackground,
|
||||
Color NavItemSelectedBackground);
|
||||
Color NavItemSelectedBackground,
|
||||
Color ToggleOn,
|
||||
Color ToggleOff,
|
||||
Color ToggleBorder);
|
||||
|
||||
61
LanMontainDesktop/Theme/ColorMath.cs
Normal file
61
LanMontainDesktop/Theme/ColorMath.cs
Normal file
@@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using Avalonia.Media;
|
||||
|
||||
namespace LanMontainDesktop.Theme;
|
||||
|
||||
public static class ColorMath
|
||||
{
|
||||
public static Color Blend(Color from, Color to, double ratio)
|
||||
{
|
||||
ratio = Math.Clamp(ratio, 0, 1);
|
||||
var inverse = 1 - ratio;
|
||||
var red = (byte)Math.Round((from.R * inverse) + (to.R * ratio));
|
||||
var green = (byte)Math.Round((from.G * inverse) + (to.G * ratio));
|
||||
var blue = (byte)Math.Round((from.B * inverse) + (to.B * ratio));
|
||||
return Color.FromRgb(red, green, blue);
|
||||
}
|
||||
|
||||
public static Color WithAlpha(Color color, byte alpha)
|
||||
{
|
||||
return Color.FromArgb(alpha, color.R, color.G, color.B);
|
||||
}
|
||||
|
||||
public static Color EnsureContrast(Color preferred, Color background, double minRatio)
|
||||
{
|
||||
if (ContrastRatio(preferred, background) >= minRatio)
|
||||
{
|
||||
return preferred;
|
||||
}
|
||||
|
||||
var white = Color.Parse("#FFFFFFFF");
|
||||
var black = Color.Parse("#FF000000");
|
||||
var whiteRatio = ContrastRatio(white, background);
|
||||
var blackRatio = ContrastRatio(black, background);
|
||||
return whiteRatio >= blackRatio ? white : black;
|
||||
}
|
||||
|
||||
public static double ContrastRatio(Color first, Color second)
|
||||
{
|
||||
var firstLum = RelativeLuminance(first);
|
||||
var secondLum = RelativeLuminance(second);
|
||||
var lighter = Math.Max(firstLum, secondLum);
|
||||
var darker = Math.Min(firstLum, secondLum);
|
||||
return (lighter + 0.05) / (darker + 0.05);
|
||||
}
|
||||
|
||||
private static double RelativeLuminance(Color color)
|
||||
{
|
||||
var red = ToLinear(color.R / 255d);
|
||||
var green = ToLinear(color.G / 255d);
|
||||
var blue = ToLinear(color.B / 255d);
|
||||
return (0.2126 * red) + (0.7152 * green) + (0.0722 * blue);
|
||||
}
|
||||
|
||||
private static double ToLinear(double value)
|
||||
{
|
||||
return value <= 0.04045
|
||||
? value / 12.92
|
||||
: Math.Pow((value + 0.055) / 1.055, 2.4);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user