The reply resolves. It doesn’t type.
SwiftThe first AI reply used a typewriter that added one character at a time, and every answer read like a machine at work. Now a single Text is laid out once and a custom TextRenderer resolves each word out of a blur. Nothing reflows under the reader, and Reduce Motion swaps it for a crossfade.
/// Reveals a reply one word at a time. The earlier typewriter added
/// characters one by one and made every reply read as a machine at work.
struct TypewriterBlurText: View {
let text: String
/// The vibe type role to set the text in. Wins over `font`.
var role: VibeFont? = nil
let color: Color
/// False shows the text sharp at once. A reply that was read in an
/// earlier session is a record, not an arrival, and must not perform
/// again every time the chat is reopened or scrolled back into view.
var animated: Bool = true
@Environment(\.accessibilityReduceMotion) private var reduceMotion
/// 0 is nothing revealed, 1 is every word sharp.
@State private var progress: Double = 0
@State private var words = WordRevealMap(text: "")
/// Reduce Motion swaps the reveal for a crossfade.
@State private var fade: Double = 1
var body: some View {
styled
.multilineTextAlignment(.leading)
.textRenderer(WordRevealRenderer(progress: progress, words: words))
// …
}
}



















































