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
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() -> Self
pub const fn neutral() -> Self
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.