Refactor Token

This commit is contained in:
chinboy
2025-02-11 15:08:05 +08:00
parent 6ac8c01a7f
commit 5940b29204
3 changed files with 59 additions and 130 deletions
@@ -1,61 +0,0 @@
using System.Diagnostics;
using AtomUI.Theme.Data;
using AtomUI.Theme.TokenSystem;
using Avalonia.Controls;
using Avalonia.Styling;
namespace AtomUI.Theme;
public class ControlTokenResourceRegister
{
private Control _target;
private string _tokenId;
private string? _resourceCatalog;
private ResourceDictionary? _resourceDictionary;
public ControlTokenResourceRegister(Control target, string tokenId, string? resourceCatalog = null)
{
_target = target;
_tokenId = tokenId;
_resourceCatalog = resourceCatalog;
}
public void RegisterResources()
{
if (_resourceDictionary != null)
{
_target.Resources.MergedDictionaries.Remove(_resourceDictionary);
}
var controlToken = TokenFinderUtils.FindControlToken(_target, _tokenId, _resourceCatalog);
Debug.Assert(controlToken != null);
_resourceDictionary = new ResourceDictionary();
foreach (var entry in controlToken.GetSharedResourceDeltaDictionary())
{
_resourceDictionary.Add(entry.Key, entry.Value);
}
var themeVariant = TokenFinderUtils.FindThemeVariant(_target);
_target.Resources.ThemeDictionaries.Add(themeVariant, _resourceDictionary);
}
private IControlDesignToken? FindControlToken()
{
IControlDesignToken? token = null;
var current = _target;
while (current != null)
{
if (current is IThemeConfigProvider configProvider)
{
token = configProvider.GetControlToken(_tokenId, _resourceCatalog);
if (token != null)
{
break;
}
}
current = (current as IStyleHost).StylingParent as Control;
}
return token;
}
}
@@ -5,42 +5,42 @@ namespace AtomUI.Theme.TokenSystem;
[GlobalDesignToken]
public partial class DesignToken
{
/// <summary>
/// 内容区域背景色(悬停)
/// 控制内容区域背景色在鼠标悬停时的样式。
/// </summary>
public Color ColorFillContentHover { get; set; }
/// <summary>
/// 内容区域背景色(悬停)
/// 控制内容区域背景色在鼠标悬停时的样式。
/// </summary>
public Color ColorFillContentHover { get; set; }
/// <summary>
/// 替代背景色
/// 控制元素替代背景色。
/// </summary>
public Color ColorFillAlter { get; set; }
/// <summary>
/// 替代背景色
/// 控制元素替代背景色。
/// </summary>
public Color ColorFillAlter { get; set; }
/// <summary>
/// 内容区域背景色
/// 控制内容区域的背景色。
/// </summary>
public Color ColorFillContent { get; set; }
/// <summary>
/// 内容区域背景色
/// 控制内容区域的背景色。
/// </summary>
public Color ColorFillContent { get; set; }
/// <summary>
/// 容器禁用态下的背景色
/// 控制容器在禁用状态下的背景色。
/// </summary>
public Color ColorBgContainerDisabled { get; set; }
/// <summary>
/// 容器禁用态下的背景色
/// 控制容器在禁用状态下的背景色。
/// </summary>
public Color ColorBgContainerDisabled { get; set; }
/// <summary>
/// 文本悬停态背景色
/// 控制文本在悬停状态下的背景色。
/// </summary>
public Color ColorBgTextHover { get; set; }
/// <summary>
/// 文本悬停态背景色
/// 控制文本在悬停状态下的背景色。
/// </summary>
public Color ColorBgTextHover { get; set; }
/// <summary>
/// 文本激活态背景色
/// 控制文本在激活状态下的背景色。
/// </summary>
public Color ColorBgTextActive { get; set; }
/// <summary>
/// 文本激活态背景色
/// 控制文本在激活状态下的背景色。
/// </summary>
public Color ColorBgTextActive { get; set; }
/// <summary>
/// 背景边框颜色
/// 控制元素背景边框的颜色。
@@ -52,7 +52,7 @@ public partial class DesignToken
/// 用于作为分割线的颜色,此颜色和 colorBorderSecondary 的颜色一致,但是用的是透明色。
/// </summary>
public Color ColorSplit { get; set; }
/// <summary>
/// 占位文本颜色
/// 控制占位文本的颜色。
@@ -189,7 +189,7 @@ public partial class DesignToken
/// 控制组件项在禁用状态下的激活背景颜色
/// </summary>
public Color ControlItemBgActiveDisabled { get; set; } // Note. It also is a color
/// <summary>
/// 线条宽度(聚焦态)
/// </summary>
@@ -290,7 +290,7 @@ public partial class DesignToken
/// 控制内容元素垂直内间距,适用于小屏幕设备。
/// </summary>
public double PaddingContentVerticalSM { get; set; }
/// <summary>
/// 外边距 XXS
/// 控制元素外边距,最小尺寸。
@@ -8,13 +8,12 @@ namespace AtomUI.Theme.TokenSystem;
public partial class DesignToken : AbstractDesignToken
{
/// <summary>
/// <summary>
/// 现在这里的实现是写死的主色,后面是不是可以读取配置
/// </summary>
private readonly IDictionary<PresetColorType, PresetPrimaryColor> _defaultPresetColors;
[NotTokenDefinition]
public IDictionary<PresetPrimaryColor, ColorMap> ColorPalettes { get; set; }
[NotTokenDefinition] public IDictionary<PresetPrimaryColor, ColorMap> ColorPalettes { get; set; }
public DesignToken()
{
@@ -61,12 +60,12 @@ public partial class DesignToken : AbstractDesignToken
BorderRadius = new CornerRadius(6);
ColorTransparent = Colors.Transparent;
}
public PresetPrimaryColor GetPresetPrimaryColor(PresetColorType colorType)
{
return _defaultPresetColors[colorType];
}
public void SetColorPalette(PresetPrimaryColor primaryColor, ColorMap colorMap)
{
ColorPalettes[primaryColor] = colorMap;
@@ -91,27 +90,18 @@ public partial class DesignToken : AbstractDesignToken
var screenLG = 992;
var screenXL = 1200;
var screenXXL = 1600;
// Motion
if (!EnableMotion)
{
MotionDurationFast = TimeSpan.FromMilliseconds(0);
MotionDurationMid = TimeSpan.FromMilliseconds(0);
MotionDurationSlow = TimeSpan.FromMilliseconds(0);
MotionDurationVerySlow = TimeSpan.FromMilliseconds(0);
}
// setup alias token
// ============== Background ============== //
ColorFillContent = ColorFillSecondary;
ColorFillContentHover = ColorFill;
ColorFillAlter = ColorFillQuaternary;
ColorBgContainerDisabled = ColorFillTertiary;
// ============== Split ============== //
ColorBorderBg = ColorBgContainer;
ColorSplit = ColorUtils.AlphaColor(ColorBorderSecondary, ColorBgContainer);
// ============== Text ============== //
ColorTextPlaceholder = ColorTextQuaternary;
ColorTextDisabled = ColorTextQuaternary;
@@ -122,48 +112,48 @@ public partial class DesignToken : AbstractDesignToken
ColorHighlight = ColorError;
ColorBgTextHover = ColorFillSecondary;
ColorBgTextActive = ColorFill;
ColorIcon = ColorTextTertiary;
ColorIconHover = ColorText;
ColorErrorOutline = ColorUtils.AlphaColor(ColorErrorBg, ColorBgContainer);
ColorWarningOutline = ColorUtils.AlphaColor(ColorWarningBg, ColorBgContainer);
// Font
FontSizeIcon = FontSizeSM;
// icon
IconSizeXS = (int)FontSizeSM - 2;
IconSizeSM = (int)FontSizeSM;
IconSize = (int)FontSize;
IconSizeLG = (int)FontSizeLG;
// Line
LineWidthFocus = LineWidth * 2;
WaveAnimationRange = LineWidth * 6;
WaveStartOpacity = 0.4;
// Control
ControlOutlineWidth = LineWidth * 2;
// Checkbox size and expand icon size
ControlInteractiveSize = ControlHeight / 2;
ControlItemBgHover = ColorFillTertiary;
ControlItemBgActive = ColorPrimaryBg;
ControlItemBgActiveHover = ColorPrimaryBgHover;
ControlItemBgActiveDisabled = ColorFill;
ColorControlOutline = ColorUtils.AlphaColor(ColorPrimaryBg, ColorBgContainer);
FontWeightStrong = 600;
OpacityLoading = 0.65;
LinkDecoration = null;
LinkHoverDecoration = null;
LinkFocusDecoration = null;
ControlPadding = 12;
ControlPaddingSM = 8;
PaddingXXS = SizeXXS;
PaddingXS = SizeXS;
PaddingSM = SizeSM;
@@ -171,7 +161,7 @@ public partial class DesignToken : AbstractDesignToken
PaddingMD = SizeMD;
PaddingLG = SizeLG;
PaddingXL = SizeXL;
PaddingContentHorizontalLG = SizeLG;
PaddingContentVerticalLG = SizeMS;
PaddingContentHorizontal = SizeMS;
@@ -179,7 +169,7 @@ public partial class DesignToken : AbstractDesignToken
PaddingContentHorizontalSM = SizeSM;
PaddingContentHorizontalXS = SizeXS;
PaddingContentVerticalSM = SizeXS;
MarginXXS = SizeXXS;
MarginXS = SizeXS;
MarginSM = SizeSM;
@@ -188,7 +178,7 @@ public partial class DesignToken : AbstractDesignToken
MarginLG = SizeLG;
MarginXL = SizeXL;
MarginXXL = SizeXXL;
ScreenXS = screenXS;
ScreenXSMin = screenXS;
ScreenXSMax = screenSM - 1;
@@ -206,7 +196,7 @@ public partial class DesignToken : AbstractDesignToken
ScreenXLMax = screenXXL - 1;
ScreenXXL = screenXXL;
ScreenXXLMin = screenXXL;
BoxShadows = new BoxShadows(new BoxShadow
{
OffsetX = 0,
@@ -233,7 +223,7 @@ public partial class DesignToken : AbstractDesignToken
Color = ColorUtils.FromRgbF(0.05, 0, 0, 0)
}
});
BoxShadowsSecondary = new BoxShadows(new BoxShadow
{
OffsetX = 0,
@@ -260,7 +250,7 @@ public partial class DesignToken : AbstractDesignToken
Color = ColorUtils.FromRgbF(0.07, 0, 0, 0)
}
});
BoxShadowsTertiary = new BoxShadows(new BoxShadow
{
OffsetX = 0,