- Add search icon toggle in top bar with animated search field
- Real-time message filtering on search query match
- Match counter with previous/next navigation arrows
- Case-insensitive text highlighting in user and assistant bubbles
- Dismiss search restores full message list
- Empty state for no search results
Co-authored-by: ronia <ronia@m57>
Add clickable URL detection with primary color + underline styling and browser launch via UriHandler. Add long-press to copy raw message text to clipboard for both user and assistant chat bubbles.
Fixes#29, Fixes#30
Adds a colored dot next to the '⚡ Hermes' brand header in the
navigation drawer:
- Green: connected
- Yellow: connecting / reconnecting
- Red: disconnected
Uses a StateFlow on HermesWsClient that tracks the WebSocket
connection lifecycle and is collected in the drawer header.
## What
Adds a new Navigation Bar section to Settings where users can customize which items appear in the bottom navigation bar.
## Features
- Pick from any of the 19 drawer screens (max 5 items)
- Remove items with a close/delete button
- Items persist via SharedPreferences (CSV format)
- Invalid names are silently dropped
- Existing screens and auth-aware filtering respected
Closes#23
- HermesScaffold: added isRefreshing param, wraps content in PullToRefreshBox when onRefresh is set
- All 16 data screens: pass isRefreshing = state.isLoading
- Initial loading only shows full-screen LoadingState when data is empty (no spinner over existing content)
- AchievementsScreen already had the correct pattern, just needed isRefreshing param
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
- HermesScaffold: title now @Composable () -> Unit (M3-idiomatic)
- HermesScaffold: added modifier and snackbarHost parameters
- Updated all 18 callers from title="X" to title={Text("X")}
- ChatScreen: converted from raw Scaffold to HermesScaffold
- Removed unused Menu icon import (ktlint fix)
* refactor(#5): convert SettingsScreen to use HermesScaffold
Replace raw Material3 Scaffold + manual TopAppBar with the shared
HermesScaffold wrapper. Removes ~30 lines of duplicated boilerplate
and gives SettingsScreen scroll-aware top bar behavior.
Closes#5
* fix(#5): restore ExperimentalMaterial3Api import for SegmentedButton
---------
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
Remove ~30 lines of duplicated code by using the shared EmptyState
from ui/common/StateViews.kt instead of the private version.
Closes#4
Co-authored-by: M57 <hy4ri@users.noreply.github.com>
Complete UI/UX rewrite of hermes-mobile with Material You design system.
Phase 1: Color/Theme/Type/Shapes/Spacing/Motion tokens
Phase 2: HermesScaffold, StateViews (skeleton/empty/error), SearchBar, StatusBadge, ToggleRow
Phase 3: Bottom nav + drawer navigation with NavigationController
Phase 4: All 17 screens rewritten with HermesScaffold and Material You patterns
Closes PR #3.
B7 (Jun 18 2026): user reported Settings page unresponsive when
reached via the ChatScreen topbar gear icon, but worked fine via
the drawer sidebar. Two fixes:
1. Route topbar gear through NavigationController.navigateTo()
instead of raw backStack.add(). The NavigationController path
(used by the drawer) deduplicates against the current top
entry and matches the drawer's navigation flow exactly. The
bypass path could stack duplicate SettingsScreen entries on
rapid taps, which likely caused the unresponsive symptom.
2. Add 'Clear Token' OutlinedButton below the Auth Token field in
Settings. One-tap wipes a corrupted / rejected token and saves
immediately, without having to select-and-delete the masked
password field character by character. Recovers from the
'I gave you a bad token' scenario in seconds.