Skip to content

v0.1.0 - Gemini-style "Sticky Top" Scrolling & Progressive Disclosure UX

Choose a tag to compare

@peterfriese peterfriese released this 09 Apr 13:30
· 12 commits to main since this release
7c02ed8

馃殌 New Features

  • "Push and Pin" Scrolling Physics: Implements a custom, optimistic layout anchor system. When you send a message, the view smoothly anchors the message and pushes it upward as the AI response streams in, finally pinning it gracefully to the top of the screen.
  • Progressive Disclosure APIs: Introduces new environment modifiers that let you inject custom views without cluttering initializers:
    • .messageActions: Inject custom toolbars (Thumbs Up/Down, Copy) below AI messages.
    • .conversationDisclaimer: Inject custom privacy text below the most recent AI message.
  • Interruptible Generation: Tracks execution state within MessageComposerView. While a generation task runs, the composer transforms the "Send" button into an active "Stop" button that supports cooperative task cancellation.

馃拕 UI Improvements

  • Distinct Chat Bubbles: Updates the user message bubble to use an UnevenRoundedRectangle, giving it a distinct "tail" effect. The library now renders AI messages directly into the view without a background bubble.
  • Smart Loading State: Automatically renders a bouncing-dot TypingIndicator if you temporarily add an AI message with content == nil.
  • High-Contrast Disabled State: Relies strictly on native platform styling for the empty composer "Send" button, ensuring high-contrast accessibility in both Light and Dark modes.
  • Proportional Stop Icon: Scales the font size of the stop.fill icon to perfectly balance its visual weight against the default send arrow.

鈿欙笍 Other Changes

  • Comprehensive Architecture Documentation: Adds a new ARCHITECTURE.md file that explains the deep SwiftUI Scroll Physics & Concurrency design decisions.
  • Concurrency Fixes: Eliminates 1-frame micro-delay layout bugs associated with Swift 6 Concurrency by utilizing a local optimisticUserMessage state to guarantee perfect keyboard-dismissal anchoring.

Full Changelog: v0.0.4...v0.1.0