pub struct MotionScheme {
pub fast_spatial: MotionSpring,
pub fast_effects: MotionSpring,
pub default_spatial: MotionSpring,
pub default_effects: MotionSpring,
pub slow_spatial: MotionSpring,
pub slow_effects: MotionSpring,
pub durations: MotionDurations,
pub easing: EasingSet,
pub reduce_motion: bool,
pub cosmetic_loop_rate: CosmeticLoopRate,
}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.
Six motion spring presets, plus the Glyph duration/easing token
vocabulary mapped onto each baseline.
Fields§
§fast_spatial: MotionSpring§fast_effects: MotionSpring§default_spatial: MotionSpring§default_effects: MotionSpring§slow_spatial: MotionSpring§slow_effects: MotionSpring§durations: MotionDurationsNamed duration tokens (Glyph vocabulary; see MotionDurations).
easing: EasingSetThe three-easing vocabulary (Glyph vocabulary; see EasingSet).
reduce_motion: boolCollapses patterned motion to a fast crossfade. Every baseline below
defaults this to false — the correct value absent an OS signal — and
a mobile shell raises it from the platform’s own reduced-motion
accessibility preference:
- Android:
Settings.Global.ANIMATOR_DURATION_SCALE, reduced when the scale is exactly0(the same signalValueAnimator:: areAnimatorsEnabledconsults). It is not aConfigurationfield, soonConfigurationChangednever reports it — the embedding registers aContentObserveron that setting’s URI and re-reads it on every resume. - iOS:
UIAccessibility.isReduceMotionEnabled, observed throughUIAccessibility.reduceMotionStatusDidChangeNotification. It is not aUITraitCollectiontrait, sotraitCollectionDidChangenever fires for it. - Desktop: no source. winit 0.30 exposes no reduced-motion (or any other accessibility-preference) accessor and nothing else in the desktop path reads one, so the desktop shell leaves this at whatever the active theme authored — a deliberate, checked gap (2026-07-31), not an oversight to re-investigate.
Both mobile shells apply the OS report as a floor: the platform’s
value is OR’d over the active theme’s own authored token (each shell’s
effective_reduce_motion), never assigned over it. So a theme built
with reduce_motion: true keeps it while the OS setting is off, and
the OS setting still wins whenever it is on.
cosmetic_loop_rate: CosmeticLoopRateThe CosmeticLoop tick-rate cap — see CosmeticLoopRate. Every
baseline below defaults this to 30Hz; override via
crate::builder::ThemeBuilder::map_motion. reduce_motion
interplay: a widget that honors reduce_motion collapses its loop
entirely (this cap never applies then) — this token only paces the
loops that still run when reduce_motion is off/unhonored by that
widget.
Implementations§
Source§impl MotionScheme
impl MotionScheme
Sourcepub const fn neutral() -> MotionScheme
pub const fn neutral() -> MotionScheme
The neutral, design-language-free motion scheme.
Every spring is critically damped (damping_ratio: 1.0, no
overshoot) — unlike frust-material’s under-damped 0.9 spatial
springs (a deliberate M3 Expressive personality trait) or
frust-cupertino’s community-documented ζ≈0.5753 iOS spring, both of
which bounce by design (see each plugin’s own tokens module). A
neutral-themed transition settles without overshoot — a deliberately
unbranded feel, not a missing feature. Stiffness still varies by
speed tier (fast > default > slow), the same three-tier shape every
design system’s own baseline uses.
Duration/easing tokens are a plain, Frust-authored round-number
scale — not sourced from any published design system’s table,
unlike the M3/Cupertino baselines each plugin crate carries — using
only the generic CSS-keyword Curve variants
(EaseOut/EaseInOut/EaseIn), never a design-language-specific
bezier.
Trait Implementations§
Source§impl Clone for MotionScheme
impl Clone for MotionScheme
Source§fn clone(&self) -> MotionScheme
fn clone(&self) -> MotionScheme
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for MotionScheme
Source§impl Debug for MotionScheme
impl Debug for MotionScheme
Source§impl PartialEq for MotionScheme
impl PartialEq for MotionScheme
impl StructuralPartialEq for MotionScheme
Auto Trait Implementations§
impl Freeze for MotionScheme
impl RefUnwindSafe for MotionScheme
impl Send for MotionScheme
impl Sync for MotionScheme
impl Unpin for MotionScheme
impl UnsafeUnpin for MotionScheme
impl UnwindSafe for MotionScheme
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.