diff --git a/color-module/src/schemes/material_design_3_dynamic/constants.rs b/color-module/src/schemes/material_design_3_dynamic/constants.rs index 8786bd9..4687cb9 100644 --- a/color-module/src/schemes/material_design_3_dynamic/constants.rs +++ b/color-module/src/schemes/material_design_3_dynamic/constants.rs @@ -43,6 +43,22 @@ impl Variant { Variant::FruitSalad => "Fruit Salad".to_string(), } } + + pub fn from_u8(value: u8) -> Variant { + match value { + 0 => Variant::Monochrome, + 1 => Variant::Neutral, + 2 => Variant::TonalSpot, + 3 => Variant::Vibrant, + 4 => Variant::Expressive, + 5 => Variant::Fidelity, + 6 => Variant::Content, + 7 => Variant::Rainbow, + 8 => Variant::FruitSalad, + _ => Variant::Expressive, + } + } + pub fn hues(&self) -> Vec { match self { Variant::Vibrant => vec![0.0, 41.0, 61.0, 101.0, 131.0, 181.0, 251.0, 301.0, 360.0], diff --git a/color-module/src/schemes/material_design_3_dynamic/dynamic_color.rs b/color-module/src/schemes/material_design_3_dynamic/dynamic_color.rs index 24db217..2ba9ddb 100644 --- a/color-module/src/schemes/material_design_3_dynamic/dynamic_color.rs +++ b/color-module/src/schemes/material_design_3_dynamic/dynamic_color.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use palette::Lch; use crate::schemes::material_design_3::TonalPalette; @@ -6,7 +8,7 @@ use super::{contrast_curve::ContrastCurve, dynamic_scheme::DynamicScheme}; pub type TonalPaletteGenerator = Box TonalPalette>; pub type ToneSearcher = Box f32>; -pub type DynamicColorSearcher = Box DynamicColor>; +pub type DynamicColorSearcher = Box Rc>; pub type ToneDeltaPairGenerator = Box ToneDeltaPair>; pub type CustomPaletteGenerator = Box TonalPalette>; @@ -31,8 +33,8 @@ pub struct DynamicColor { } pub struct ToneDeltaPair { - pub role_a: DynamicColor, - pub role_b: DynamicColor, + pub role_a: Rc, + pub role_b: Rc, pub delta: f32, pub polarity: TonePolarity, pub togather: bool, diff --git a/color-module/src/schemes/material_design_3_dynamic/material_colors.rs b/color-module/src/schemes/material_design_3_dynamic/material_colors.rs index 415df33..02ce8a9 100644 --- a/color-module/src/schemes/material_design_3_dynamic/material_colors.rs +++ b/color-module/src/schemes/material_design_3_dynamic/material_colors.rs @@ -1,3 +1,5 @@ +use std::{cell::LazyCell, rc::Rc}; + use crate::cond; use super::{ @@ -8,9 +10,9 @@ use super::{ }; macro_rules! dynamic_gen { - ($name: ident, $palette: expr, $tone: expr) => { - pub fn $name() -> DynamicColor { - DynamicColor::new( + ($variable: ident, $name: ident, $palette: expr, $tone: expr) => { + pub const $variable: LazyCell> = LazyCell::new(|| { + Rc::new(DynamicColor::new( Some(stringify!($name)), Box::new($palette), Box::new($tone), @@ -19,12 +21,12 @@ macro_rules! dynamic_gen { None, None, None, - ) - } + )) + }); }; - ($name: ident, $palette: expr, $tone: expr, $is_background: expr) => { - pub fn $name() -> DynamicColor { - DynamicColor::new( + ($variable: ident, $name: ident, $palette: expr, $tone: expr, $is_background: expr) => { + pub const $variable: LazyCell> = LazyCell::new(|| { + Rc::new(DynamicColor::new( Some(stringify!($name)), Box::new($palette), Box::new($tone), @@ -33,12 +35,12 @@ macro_rules! dynamic_gen { None, None, None, - ) - } + )) + }); }; - ($name: ident, $palette: expr, $tone: expr, $background: expr, $contrast_curve: expr) => { - pub fn $name() -> DynamicColor { - DynamicColor::new( + ($variable: ident, $name: ident, $palette: expr, $tone: expr, $background: expr, $contrast_curve: expr) => { + pub const $variable: LazyCell> = LazyCell::new(|| { + Rc::new(DynamicColor::new( Some(stringify!($name)), Box::new($palette), Box::new($tone), @@ -47,12 +49,12 @@ macro_rules! dynamic_gen { None, Some($contrast_curve), None, - ) - } + )) + }); }; - ($name: ident, $palette: expr, $tone: expr, $is_background: expr, $background: expr, $secondary_background: expr, $contrast_curve: expr, $tone_delta_pairs: expr) => { - pub fn $name() -> DynamicColor { - DynamicColor::new( + ($variable: ident, $name: ident, $palette: expr, $tone: expr, $is_background: expr, $background: expr, $secondary_background: expr, $contrast_curve: expr, $tone_delta_pairs: expr) => { + pub const $variable: LazyCell> = LazyCell::new(|| { + Rc::new(DynamicColor::new( Some(stringify!($name)), Box::new($palette), Box::new($tone), @@ -61,8 +63,8 @@ macro_rules! dynamic_gen { $secondary_background, $contrast_curve, $tone_delta_pairs, - ) - } + )) + }); }; } @@ -76,17 +78,19 @@ fn is_monochrome(scheme: &DynamicScheme) -> bool { scheme.variant == Variant::Monochrome } -fn highest_surface(s: &DynamicScheme) -> DynamicColor { - cond!(s.is_dark, surface_bright(), surface()) +fn highest_surface(s: &DynamicScheme) -> Rc { + cond!(s.is_dark, Rc::clone(&SURFACE_BRIGHT), Rc::clone(&SURFACE)) } dynamic_gen!( + SURFACE, surface, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 6.0, 98.0), true ); dynamic_gen!( + SURFACE_DIM, surface_dim, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -97,6 +101,7 @@ dynamic_gen!( true ); dynamic_gen!( + SURFACE_BRIGHT, surface_bright, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -107,6 +112,7 @@ dynamic_gen!( true ); dynamic_gen!( + SURFACE_CONTAINER_LOWEST, surface_container_lowest, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -117,6 +123,7 @@ dynamic_gen!( true ); dynamic_gen!( + SURFACE_CONTAINER_LOW, surface_container_low, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -127,6 +134,7 @@ dynamic_gen!( true ); dynamic_gen!( + SURFACE_CONTAINER, surface_container, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -137,6 +145,7 @@ dynamic_gen!( true ); dynamic_gen!( + SURFACE_CONTAINER_HIGH, surface_container_high, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -147,6 +156,7 @@ dynamic_gen!( true ); dynamic_gen!( + SURFACE_CONTAINER_HIGHEST, surface_container_highest, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!( @@ -157,6 +167,7 @@ dynamic_gen!( true ); dynamic_gen!( + ON_SURFACE, on_surface, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 90.0, 10.0), @@ -164,12 +175,14 @@ dynamic_gen!( ContrastCurve::new(4.5, 7.0, 11.0, 21.0) ); dynamic_gen!( + SURFACE_VARIANT, surface_variant, |s: &DynamicScheme| s.neutral_variant_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 30.0, 90.0), true ); dynamic_gen!( + ON_SURFACE_VARIANT, on_surface_variant, |s: &DynamicScheme| s.neutral_variant_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 80.0, 30.0), @@ -177,18 +190,21 @@ dynamic_gen!( ContrastCurve::new(3.0, 4.5, 7.0, 11.0) ); dynamic_gen!( + INVERSE_SURFACE, inverse_surface, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 20.0, 95.0) ); dynamic_gen!( + INVERSE_ON_SURFACE, inverse_on_surface, |s: &DynamicScheme| s.neutral_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 20.0, 95.0), - |_| inverse_surface(), + |_| Rc::clone(&INVERSE_SURFACE), ContrastCurve::new(4.5, 7.0, 11.0, 21.0) ); dynamic_gen!( + OUTLINE, outline, |s: &DynamicScheme| s.neutral_variant_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 60.0, 50.0), @@ -196,6 +212,7 @@ dynamic_gen!( ContrastCurve::new(1.5, 3.0, 4.5, 7.0) ); dynamic_gen!( + OUTLINE_VARIANT, outline_variant, |s: &DynamicScheme| s.neutral_variant_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 30.0, 80.0), @@ -203,14 +220,19 @@ dynamic_gen!( ContrastCurve::new(1.0, 1.0, 3.0, 4.5) ); dynamic_gen!( + SHADOW, shadow, |s: &DynamicScheme| s.neutral_palette.clone(), |_| 0.0 ); -dynamic_gen!(scrim, |s: &DynamicScheme| s.neutral_palette.clone(), |_| { - 0.0 -}); dynamic_gen!( + SCRIM, + scrim, + |s: &DynamicScheme| s.neutral_palette.clone(), + |_| { 0.0 } +); +dynamic_gen!( + PRIMARY, primary, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| { @@ -225,14 +247,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(3.0, 4.5, 7.0, 7.0)), Some(Box::new(|_| ToneDeltaPair { - role_a: primary_container(), - role_b: primary(), + role_a: Rc::clone(&PRIMARY_CONTAINER), + role_b: Rc::clone(&PRIMARY), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_PRIMARY, on_primary, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| { @@ -242,10 +265,11 @@ dynamic_gen!( cond!(s.is_dark, 20.0, 100.0) } }, - |_| primary(), + |_| Rc::clone(&PRIMARY), ContrastCurve::new(4.5, 7.0, 11.0, 21.0) ); dynamic_gen!( + PRIMARY_CONTAINER, primary_container, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| { @@ -263,19 +287,20 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: primary_container(), - role_b: primary(), + role_a: Rc::clone(&PRIMARY_CONTAINER), + role_b: Rc::clone(&PRIMARY), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_PRIMARY_CONTAINER, on_primary_container, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| { if is_fidelity(s) { - return foreground_tone(primary_container().get_tone(s), 4.5); + return foreground_tone(Rc::clone(&PRIMARY_CONTAINER).get_tone(s), 4.5); } if is_monochrome(s) { cond!(s.is_dark, 0.0, 100.0) @@ -283,17 +308,19 @@ dynamic_gen!( cond!(s.is_dark, 90.0, 30.0) } }, - |_| primary_container(), + |_| Rc::clone(&PRIMARY_CONTAINER), ContrastCurve::new(3.0, 4.5, 7.0, 11.0) ); dynamic_gen!( + INVERSE_PRIMARY, inverse_primary, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 40.0, 80.0), - |_| inverse_surface(), + |_| Rc::clone(&INVERSE_SURFACE), ContrastCurve::new(3.0, 4.5, 7.0, 7.0) ); dynamic_gen!( + SECONDARY, secondary, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 80.0, 40.0), @@ -304,6 +331,7 @@ dynamic_gen!( None ); dynamic_gen!( + ON_SECONDARY, on_secondary, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| { @@ -313,10 +341,11 @@ dynamic_gen!( cond!(s.is_dark, 20.0, 100.0) } }, - |_| secondary(), + |_| Rc::clone(&SECONDARY), ContrastCurve::new(4.5, 7.0, 11.0, 21.0) ); dynamic_gen!( + SECONDARY_CONTAINER, secondary_container, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| { @@ -331,14 +360,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: secondary_container(), - role_b: secondary(), + role_a: Rc::clone(&SECONDARY_CONTAINER), + role_b: Rc::clone(&SECONDARY), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_SECONDARY_CONTAINER, on_secondary_container, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| { @@ -348,12 +378,13 @@ dynamic_gen!( if !is_fidelity(s) { return cond!(s.is_dark, 90.0, 30.0); } - foreground_tone(secondary_container().get_tone(s), 4.5) + foreground_tone(Rc::clone(&SECONDARY_CONTAINER).get_tone(s), 4.5) }, - |_| secondary_container(), + |_| Rc::clone(&SECONDARY_CONTAINER), ContrastCurve::new(3.0, 4.5, 7.0, 11.0) ); dynamic_gen!( + TERTIARY, tertiary, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| { @@ -367,14 +398,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(3.0, 4.5, 7.0, 7.0)), Some(Box::new(|_| ToneDeltaPair { - role_a: tertiary_container(), - role_b: tertiary(), + role_a: Rc::clone(&TERTIARY_CONTAINER), + role_b: Rc::clone(&TERTIARY), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_TERTIARY, on_tertiary, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| { @@ -383,10 +415,11 @@ dynamic_gen!( } cond!(s.is_dark, 20.0, 100.0) }, - |_| tertiary(), + |_| Rc::clone(&TERTIARY), ContrastCurve::new(4.5, 7.0, 11.0, 21.0) ); dynamic_gen!( + TERTIARY_CONTAINER, tertiary_container, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| { @@ -404,14 +437,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: tertiary_container(), - role_b: tertiary(), + role_a: Rc::clone(&TERTIARY_CONTAINER), + role_b: Rc::clone(&TERTIARY), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_TERTIARY_CONTAINER, on_tertiary_container, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| { @@ -421,12 +455,13 @@ dynamic_gen!( if !is_fidelity(s) { return cond!(s.is_dark, 90.0, 30.0); } - foreground_tone(tertiary_container().get_tone(s), 4.5) + foreground_tone(Rc::clone(&TERTIARY_CONTAINER).get_tone(s), 4.5) }, - |_| tertiary_container(), + |_| Rc::clone(&TERTIARY_CONTAINER), ContrastCurve::new(3.0, 4.5, 7.0, 11.0) ); dynamic_gen!( + ERROR, error, |s: &DynamicScheme| s.error_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 80.0, 40.0), @@ -435,21 +470,23 @@ dynamic_gen!( None, Some(ContrastCurve::new(3.0, 4.5, 7.0, 7.0)), Some(Box::new(|_| ToneDeltaPair { - role_a: error_container(), - role_b: error(), + role_a: Rc::clone(&ERROR_CONTAINER), + role_b: Rc::clone(&ERROR), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_ERROR, on_error, |s: &DynamicScheme| s.error_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 20.0, 100.0), - |_| error(), + |_| Rc::clone(&ERROR), ContrastCurve::new(4.5, 7.0, 11.0, 21.0) ); dynamic_gen!( + ERROR_CONTAINER, error_container, |s: &DynamicScheme| s.error_palette.clone(), |s: &DynamicScheme| cond!(s.is_dark, 30.0, 90.0), @@ -458,14 +495,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: error_container(), - role_b: error(), + role_a: Rc::clone(&ERROR_CONTAINER), + role_b: Rc::clone(&ERROR), delta: 10.0, polarity: TonePolarity::Nearer, togather: false, })) ); dynamic_gen!( + ON_ERROR_CONTAINER, on_error_container, |s: &DynamicScheme| s.error_palette.clone(), |s: &DynamicScheme| { @@ -475,10 +513,11 @@ dynamic_gen!( cond!(s.is_dark, 90.0, 30.0) } }, - |_| error_container(), + |_| Rc::clone(&ERROR_CONTAINER), ContrastCurve::new(3.0, 4.5, 7.0, 11.0) ); dynamic_gen!( + PRIMARY_FIXED, primary_fixed, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 40.0, 90.0), @@ -487,14 +526,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: primary_fixed(), - role_b: primary_fixed_dim(), + role_a: Rc::clone(&PRIMARY_FIXED), + role_b: Rc::clone(&PRIMARY_FIXED_DIM), delta: 10.0, polarity: TonePolarity::Lighter, togather: true, })) ); dynamic_gen!( + PRIMARY_FIXED_DIM, primary_fixed_dim, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 30.0, 80.0), @@ -503,34 +543,37 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: primary_fixed(), - role_b: primary_fixed_dim(), + role_a: Rc::clone(&PRIMARY_FIXED), + role_b: Rc::clone(&PRIMARY_FIXED_DIM), delta: 10.0, polarity: TonePolarity::Lighter, togather: true, })) ); dynamic_gen!( + ON_PRIMARY_FIXED, on_primary_fixed, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 100.0, 10.0), None, - Some(Box::new(|_| primary_fixed_dim())), - Some(Box::new(|_| primary_fixed())), + Some(Box::new(|_| Rc::clone(&PRIMARY_FIXED_DIM))), + Some(Box::new(|_| Rc::clone(&PRIMARY_FIXED))), Some(ContrastCurve::new(4.5, 7.0, 11.0, 21.0)), None ); dynamic_gen!( + ON_PRIMARY_FIXED_VARIANT, on_primary_fixed_variant, |s: &DynamicScheme| s.primary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 90.0, 30.0), None, - Some(Box::new(|_| primary_fixed_dim())), - Some(Box::new(|_| primary_fixed())), + Some(Box::new(|_| Rc::clone(&PRIMARY_FIXED_DIM))), + Some(Box::new(|_| Rc::clone(&PRIMARY_FIXED))), Some(ContrastCurve::new(3.0, 4.5, 7.0, 11.0)), None ); dynamic_gen!( + SECONDARY_FIXED, secondary_fixed, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 80.0, 90.0), @@ -539,14 +582,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: secondary_fixed(), - role_b: secondary_fixed_dim(), + role_a: Rc::clone(&SECONDARY_FIXED), + role_b: Rc::clone(&SECONDARY_FIXED_DIM), delta: 10.0, polarity: TonePolarity::Lighter, togather: true, })) ); dynamic_gen!( + SECONDARY_FIXED_DIM, secondary_fixed_dim, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 70.0, 80.0), @@ -555,34 +599,37 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: secondary_fixed(), - role_b: secondary_fixed_dim(), + role_a: Rc::clone(&SECONDARY_FIXED), + role_b: Rc::clone(&SECONDARY_FIXED_DIM), delta: 10.0, polarity: TonePolarity::Lighter, togather: true, })) ); dynamic_gen!( + ON_SECONDARY_FIXED, on_secondary_fixed, |s: &DynamicScheme| s.secondary_palette.clone(), |_| 10.0, None, - Some(Box::new(|_| secondary_fixed_dim())), - Some(Box::new(|_| secondary_fixed())), + Some(Box::new(|_| Rc::clone(&SECONDARY_FIXED_DIM))), + Some(Box::new(|_| Rc::clone(&SECONDARY_FIXED))), Some(ContrastCurve::new(4.5, 7.0, 11.0, 21.0)), None ); dynamic_gen!( + ON_SECONDARY_FIXED_VARIANT, on_secondary_fixed_variant, |s: &DynamicScheme| s.secondary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 25.0, 30.0), None, - Some(Box::new(|_| secondary_fixed_dim())), - Some(Box::new(|_| secondary_fixed())), + Some(Box::new(|_| Rc::clone(&SECONDARY_FIXED_DIM))), + Some(Box::new(|_| Rc::clone(&SECONDARY_FIXED))), Some(ContrastCurve::new(3.0, 4.5, 7.0, 11.0)), None ); dynamic_gen!( + TERTIARY_FIXED, tertiary_fixed, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 40.0, 90.0), @@ -591,14 +638,15 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: tertiary_fixed(), - role_b: tertiary_fixed_dim(), + role_a: Rc::clone(&TERTIARY_FIXED), + role_b: Rc::clone(&TERTIARY_FIXED_DIM), delta: 10.0, polarity: TonePolarity::Lighter, togather: true, })) ); dynamic_gen!( + TERTIARY_FIXED_DIM, tertiary_fixed_dim, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 30.0, 80.0), @@ -607,36 +655,38 @@ dynamic_gen!( None, Some(ContrastCurve::new(1.0, 1.0, 3.0, 4.5)), Some(Box::new(|_| ToneDeltaPair { - role_a: tertiary_fixed(), - role_b: tertiary_fixed_dim(), + role_a: Rc::clone(&TERTIARY_FIXED), + role_b: Rc::clone(&TERTIARY_FIXED_DIM), delta: 10.0, polarity: TonePolarity::Lighter, togather: true, })) ); dynamic_gen!( + ON_TERTIARY_FIXED, on_tertiary_fixed, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 100.0, 10.0), None, - Some(Box::new(|_| tertiary_fixed_dim())), - Some(Box::new(|_| tertiary_fixed())), + Some(Box::new(|_| Rc::clone(&TERTIARY_FIXED_DIM))), + Some(Box::new(|_| Rc::clone(&TERTIARY_FIXED))), Some(ContrastCurve::new(4.5, 7.0, 11.0, 21.0)), None ); dynamic_gen!( + ON_TERTIARY_FIXED_VARIANT, on_tertiary_fixed_variant, |s: &DynamicScheme| s.tertiary_palette.clone(), |s: &DynamicScheme| cond!(is_monochrome(s), 90.0, 30.0), None, - Some(Box::new(|_| tertiary_fixed_dim())), - Some(Box::new(|_| tertiary_fixed())), + Some(Box::new(|_| Rc::clone(&TERTIARY_FIXED_DIM))), + Some(Box::new(|_| Rc::clone(&TERTIARY_FIXED))), Some(ContrastCurve::new(3.0, 4.5, 7.0, 11.0)), None ); -pub fn custom(name: String) -> DynamicColor { - DynamicColor::new( +pub fn custom(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("{}", name)), { let name = name.clone(); @@ -663,11 +713,11 @@ pub fn custom(name: String) -> DynamicColor { togather: false, })) }, - ) + )) } -pub fn on_custom(name: String) -> DynamicColor { - DynamicColor::new( +pub fn on_custom(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("on_{}", name)), { let name = name.clone(); @@ -691,11 +741,11 @@ pub fn on_custom(name: String) -> DynamicColor { None, Some(ContrastCurve::new(4.5, 7.0, 11.0, 21.0)), None, - ) + )) } -pub fn custom_container(name: String) -> DynamicColor { - DynamicColor::new( +pub fn custom_container(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("{}_container", name)), { let name = name.clone(); @@ -725,11 +775,11 @@ pub fn custom_container(name: String) -> DynamicColor { togather: false, })) }, - ) + )) } -pub fn on_custom_container(name: String) -> DynamicColor { - DynamicColor::new( +pub fn on_custom_container(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("on_{}_container", name)), { let name = name.clone(); @@ -759,11 +809,11 @@ pub fn on_custom_container(name: String) -> DynamicColor { None, Some(ContrastCurve::new(3.0, 4.5, 7.0, 11.0)), None, - ) + )) } -pub fn inverse_custom(name: String) -> DynamicColor { - DynamicColor::new( +pub fn inverse_custom(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("inverse_{}", name)), { let name = name.clone(); @@ -771,15 +821,15 @@ pub fn inverse_custom(name: String) -> DynamicColor { }, Box::new(|s| cond!(s.is_dark, 20.0, 95.0)), None, - Some(Box::new(|_| inverse_surface())), + Some(Box::new(|_| Rc::clone(&INVERSE_SURFACE))), None, Some(ContrastCurve::new(3.0, 4.5, 7.0, 11.0)), None, - ) + )) } -pub fn custom_fixed(name: String) -> DynamicColor { - DynamicColor::new( +pub fn custom_fixed(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("{}_fixed", name)), { let name = name.clone(); @@ -800,11 +850,11 @@ pub fn custom_fixed(name: String) -> DynamicColor { togather: true, })) }, - ) + )) } -pub fn custom_fixed_dim(name: String) -> DynamicColor { - DynamicColor::new( +pub fn custom_fixed_dim(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("{}_fixed_dim", name)), { let name = name.clone(); @@ -825,11 +875,11 @@ pub fn custom_fixed_dim(name: String) -> DynamicColor { togather: true, })) }, - ) + )) } -pub fn on_custom_fixed(name: String) -> DynamicColor { - DynamicColor::new( +pub fn on_custom_fixed(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("on_{}_fixed", name)), { let name = name.clone(); @@ -844,11 +894,11 @@ pub fn on_custom_fixed(name: String) -> DynamicColor { Some(Box::new(move |_| custom_fixed(String::from(&name)))), Some(ContrastCurve::new(4.5, 7.0, 11.0, 21.0)), None, - ) + )) } -pub fn on_custom_fixed_variant(name: String) -> DynamicColor { - DynamicColor::new( +pub fn on_custom_fixed_variant(name: String) -> Rc { + Rc::new(DynamicColor::new( Some(&format!("on_{}_fixed_variant", name)), { let name = name.clone(); @@ -863,5 +913,5 @@ pub fn on_custom_fixed_variant(name: String) -> DynamicColor { Some(Box::new(move |_| custom_fixed(String::from(&name)))), Some(ContrastCurve::new(3.0, 4.5, 7.0, 11.0)), None, - ) + )) } diff --git a/color-module/src/schemes/material_design_3_dynamic/mod.rs b/color-module/src/schemes/material_design_3_dynamic/mod.rs index b8cb2da..48fdc2b 100644 --- a/color-module/src/schemes/material_design_3_dynamic/mod.rs +++ b/color-module/src/schemes/material_design_3_dynamic/mod.rs @@ -33,28 +33,28 @@ pub fn material_design_3_dynamic_variant() -> Result { fn build_primary_color_set(scheme: &DynamicScheme) -> M3ColorSet { M3ColorSet { - root: map_lch_to_srgb_hex(&primary().get_lch(scheme)), - on_root: map_lch_to_srgb_hex(&on_primary().get_lch(scheme)), - container: map_lch_to_srgb_hex(&primary_container().get_lch(scheme)), - on_container: map_lch_to_srgb_hex(&on_primary_container().get_lch(scheme)), - fixed: map_lch_to_srgb_hex(&primary_fixed().get_lch(scheme)), - on_fixed: map_lch_to_srgb_hex(&on_primary_fixed().get_lch(scheme)), - fixed_variant: map_lch_to_srgb_hex(&on_primary_fixed_variant().get_lch(scheme)), - fixed_dim: map_lch_to_srgb_hex(&primary_fixed_dim().get_lch(scheme)), - inverse: map_lch_to_srgb_hex(&inverse_primary().get_lch(scheme)), + root: map_lch_to_srgb_hex(&PRIMARY.get_lch(scheme)), + on_root: map_lch_to_srgb_hex(&ON_PRIMARY.get_lch(scheme)), + container: map_lch_to_srgb_hex(&PRIMARY_CONTAINER.get_lch(scheme)), + on_container: map_lch_to_srgb_hex(&ON_PRIMARY_CONTAINER.get_lch(scheme)), + fixed: map_lch_to_srgb_hex(&PRIMARY_FIXED.get_lch(scheme)), + on_fixed: map_lch_to_srgb_hex(&ON_PRIMARY_FIXED.get_lch(scheme)), + fixed_variant: map_lch_to_srgb_hex(&ON_PRIMARY_FIXED_VARIANT.get_lch(scheme)), + fixed_dim: map_lch_to_srgb_hex(&PRIMARY_FIXED_DIM.get_lch(scheme)), + inverse: map_lch_to_srgb_hex(&INVERSE_PRIMARY.get_lch(scheme)), } } fn build_secondary_color_set(scheme: &DynamicScheme) -> M3ColorSet { M3ColorSet { - root: map_lch_to_srgb_hex(&secondary().get_lch(scheme)), - on_root: map_lch_to_srgb_hex(&on_secondary().get_lch(scheme)), - container: map_lch_to_srgb_hex(&secondary_container().get_lch(scheme)), - on_container: map_lch_to_srgb_hex(&on_secondary_container().get_lch(scheme)), - fixed: map_lch_to_srgb_hex(&secondary_fixed().get_lch(scheme)), - on_fixed: map_lch_to_srgb_hex(&on_secondary_fixed().get_lch(scheme)), - fixed_variant: map_lch_to_srgb_hex(&on_secondary_fixed_variant().get_lch(scheme)), - fixed_dim: map_lch_to_srgb_hex(&secondary_fixed_dim().get_lch(scheme)), + root: map_lch_to_srgb_hex(&SECONDARY.get_lch(scheme)), + on_root: map_lch_to_srgb_hex(&ON_SECONDARY.get_lch(scheme)), + container: map_lch_to_srgb_hex(&SECONDARY_CONTAINER.get_lch(scheme)), + on_container: map_lch_to_srgb_hex(&ON_SECONDARY_CONTAINER.get_lch(scheme)), + fixed: map_lch_to_srgb_hex(&SECONDARY_FIXED.get_lch(scheme)), + on_fixed: map_lch_to_srgb_hex(&ON_SECONDARY_FIXED.get_lch(scheme)), + fixed_variant: map_lch_to_srgb_hex(&ON_SECONDARY_FIXED_VARIANT.get_lch(scheme)), + fixed_dim: map_lch_to_srgb_hex(&SECONDARY_FIXED_DIM.get_lch(scheme)), ..cond!( scheme.is_dark, M3ColorSet::new_dark_set(&scheme.secondary_palette), @@ -65,14 +65,14 @@ fn build_secondary_color_set(scheme: &DynamicScheme) -> M3ColorSet { fn build_tertiary_color_set(scheme: &DynamicScheme) -> M3ColorSet { M3ColorSet { - root: map_lch_to_srgb_hex(&tertiary().get_lch(scheme)), - on_root: map_lch_to_srgb_hex(&on_tertiary().get_lch(scheme)), - container: map_lch_to_srgb_hex(&tertiary_container().get_lch(scheme)), - on_container: map_lch_to_srgb_hex(&on_tertiary_container().get_lch(scheme)), - fixed: map_lch_to_srgb_hex(&tertiary_fixed().get_lch(scheme)), - on_fixed: map_lch_to_srgb_hex(&on_tertiary_fixed().get_lch(scheme)), - fixed_variant: map_lch_to_srgb_hex(&on_tertiary_fixed_variant().get_lch(scheme)), - fixed_dim: map_lch_to_srgb_hex(&tertiary_fixed_dim().get_lch(scheme)), + root: map_lch_to_srgb_hex(&TERTIARY.get_lch(scheme)), + on_root: map_lch_to_srgb_hex(&ON_TERTIARY.get_lch(scheme)), + container: map_lch_to_srgb_hex(&TERTIARY_CONTAINER.get_lch(scheme)), + on_container: map_lch_to_srgb_hex(&ON_TERTIARY_CONTAINER.get_lch(scheme)), + fixed: map_lch_to_srgb_hex(&TERTIARY_FIXED.get_lch(scheme)), + on_fixed: map_lch_to_srgb_hex(&ON_TERTIARY_FIXED.get_lch(scheme)), + fixed_variant: map_lch_to_srgb_hex(&ON_TERTIARY_FIXED_VARIANT.get_lch(scheme)), + fixed_dim: map_lch_to_srgb_hex(&TERTIARY_FIXED_DIM.get_lch(scheme)), ..cond!( scheme.is_dark, M3ColorSet::new_dark_set(&scheme.tertiary_palette), @@ -83,28 +83,28 @@ fn build_tertiary_color_set(scheme: &DynamicScheme) -> M3ColorSet { fn build_surface_color_set(scheme: &DynamicScheme) -> M3SurfaceSet { M3SurfaceSet { - root: map_lch_to_srgb_hex(&surface().get_lch(scheme)), - dim: map_lch_to_srgb_hex(&surface_dim().get_lch(scheme)), - bright: map_lch_to_srgb_hex(&surface_bright().get_lch(scheme)), - variant: map_lch_to_srgb_hex(&surface_variant().get_lch(scheme)), - container: map_lch_to_srgb_hex(&surface_container().get_lch(scheme)), - container_lowest: map_lch_to_srgb_hex(&surface_container_lowest().get_lch(scheme)), - container_low: map_lch_to_srgb_hex(&surface_container_low().get_lch(scheme)), - container_high: map_lch_to_srgb_hex(&surface_container_high().get_lch(scheme)), - container_highest: map_lch_to_srgb_hex(&surface_container_highest().get_lch(scheme)), - on_root: map_lch_to_srgb_hex(&on_surface().get_lch(scheme)), - on_root_variant: map_lch_to_srgb_hex(&on_surface_variant().get_lch(scheme)), - inverse: map_lch_to_srgb_hex(&inverse_surface().get_lch(scheme)), - on_inverse: map_lch_to_srgb_hex(&inverse_on_surface().get_lch(scheme)), + root: map_lch_to_srgb_hex(&SURFACE.get_lch(scheme)), + dim: map_lch_to_srgb_hex(&SURFACE_DIM.get_lch(scheme)), + bright: map_lch_to_srgb_hex(&SURFACE_BRIGHT.get_lch(scheme)), + variant: map_lch_to_srgb_hex(&SURFACE_VARIANT.get_lch(scheme)), + container: map_lch_to_srgb_hex(&SURFACE_CONTAINER.get_lch(scheme)), + container_lowest: map_lch_to_srgb_hex(&SURFACE_CONTAINER_LOWEST.get_lch(scheme)), + container_low: map_lch_to_srgb_hex(&SURFACE_CONTAINER_LOW.get_lch(scheme)), + container_high: map_lch_to_srgb_hex(&SURFACE_CONTAINER_HIGH.get_lch(scheme)), + container_highest: map_lch_to_srgb_hex(&SURFACE_CONTAINER_HIGHEST.get_lch(scheme)), + on_root: map_lch_to_srgb_hex(&ON_SURFACE.get_lch(scheme)), + on_root_variant: map_lch_to_srgb_hex(&ON_SURFACE_VARIANT.get_lch(scheme)), + inverse: map_lch_to_srgb_hex(&INVERSE_SURFACE.get_lch(scheme)), + on_inverse: map_lch_to_srgb_hex(&INVERSE_ON_SURFACE.get_lch(scheme)), } } fn build_error_color_set(scheme: &DynamicScheme) -> M3ColorSet { M3ColorSet { - root: map_lch_to_srgb_hex(&error().get_lch(scheme)), - on_root: map_lch_to_srgb_hex(&on_error().get_lch(scheme)), - container: map_lch_to_srgb_hex(&error_container().get_lch(scheme)), - on_container: map_lch_to_srgb_hex(&on_error_container().get_lch(scheme)), + root: map_lch_to_srgb_hex(&ERROR.get_lch(scheme)), + on_root: map_lch_to_srgb_hex(&ON_ERROR.get_lch(scheme)), + container: map_lch_to_srgb_hex(&ERROR_CONTAINER.get_lch(scheme)), + on_container: map_lch_to_srgb_hex(&ON_ERROR_CONTAINER.get_lch(scheme)), ..cond!( scheme.is_dark, M3ColorSet::new_dark_set(&scheme.error_palette), @@ -134,10 +134,10 @@ pub fn build_baseline(scheme: &DynamicScheme) -> M3BaselineColors { build_tertiary_color_set(scheme), build_error_color_set(scheme), build_surface_color_set(scheme), - map_lch_to_srgb_hex(&outline().get_lch(scheme)), - map_lch_to_srgb_hex(&outline_variant().get_lch(scheme)), - map_lch_to_srgb_hex(&scrim().get_lch(scheme)), - map_lch_to_srgb_hex(&shadow().get_lch(scheme)), + map_lch_to_srgb_hex(&OUTLINE.get_lch(scheme)), + map_lch_to_srgb_hex(&OUTLINE_VARIANT.get_lch(scheme)), + map_lch_to_srgb_hex(&SCRIM.get_lch(scheme)), + map_lch_to_srgb_hex(&SHADOW.get_lch(scheme)), scheme .custom_palettes .keys() diff --git a/color-module/src/schemes/mod.rs b/color-module/src/schemes/mod.rs index 7b6c111..dc133a5 100644 --- a/color-module/src/schemes/mod.rs +++ b/color-module/src/schemes/mod.rs @@ -149,13 +149,14 @@ pub fn generate_swatch_scheme( pub fn generate_material_design_3_dynamic_scheme( source_color: &str, error_color: Option, - variant: Variant, + variant: u8, contrast_level: f32, harmonize_customs: bool, custom_colors: JsValue, ) -> Result { let custom_colors: HashMap = serde_wasm_bindgen::from_value(custom_colors) .map_err(|_| errors::ColorError::UnableToParseArgument)?; + let variant = Variant::from_u8(variant); let light_scheme = build_dynamic_scheme( source_color,