Skip to main content

ShapeScale

Struct ShapeScale 

Source
pub struct ShapeScale {
    pub none: f64,
    pub extra_small: f64,
    pub small: f64,
    pub medium: f64,
    pub large: f64,
    pub large_increased: f64,
    pub extra_large: f64,
    pub extra_large_increased: f64,
    pub extra_extra_large: f64,
    pub full: f64,
}
Expand description

The design-token vocabulary: the Theme bundle plus its component token tables, flat-re-exported from frust-theme so app code never names that crate directly. A root component reads the active theme via use_context::<Theme>(); a widget reads it during paint/layout via PaintCtx::theme_as/LayoutCtx::theme_as (or Theme::from_paint_ctx).

Includes the glass material tokens — this crate ships the opaque recipe, and a design system authors its own translucent one over the same types:

use frust::GlassScale;

let glass = GlassScale::opaque_material();
assert_eq!(glass.chrome.blur_radius_intent, 0.0);
assert!(glass.control.is_opaque());

Also the composable-theming surface: ThemeBuilder (defineTheme/copyWith analog), the no-lock-in typed extension slot (ThemeExtensions) plus its first consumer StatusPalette/StatusColors (success/warning/info), and the motion vocabulary (MotionDurations/EasingSet) — all flat-re-exported so an app (or a design-system plugin) authors a theme against frust::* alone. The 10 Material 3 corner-radius tokens, dp (logical px). full is represented as f64::INFINITY rather than a separate enum variant — resolve it against a concrete box size with ShapeScale::resolve, which clamps an infinite radius to half the box’s shorter side (a pill shape) and passes any finite radius through unchanged.

Fields§

§none: f64§extra_small: f64§small: f64§medium: f64§large: f64§large_increased: f64§extra_large: f64§extra_large_increased: f64§extra_extra_large: f64§full: f64

Always f64::INFINITY — resolve with ShapeScale::resolve.

Implementations§

Source§

impl ShapeScale

Source

pub const fn neutral() -> ShapeScale

The neutral, design-language-free shape scale — see the module docs for why these are the M3 numbers reused verbatim.

Source

pub fn resolve(radius: f64, width: f64, height: f64) -> f64

Resolves a corner radius against a box’s shorter side (min(width, height)), clamping an infinite (ShapeScale::full) radius to a pill shape (shorter_side / 2.0) and any finite radius to itself (already-finite tokens never need clamping in the M3 scale, but a caller-supplied custom radius larger than the box would produce a visually broken corner, so this also caps at the pill radius as a safety net).

Source

pub fn concentric_inner(outer_radius: f64, inset: f64) -> f64

Computes the inner corner radius for a concentrically-nested element.

The concentric-corner principle (Liquid Glass, iOS 26+; see WWDC 2025 session 219 and Apple HIG) defines inner and outer shapes’ rounded corners as sharing the same geometric center, with the inner radius derived from the outer radius minus the inset depth. This applies when a glass container (outer, radius outer_radius) nests a child container (inner, inset by inset on all sides); the child’s corner radius is max(outer_radius - inset, 0.0).

§Formula
  • If outer_radius is infinite (f64::INFINITY), return infinite (a full pill shape has no inner maximum).
  • Otherwise, return max(outer_radius - inset, 0.0) (clamped at zero to prevent negative radii).
§Examples
use frust_theme::ShapeScale;

// Normal nesting: glass bar (outer r=20) with inner pill (inset 4)
assert_eq!(ShapeScale::concentric_inner(20.0, 4.0), 16.0);

// Inset larger than outer: clamp at zero
assert_eq!(ShapeScale::concentric_inner(8.0, 12.0), 0.0);

// Infinite outer radius stays infinite (no clamping)
assert!(ShapeScale::concentric_inner(f64::INFINITY, 4.0).is_infinite());

Trait Implementations§

Source§

impl Clone for ShapeScale

Source§

fn clone(&self) -> ShapeScale

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for ShapeScale

Source§

impl Debug for ShapeScale

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
Source§

impl PartialEq for ShapeScale

Source§

fn eq(&self, other: &ShapeScale) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for ShapeScale

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, S> SimdFrom<T, S> for T
where S: Simd,

Source§

fn simd_from(_simd: S, value: T) -> T

Source§

impl<F, T, S> SimdInto<T, S> for F
where T: SimdFrom<F, S>, S: Simd,

Source§

fn simd_into(self, simd: S) -> T

Source§

impl<T> StorageAccess<T> for T

Source§

fn as_borrowed(&self) -> &T

Borrows the value.
Source§

fn into_taken(self) -> T

Takes the value.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more