Patterns from production · Streams that hold still
Follow the bottom
Scroll follows new events only while the reader is at the end.
Follow the bottom
Try the controls to see the rule.
The rule
Keep the reader at the bottom only while they were already there. New activity should never pull someone away from older content they are reading.
Tokens used
motion.duration.base260msmotion.easing.standardcubic-bezier(.2,.7,.2,1)size.tap44pxspace.md12px
Native spec · generated from this pattern and the shared token registry
struct OvFollowBottom: View {
let status: String
@Environment(\.accessibilityReduceMotion) private var reduceMotion
var body: some View {
HStack(spacing: OvScale.spaceMd) {
Text(status).font(.body)
}
.frame(minHeight: OvScale.sizeTap)
.animation(reduceMotion ? .none : .easeOut(duration: OvScale.motionDurationBase), value: status)
}
}
// Tokens: motion.duration.base=260ms, motion.easing.standard=cubic-bezier(.2,.7,.2,1), size.tap=44px, space.md=12px@Composable
fun OvFollowBottom(status: String, reduceMotion: Boolean) {
Row(
modifier = Modifier.defaultMinSize(minHeight = OvScale.SizeTap),
horizontalArrangement = Arrangement.spacedBy(OvScale.SpaceMd),
) {
Text(status, style = MaterialTheme.typography.bodyMedium)
}
// Apply motion only when !reduceMotion.
}
// Tokens: motion.duration.base=260ms, motion.easing.standard=cubic-bezier(.2,.7,.2,1), size.tap=44px, space.md=12px