Move mobile chats into an iOS sidebar and rebuild the chat chrome #6

Merged
kubus merged 6 commits from t3code/round-glass-login-card into main 2026-09-29 19:01:54 +00:00
Owner

Summary

  • Replace the JS bottom tab bar with an iOS-style split shell: a persistent Sidebar on wide windows and an animated slide-over drawer plus scrim on iPhone (App.tsx).
  • Extract the conversation list into ui/Sidebar.tsx with inset-grouped styling, search, in-place rename, and two-step delete; reduce SessionsScreen to a thin wrapper for deep links and tests.
  • Add ui/NavBar.tsx and give ChatScreen a navigation bar (title = session, subtitle = model, menu/new-chat actions) with a model picker presented from the title.
  • Rebuild the composer as a Messages-style toolbar: glass behind solid controls so the transcript blurs through, pill input, circular attach/send/stop buttons, and a horizontally scrolling controls row.
  • Fix LiquidGlassModule against the real UIGlassEffect API (Style instead of isClear) and correct child-view mounting so content renders above the glass.
  • Refresh the theme tokens and card styling (grouped backgrounds, clipped rounded cards) across Connect, Settings, Markdown, controls, and message rows.
  • Run pod install from apps/mobile/ios in the iOS IPA workflow, and add an unsigned iOS build artifact.

Testing

  • Not run: no automated checks executed in this session.
  • Run the mobile typecheck (turbo run typecheck --filter=@hat/mobile or the workspace equivalent) to confirm the GlassViewComponent / duplicate React types fixes hold.
  • Build/run the iOS app in the simulator: verify the sidebar is persistent at width >= 768 and slides in via the menu button below it, with the scrim dismissing on tap.
  • Manually verify composer behavior: attach, send disabled/enabled states, stop while streaming, keyboard avoidance, and the toolbar scrolling under the glass at the home-indicator inset.
  • Check glass rendering on iOS 26 (regular vs clear variants) and confirm the UIBlurEffect fallback on older iOS.
  • Confirm the ios-ipa workflow completes pod install from apps/mobile/ios and produces the unsigned artifact.
## Summary - Replace the JS bottom tab bar with an iOS-style split shell: a persistent `Sidebar` on wide windows and an animated slide-over drawer plus scrim on iPhone (`App.tsx`). - Extract the conversation list into `ui/Sidebar.tsx` with inset-grouped styling, search, in-place rename, and two-step delete; reduce `SessionsScreen` to a thin wrapper for deep links and tests. - Add `ui/NavBar.tsx` and give `ChatScreen` a navigation bar (title = session, subtitle = model, menu/new-chat actions) with a model picker presented from the title. - Rebuild the composer as a Messages-style toolbar: glass behind solid controls so the transcript blurs through, pill input, circular attach/send/stop buttons, and a horizontally scrolling controls row. - Fix `LiquidGlassModule` against the real `UIGlassEffect` API (`Style` instead of `isClear`) and correct child-view mounting so content renders above the glass. - Refresh the theme tokens and card styling (grouped backgrounds, clipped rounded cards) across Connect, Settings, Markdown, controls, and message rows. - Run `pod install` from `apps/mobile/ios` in the iOS IPA workflow, and add an unsigned iOS build artifact. ## Testing - Not run: no automated checks executed in this session. - Run the mobile typecheck (`turbo run typecheck --filter=@hat/mobile` or the workspace equivalent) to confirm the `GlassViewComponent` / duplicate React types fixes hold. - Build/run the iOS app in the simulator: verify the sidebar is persistent at width >= 768 and slides in via the menu button below it, with the scrim dismissing on tap. - Manually verify composer behavior: attach, send disabled/enabled states, stop while streaming, keyboard avoidance, and the toolbar scrolling under the glass at the home-indicator inset. - Check glass rendering on iOS 26 (`regular` vs `clear` variants) and confirm the `UIBlurEffect` fallback on older iOS. - Confirm the `ios-ipa` workflow completes `pod install` from `apps/mobile/ios` and produces the unsigned artifact.
expo declares no @types/react, so it phantom-resolves the one out of pnpm's
shared hoisted bucket, where apps/web leaves its React 18 copy while this app
is on React 19. The two ComponentType identities never unify, so annotating
the native view with our own broke the typecheck as soon as both apps were on
main together.

Use the component type expo hands back rather than restating it. The exported
bundle is byte-identical, so this is a type-level fix only.
expo prebuild generates the Podfile under ios/, not beside app.json, so
running pod install from apps/mobile failed with "No Podfile found".
Two compile errors, both in code that had never been built:

- UIGlassEffect has no isClear property. The variant is chosen at init
  through UIGlassEffect.Style, which is .regular or .clear, so a variant
  change has to build a new effect instead of mutating the old one.
- The @Prop attribute does not exist in this ExpoModulesCore, and the
  prop was already declared by the Prop block in the module definition.
  Two declarations of the same prop; dropped the attribute.
- Commit apps/mobile/hat-unsigned.ipa
kubus merged commit 5c21e6f142 into main 2026-09-29 19:01:54 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
kubus/hatchat!6
No description provided.