use figures::units::Lp;
use kludgine::cosmic_text::{FamilyOwned, Style, Weight};
use kludgine::shapes::CornerRadii;
use kludgine::Color;
use crate::animation::easings::{EaseInOutQuadradic, EaseInQuadradic, EaseOutQuadradic};
use crate::animation::{EasingFunction, ZeroToOne};
use crate::styles::{Dimension, FocusableWidgets, FontFamilyList, VisualOrder};
#[macro_export]
macro_rules! define_components {
($($widget:ident { $($(#$doc:tt)* $component:ident($type:ty, $name:expr $(, $($default:tt)*)?))* })*) => {$($(
$(#$doc)*
#[derive(Clone, Copy, Eq, PartialEq, Debug)]
pub struct $component;
const _: () = {
use $crate::styles::{ComponentDefinition, ComponentName, NamedComponent};
use $crate::context::WidgetContext;
use $crate::Lazy;
use ::std::borrow::Cow;
impl NamedComponent for $component {
fn name(&self) -> Cow<'_, ComponentName> {
static NAME: Lazy<ComponentName> = Lazy::new(|| ComponentName::new(stringify!($widget), $name));
Cow::Borrowed(&*NAME)
}
}
impl ComponentDefinition for $component {
type ComponentType = $type;
define_components!($type, $($($default)*)?);
}
};
)*)*};
($type:ty, . $($path:tt)*) => {
define_components!($type, |context| context.theme().$($path)*);
};
($type:ty, |$context:ident| $($expr:tt)*) => {
fn default_value(&self, $context: &WidgetContext<'_>) -> $type {
$($expr)*
}
};
($type:ty, @$path:path) => {
define_components!($type, |context| context.get(&$path));
};
($type:ty, contrasting!($bg:ident, $($fg:ident),+ $(,)?)) => {
define_components!($type, |context| {
use $crate::styles::ColorExt;
context.get(&$bg).most_contrasting(&[
$(context.get(&$fg)),+
])
});
};
($type:ty, ) => {
define_components!($type, |_context| <$type>::default());
};
($type:ty, $($expr:tt)+) => {
define_components!($type, |_context| $($expr)*);
};
}
define_components! {
Global {
TextSize(Dimension, "text_size", @BaseTextSize)
LineHeight(Dimension,"line_height", @BaseLineHeight)
BaseTextSize(Dimension, "base_text_size", Dimension::Lp(Lp::points(12)))
BaseLineHeight(Dimension,"base_line_height", Dimension::Lp(Lp::points(16)))
TextSize8(Dimension, "text_size_8", |context| context.get(&BaseTextSize) * 2.5)
TextSize7(Dimension, "text_size_7", |context| context.get(&BaseTextSize) * 2.25)
TextSize6(Dimension, "text_size_6", |context| context.get(&BaseTextSize) * 2.0)
TextSize5(Dimension, "text_size_5", |context| context.get(&BaseTextSize) * 1.5)
TextSize4(Dimension, "text_size_4", |context| context.get(&BaseTextSize) * 1.25)
TextSize3(Dimension, "text_size_3", @BaseTextSize)
TextSize2(Dimension, "text_size_2", |context| context.get(&BaseTextSize) * 0.75)
TextSize1(Dimension, "text_size_1", |context| context.get(&BaseTextSize) * 0.5)
LineHeight8(Dimension, "line_height_8", |context| context.get(&BaseLineHeight) * 2.5)
LineHeight7(Dimension, "line_height_7", |context| context.get(&BaseLineHeight) * 2.25)
LineHeight6(Dimension, "line_height_6", |context| context.get(&BaseLineHeight) * 2.0)
LineHeight5(Dimension, "line_height_5", |context| context.get(&BaseLineHeight) * 1.5)
LineHeight4(Dimension, "line_height_4", |context| context.get(&BaseLineHeight) * 1.25)
LineHeight3(Dimension, "line_height_4", @BaseLineHeight)
LineHeight2(Dimension, "line_height_2", |context| context.get(&BaseLineHeight) * 0.75)
LineHeight1(Dimension, "line_height_1", |context| context.get(&BaseLineHeight) * 0.675)
SurfaceColor(Color, "surface_color", .surface.color)
TextColor(Color, "text_color", .surface.on_color)
TextColorVariant(Color, "text_color_variant", .surface.on_color_variant)
HighlightColor(Color,"highlight_color", .primary.color.with_alpha(128))
PrimaryColor(Color, "primary_color", .primary.color)
SecondaryColor(Color, "secondary_color", .secondary.color)
TertiaryColor(Color, "tertiary_color", .tertiary.color)
ErrorColor(Color, "error_color", .error.color)
DefaultForegroundColor(Color, "default_foreground_color", .primary.on_color)
DefaultBackgroundColor(Color, "default_background_color", .primary.color)
DefaultHoveredForegroundColor(Color, "default_hovered_foreground_color", @DefaultForegroundColor)
DefaultHoveredBackgroundColor(Color, "default_hovered_background_color", .primary.color_bright)
DefaultActiveForegroundColor(Color, "default_active_foreground_color", .primary.on_color)
DefaultActiveBackgroundColor(Color, "default_active_background_color", .primary.color_dim)
DefaultDisabledForegroundColor(Color, "default_disabled_foreground_color", .primary.on_color)
DefaultDisabledBackgroundColor(Color, "default_disabled_background_color", .primary.color_dim)
IntrinsicPadding(Dimension, "padding", Dimension::Lp(Lp::points(6)))
Easing(EasingFunction, "Easing", EasingFunction::from(EaseInOutQuadradic))
EasingIn(EasingFunction, "easing_out", EasingFunction::from(EaseInQuadradic))
EasingOut(EasingFunction, "easing_out", EasingFunction::from(EaseOutQuadradic))
LayoutOrder(VisualOrder, "visual_order", VisualOrder::left_to_right())
AutoFocusableControls(FocusableWidgets, "focus", FocusableWidgets::default())
WidgetBackground(Color, "widget_backgrond_color", Color::CLEAR_WHITE)
WidgetAccentColor(Color, "widget_accent_color", .primary.color)
DisabledWidgetAccentColor(Color, "disabled_widget_accent_color", .primary.color_dim)
OutlineColor(Color, "outline_color", .surface.outline)
DisabledOutlineColor(Color, "disabled_outline_color", .surface.outline_variant)
OpaqueWidgetColor(Color, "opaque_color", .surface.opaque_widget)
CornerRadius(CornerRadii<Dimension>, "corner_radius", CornerRadii::from(Dimension::Lp(Lp::points(6))))
FontFamily(FontFamilyList, "font_family", FontFamilyList::from(FamilyOwned::SansSerif))
FontWeight(Weight, "font_weight", Weight::NORMAL)
FontStyle(Style, "font_style", Style::Normal)
HeadingWeight(Weight, "heading_weight", Weight::BOLD)
Heading1Weight(Weight, "heading_weight_1", @HeadingWeight)
Heading2Weight(Weight, "heading_weight_2", @HeadingWeight)
Heading3Weight(Weight, "heading_weight_3", @HeadingWeight)
Heading4Weight(Weight, "heading_weight_4", @HeadingWeight)
Heading5Weight(Weight, "heading_weight_5", @HeadingWeight)
Heading6Weight(Weight, "heading_weight_6", @HeadingWeight)
HeadingStyle(Style, "heading_style", Style::Normal)
Heading1Style(Style, "heading_style_1", @HeadingStyle)
Heading2Style(Style, "heading_style_2", @HeadingStyle)
Heading3Style(Style, "heading_style_3", @HeadingStyle)
Heading4Style(Style, "heading_style_4", @HeadingStyle)
Heading5Style(Style, "heading_style_5", @HeadingStyle)
Heading6Style(Style, "heading_style_6", @HeadingStyle)
HeadingFontFamily(FontFamilyList, "heading_font_family", FontFamilyList::from(FamilyOwned::SansSerif))
Heading1FontFamily(FontFamilyList, "heading_font_family_1", @HeadingFontFamily)
Heading2FontFamily(FontFamilyList, "heading_font_family_2", @HeadingFontFamily)
Heading3FontFamily(FontFamilyList, "heading_font_family_3", @HeadingFontFamily)
Heading4FontFamily(FontFamilyList, "heading_font_family_4", @HeadingFontFamily)
Heading5FontFamily(FontFamilyList, "heading_font_family_5", @HeadingFontFamily)
Heading6FontFamily(FontFamilyList, "heading_font_family_6", @HeadingFontFamily)
Opacity(ZeroToOne, "opacity", ZeroToOne::ONE)
}
}