mirror of
https://github.com/RaidMax/IW4M-Admin.git
synced 2025-06-10 15:20:48 -05:00
finish custom accent color feature
This commit is contained in:
@ -10,76 +10,90 @@ namespace WebfrontCore.Middleware
|
||||
{
|
||||
public class CustomCssAccentMiddlewareAction : IMiddlewareAction<string>
|
||||
{
|
||||
private readonly Color _primaryColor;
|
||||
private readonly Color _secondaryColor;
|
||||
private readonly Color _originalPrimaryColor;
|
||||
private readonly Color _originalSecondaryColor;
|
||||
private readonly List<ColorMap> ColorReplacements = new List<ColorMap>();
|
||||
|
||||
private class ColorMap
|
||||
{
|
||||
public Color Original { get; set; }
|
||||
public Color Replacement { get; set; }
|
||||
}
|
||||
|
||||
public CustomCssAccentMiddlewareAction(string originalPrimaryColor, string originalSecondaryColor, string primaryColor, string secondaryColor)
|
||||
{
|
||||
_originalPrimaryColor = Color.FromArgb(Convert.ToInt32(originalPrimaryColor.Substring(1).ToString(), 16));
|
||||
_originalSecondaryColor = Color.FromArgb(Convert.ToInt32(originalSecondaryColor.Substring(1).ToString(), 16));
|
||||
_primaryColor = string.IsNullOrEmpty(primaryColor) ? _originalPrimaryColor : Color.FromArgb(Convert.ToInt32(primaryColor.Substring(1).ToString(), 16));
|
||||
_secondaryColor = string.IsNullOrEmpty(secondaryColor) ? _originalSecondaryColor : Color.FromArgb(Convert.ToInt32(secondaryColor.Substring(1).ToString(), 16));
|
||||
primaryColor = string.IsNullOrWhiteSpace(primaryColor) ? originalPrimaryColor : primaryColor;
|
||||
secondaryColor = string.IsNullOrWhiteSpace(secondaryColor) ? originalSecondaryColor : secondaryColor;
|
||||
try
|
||||
{
|
||||
ColorReplacements.AddRange(new[]
|
||||
{
|
||||
new ColorMap()
|
||||
{
|
||||
Original = Color.FromArgb(Convert.ToInt32(originalPrimaryColor.Substring(1).ToString(), 16)),
|
||||
Replacement = Color.FromArgb(Convert.ToInt32(primaryColor.Substring(1).ToString(), 16))
|
||||
},
|
||||
new ColorMap()
|
||||
{
|
||||
Original = Color.FromArgb(Convert.ToInt32(originalSecondaryColor.Substring(1).ToString(), 16)),
|
||||
Replacement = Color.FromArgb(Convert.ToInt32(secondaryColor.Substring(1).ToString(), 16))
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
catch (FormatException)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> Invoke(string original)
|
||||
{
|
||||
string originalPrimaryHex = ColorToHex(_originalPrimaryColor);
|
||||
string originalPrimaryDec = ColorToDec(_originalPrimaryColor);
|
||||
string originalSecondaryHex = ColorToHex(_originalSecondaryColor);
|
||||
string originalSecondaryDec = ColorToDec(_originalSecondaryColor);
|
||||
foreach (var color in ColorReplacements)
|
||||
{
|
||||
foreach (var shade in new[] { 0, -19, -25 })
|
||||
{
|
||||
original = original
|
||||
.Replace(ColorToHex(LightenDarkenColor(color.Original, shade)), ColorToHex(LightenDarkenColor(color.Replacement, shade)), StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(ColorToDec(LightenDarkenColor(color.Original, shade)), ColorToDec(LightenDarkenColor(color.Replacement, shade)), StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
}
|
||||
|
||||
string primaryHex = ColorToHex(_primaryColor);
|
||||
string primaryDec = ColorToDec(_primaryColor);
|
||||
string secondaryHex = ColorToHex(_secondaryColor);
|
||||
string secondaryDec = ColorToDec(_secondaryColor);
|
||||
|
||||
string originalPrimaryDarkenHex = ColorToHex(LightenDarkenColor(_originalPrimaryColor, -10));
|
||||
string originalPrimaryDarkenDec = ColorToDec(LightenDarkenColor(_originalPrimaryColor, -10));
|
||||
string originalSecondaryDarkenHex = ColorToHex(LightenDarkenColor(_originalSecondaryColor, -10));
|
||||
string originalSecondaryDarkenDec = ColorToDec(LightenDarkenColor(_originalSecondaryColor, -10));
|
||||
|
||||
string primaryDarkenHex = ColorToHex(LightenDarkenColor(_primaryColor, -10));
|
||||
string primaryDarkenDec = ColorToDec(LightenDarkenColor(_primaryColor, -10));
|
||||
string secondaryDarkenHex = ColorToHex(LightenDarkenColor(_secondaryColor, -10));
|
||||
string secondaryDarkenDec = ColorToDec(LightenDarkenColor(_secondaryColor, -10));
|
||||
|
||||
return original
|
||||
.Replace(originalPrimaryHex, primaryHex, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalPrimaryDec, primaryDec, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalSecondaryHex, secondaryHex, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalSecondaryDec, secondaryDec, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalPrimaryDarkenHex, primaryDarkenHex, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalPrimaryDarkenDec, primaryDarkenDec, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalSecondaryDarkenHex, secondaryDarkenHex, StringComparison.OrdinalIgnoreCase)
|
||||
.Replace(originalSecondaryDarkenDec, secondaryDarkenDec, StringComparison.OrdinalIgnoreCase);
|
||||
return original;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// converts color to the hex string representation
|
||||
/// </summary>
|
||||
/// <param name="color"></param>
|
||||
/// <returns></returns>
|
||||
private string ColorToHex(Color color) => $"#{color.R.ToString("X2")}{color.G.ToString("X2")}{color.B.ToString("X2")}";
|
||||
|
||||
/// <summary>
|
||||
/// converts color to the rgb tuples representation
|
||||
/// </summary>
|
||||
/// <param name="color"></param>
|
||||
/// <returns></returns>
|
||||
private string ColorToDec(Color color) => $"{(int)color.R}, {(int)color.G}, {(int)color.B}";
|
||||
|
||||
/// <summary>
|
||||
/// Adapted from https://css-tricks.com/snippets/javascript/lighten-darken-color/
|
||||
/// lightens or darkens a color on the given amount
|
||||
/// Based off SASS darken/lighten function
|
||||
/// </summary>
|
||||
/// <param name="col"></param>
|
||||
/// <param name="amt"></param>
|
||||
/// <param name="color"></param>
|
||||
/// <param name="amount"></param>
|
||||
/// <returns></returns>
|
||||
private Color LightenDarkenColor(Color col, float amt)
|
||||
private Color LightenDarkenColor(Color color, float amount)
|
||||
{
|
||||
var num = col.ToArgb();
|
||||
|
||||
int r = (num >> 16) + (int)(amt * (num >> 16));
|
||||
int r = color.R + (int)((amount / 100.0f) * color.R);
|
||||
|
||||
if (r > 255) r = 255;
|
||||
else if (r < 0) r = 0;
|
||||
|
||||
int g = ((num >> 8) & 0x00FF) + (int)(amt * ((num >> 8) & 0x00FF));
|
||||
int g = color.G + (int)((amount / 100.0f) * color.G);
|
||||
|
||||
if (g > 255) g = 255;
|
||||
else if (g < 0) g = 0;
|
||||
|
||||
int b = (num & 0x0000FF) + (int)(amt * (num & 0x0000FF));
|
||||
int b = color.B + (int)((amount / 100.0f) * color.B);
|
||||
|
||||
if (b > 255) b = 255;
|
||||
else if (b < 0) b = 0;
|
||||
|
Reference in New Issue
Block a user