use frust::{Elevation, ElevationLevel, ShadowSpec, SurfaceRole};
const fn elevation_level(dp: f64, surface_role: SurfaceRole) -> ElevationLevel {
let shadow = ShadowSpec {
y_offset: dp / 2.0 + 1.0,
blur_std_dev: dp,
color_alpha: 0.3,
};
ElevationLevel {
dp,
shadow_light: shadow,
shadow_dark: shadow,
surface_role,
}
}
pub const fn elevation() -> Elevation {
Elevation {
level0: elevation_level(0.0, SurfaceRole::Surface),
level1: elevation_level(1.0, SurfaceRole::SurfaceContainerLow),
level2: elevation_level(3.0, SurfaceRole::SurfaceContainer),
level3: elevation_level(6.0, SurfaceRole::SurfaceContainerHigh),
level4: elevation_level(8.0, SurfaceRole::SurfaceContainerHigh),
level5: elevation_level(12.0, SurfaceRole::SurfaceContainerHighest),
}
}
pub struct MaterialSpacing;
impl MaterialSpacing {
pub const XS: f64 = 4.0;
pub const SM: f64 = 8.0;
pub const MD: f64 = 12.0;
pub const LG: f64 = 16.0;
pub const XL: f64 = 24.0;
pub const XXL: f64 = 32.0;
}
pub struct MaterialDimensions;
impl MaterialDimensions {
pub const SPACE_0: f64 = 0.0;
pub const SPACE_4: f64 = 4.0;
pub const SPACE_8: f64 = 8.0;
pub const SPACE_12: f64 = 12.0;
pub const SPACE_16: f64 = 16.0;
pub const SPACE_20: f64 = 20.0;
pub const SPACE_24: f64 = 24.0;
pub const SPACE_28: f64 = 28.0;
pub const SPACE_32: f64 = 32.0;
pub const SPACE_40: f64 = 40.0;
pub const SPACE_48: f64 = 48.0;
pub const SPACE_XS: f64 = Self::SPACE_4;
pub const SPACE_SM: f64 = Self::SPACE_8;
pub const SPACE_MD: f64 = Self::SPACE_12;
pub const SPACE_LG: f64 = Self::SPACE_16;
pub const SPACE_XL: f64 = Self::SPACE_24;
pub const SPACE_XXL: f64 = Self::SPACE_32;
pub const RADIUS_NONE: f64 = 0.0;
pub const RADIUS_EXTRA_SMALL: f64 = 4.0;
pub const RADIUS_SMALL: f64 = 8.0;
pub const RADIUS_MEDIUM: f64 = 12.0;
pub const RADIUS_LARGE: f64 = 16.0;
pub const RADIUS_LARGE_INCREASED: f64 = 20.0;
pub const RADIUS_EXTRA_LARGE: f64 = 28.0;
pub const RADIUS_EXTRA_LARGE_INCREASED: f64 = 32.0;
pub const RADIUS_EXTRA_EXTRA_LARGE: f64 = 48.0;
pub const RADIUS_FULL: f64 = f64::INFINITY;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn elevation_dp_matches_reference() {
let e = elevation();
assert_eq!(e.level0.dp, 0.0);
assert_eq!(e.level1.dp, 1.0);
assert_eq!(e.level2.dp, 3.0);
assert_eq!(e.level3.dp, 6.0);
assert_eq!(e.level4.dp, 8.0);
assert_eq!(e.level5.dp, 12.0);
}
#[test]
fn elevation_shadow_is_identical_on_both_brightnesses() {
let e = elevation();
assert_eq!(e.level0.shadow_light, e.level0.shadow_dark);
assert_eq!(e.level1.shadow_light, e.level1.shadow_dark);
assert_eq!(e.level2.shadow_light, e.level2.shadow_dark);
assert_eq!(e.level3.shadow_light, e.level3.shadow_dark);
assert_eq!(e.level4.shadow_light, e.level4.shadow_dark);
assert_eq!(e.level5.shadow_light, e.level5.shadow_dark);
}
#[test]
fn spacing_scale_matches_reference() {
assert_eq!(MaterialSpacing::XS, 4.0);
assert_eq!(MaterialSpacing::SM, 8.0);
assert_eq!(MaterialSpacing::MD, 12.0);
assert_eq!(MaterialSpacing::LG, 16.0);
assert_eq!(MaterialSpacing::XL, 24.0);
assert_eq!(MaterialSpacing::XXL, 32.0);
}
#[test]
fn spacing_tokens_match_reference() {
assert_eq!(MaterialDimensions::SPACE_0, 0.0);
assert_eq!(MaterialDimensions::SPACE_4, 4.0);
assert_eq!(MaterialDimensions::SPACE_8, 8.0);
assert_eq!(MaterialDimensions::SPACE_12, 12.0);
assert_eq!(MaterialDimensions::SPACE_16, 16.0);
assert_eq!(MaterialDimensions::SPACE_20, 20.0);
assert_eq!(MaterialDimensions::SPACE_24, 24.0);
assert_eq!(MaterialDimensions::SPACE_28, 28.0);
assert_eq!(MaterialDimensions::SPACE_32, 32.0);
assert_eq!(MaterialDimensions::SPACE_40, 40.0);
assert_eq!(MaterialDimensions::SPACE_48, 48.0);
}
#[test]
fn spacing_aliases_match_reference() {
assert_eq!(MaterialDimensions::SPACE_XS, MaterialDimensions::SPACE_4);
assert_eq!(MaterialDimensions::SPACE_SM, MaterialDimensions::SPACE_8);
assert_eq!(MaterialDimensions::SPACE_MD, MaterialDimensions::SPACE_12);
assert_eq!(MaterialDimensions::SPACE_LG, MaterialDimensions::SPACE_16);
assert_eq!(MaterialDimensions::SPACE_XL, MaterialDimensions::SPACE_24);
assert_eq!(MaterialDimensions::SPACE_XXL, MaterialDimensions::SPACE_32);
}
#[test]
fn radius_tokens_match_reference() {
assert_eq!(MaterialDimensions::RADIUS_NONE, 0.0);
assert_eq!(MaterialDimensions::RADIUS_EXTRA_SMALL, 4.0);
assert_eq!(MaterialDimensions::RADIUS_SMALL, 8.0);
assert_eq!(MaterialDimensions::RADIUS_MEDIUM, 12.0);
assert_eq!(MaterialDimensions::RADIUS_LARGE, 16.0);
assert_eq!(MaterialDimensions::RADIUS_LARGE_INCREASED, 20.0);
assert_eq!(MaterialDimensions::RADIUS_EXTRA_LARGE, 28.0);
assert_eq!(MaterialDimensions::RADIUS_EXTRA_LARGE_INCREASED, 32.0);
assert_eq!(MaterialDimensions::RADIUS_EXTRA_EXTRA_LARGE, 48.0);
assert!(MaterialDimensions::RADIUS_FULL.is_infinite());
}
}