Skip to content

feat(onboarding): replace carousel with iOS-style chat feed - #30

Merged
bengidev merged 11 commits into
mainfrom
feat/onboarding-chat-feed
Sep 2, 2026
Merged

bengidev merged 11 commits into
mainfrom
feat/onboarding-chat-feed

Conversation

@bengidev

@bengidev bengidev commented Sep 2, 2026

Copy link
Copy Markdown
Owner

Summary

  • Replace the feature card carousel with a looping chat-style onboarding feed that mirrors the iOS opencore_swifters experience (user prompts, thinking orbs, assistant replies).
  • Port the MetalForge Thinking Orbs procedural animation engine to Compose Canvas for the thinking state.
  • Add usage notice above swipe-to-start, pre-measured thinking-to-assistant morph, and coordinated bottom-anchored scrolling to reduce layout jank.

Test plan

  • Run onboarding on device/emulator and confirm cube hero morphs to header, then chat feed fades in
  • Verify chat loop: user prompt → thinking orb → assistant card with title, subtitle, and description
  • Let the feed run for several cycles and confirm smooth scrolling without clipping below the footer
  • Toggle reduce motion and confirm static conversation fallback works
  • Run unit tests: ./gradlew :app:testDebugUnitTest --tests "io.github.bengidev.opencore.onboarding.*"

Replace carousel image fields with user prompts, icons, and orb styles so
features can drive the iOS-style conversational onboarding feed.
Add a Canvas-based ThinkingOrbsKit port with procedural frame generation
and unit tests for preset resolution and orb state cycling.
Introduce the chat feed, bubbles with pre-measured thinking-to-assistant
morph, feature orbs, usage notice, and a softer shimmer for thinking text.
Wire the single-page onboarding to the new chat feed and usage notice,
removing the legacy feature card carousel presenter.
Document the carousel-to-chat-feed transition and the ThinkingOrbsKit port.
Move orb frame generation into the Canvas draw scope and drive redraws
via view.invalidate() so procedural frame math stays off the composition
thread. Add deterministic fingerprint assertions for the orb engine.
Reuse measured assistant width and height across SubcomposeLayout passes
so thinking bubbles do not compose assistant content twice every frame.
Extract OnboardingChatFeedScrollPolicy from the chat module, rename
isActive to feedActive, use coroutine isActive in feed loops, remove
container LazyColumn semantics, and log scroll retry failures.
Delete unused onboarding_feature_*.png assets left over after the
carousel presenter was replaced by the chat feed.
Add Compose UI tests for reduce-motion static feed and bubble roles,
plus unit tests for the extracted feed scroll policy.
Drop hardcoded golden hashes that differ between macOS and Linux CI;
assert repeatability and distinct fingerprints per orb state instead.
@bengidev
bengidev merged commit a906b94 into main Sep 2, 2026
1 check passed
@bengidev
bengidev deleted the feat/onboarding-chat-feed branch September 2, 2026 07:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant