Commit graph

121 commits

Author SHA1 Message Date
KhooLy
79fe70cfc2 Keep the shared shell mounted across all mobile navigation, add Discover skeleton
The shared shell was only mounted while on Home/Search/Discover/
Calendar; navigating to any other native screen (Detail, Sources,
Player, Settings, AddonStore) disposed it entirely, so returning to
any of those four tabs remounted from scratch — fresh stores, fresh
StateFlow defaults (isLoading=true, empty items), and a real re-fetch,
even though the underlying HomeViewModel data was already cached. That
produced the "blank calendar/grid when coming back from another page"
symptom.

FluxaAppHost (mobile) is now always composed as a background layer
behind AppRoutesHost's native AnimatedContent, which only draws on top
(opaque) when the active screen isn't one of those four. The shell
itself is never disposed by navigating elsewhere, so its stores keep
their last-known state and returning to a tab is instant.

Also replaced Discover's full-screen blocking spinner on first load
with a skeleton grid (18 placeholder cards) so the filter row stays
visible and the transition to real results doesn't hide the whole
screen behind a spinner.
2026-07-13 21:29:15 +03:00
KhooLy
9566988f11 Fix shared UI theming and build a real day-grid calendar
MaterialTheme { ... } never set a colorScheme, so every unstyled
Material3 component (OutlinedTextField borders/labels, DropdownMenu
surface/text) rendered with the stock light scheme against the app's
black background instead of matching FluxaColors — the actual cause
of the dropdown/search-bar UI looking broken. Added a dark ColorScheme
built from FluxaColors so every shared screen inherits consistent
theming without per-component overrides.

Calendar was still list-only; rebuilt it as an actual numbered month
grid: a localized weekday header, day cells with leading/trailing
blanks so weeks align (pure-Kotlin Sakamoto's algorithm for the first
weekday and a leap-year-aware days-in-month table, no new platform
expect/actual needed), a dot on days with releases, and a selected-day
detail panel below the grid — matching native's grid+tap-to-see-detail
behavior instead of a flat scrollable date-grouped list.
2026-07-13 21:20:53 +03:00
KhooLy
a57e5f3312 Fix mobile shell reload storm and restore Discover's dropdown/grid/search UI
AppRoutesHost was mounting a fresh FluxaAppHost per Screen navigation,
so every tab switch among Home/Search/Discover/Calendar recreated
CatalogHomeStore and re-triggered CatalogAction.Refresh, which force-
reloads the whole Home catalog over the network regardless of which
tab was actually opened. Hoist the shared shell out of AnimatedContent
so it stays mounted across those four screens and only remounts when
leaving them entirely (Detail/Sources/Player/Settings/etc., same as
before).

Discover regressions from the last pass, now fixed to match native:
- Filter chips replaced with dropdown menus (DropdownMenu/MenuItem)
  matching native's Type/Catalog/Genre picker pattern.
- Grid restored to a fixed 3-column layout instead of adaptive sizing.
- Added the inline search box native's Explore screen has, reusing
  SearchResultRows/SearchResults (now internal, not private) so typing
  in Discover shows grouped search results instead of the filtered
  browse grid, same as native.
2026-07-13 21:12:10 +03:00
KhooLy
3dae079b3f Migrate mobile Search, Discover, and Calendar screens onto shared CMP UI
Wires Screen.Search/Explore/Calendar to FluxaAppHost on mobile, same
pattern as Home. TV keeps using the existing native screens untouched.

To preserve native feature parity in the shared UI:
- Search: per-addon grouped result rows (was a flat grid), a clear
  history action, and a query-specific "no results for X" message with
  a recent-history fallback, matching native's MobileSearchScreen.
- Discover: filter chips are now a scrollable LazyRow instead of a
  plain Row, avoiding the same overflow-wrap bug fixed on Home's row
  headers when there are many genre options.
- Calendar: added month navigation (prev/next + localized month
  title), day-grouped list headers via the existing cross-platform
  localizedShortMonthDay/localizedMonthTitle helpers, replacing the
  flat undated list.

Deliberately not replicated (documented simplification, not a bug):
native's Search and Explore screens each embed a blended search+browse
UX (explore filters shown pre-typing in Search; inline search box in
Explore). Shared keeps Search and Discover as clean separate screens
since both capabilities are still fully reachable via their own tabs.
Also skipped: Explore's list/grid view toggle, swipe-to-change-month
and the day-grid calendar view (list view covers the same data).
2026-07-13 21:02:25 +03:00
KhooLy
97d0244ff8 Fix shared Home screen visuals: row layout, hero carousel, plain catalog titles
Row title now truncates with weight+ellipsis instead of squeezing "View
All" into a vertical letter stack. LazyColumn reserves 120dp bottom
padding to clear the floating mobile bottom nav bar (matching the
native HomeScreen constant). Catalog row titles use
displayHomeCategoryTitle() instead of the addon-qualified
semanticName, matching what native screens show.

FluxaHomeContent gains a real hero: a looping HorizontalPager (virtual
page count wraparound) over the first row's top items, dot indicators,
5s auto-advance, and a distinct "home-hero:" cache key so it decodes a
fresh full-size bitmap instead of reusing the small poster card's
cached one. CatalogItemUiModel gains a backdropUrl so the hero can use
Meta.homeHeroBackdrop() (the same high-res backdrop native hero UI
uses) instead of stretching the small vertical poster artwork.
2026-07-13 20:50:36 +03:00
KhooLy
5eba92b50d Wire Android mobile Home screen onto shared CMP UI
Renders FluxaAppHost for Screen.Home on DeviceType.Mobile using the
already-built AndroidFluxaPlatformServices bridge, replacing the native
HomeRoute/MobileHomeHero path for that screen. FluxaApp/FluxaAppHost
gain showNavigationBar and external destination params so Android can
drive navigation from its own bottom bar instead of the shared shell's
internal one, and an onPlayRequested hook lets Detail's Play action
hand off to the native Sources/Player flow. Android TV is untouched.
2026-07-13 20:19:08 +03:00
KhooLy
0497395057 Add Apple discover effect handler 2026-07-13 17:48:54 +03:00
KhooLy
4f4b049f2d Add shared discover screen 2026-07-13 17:45:48 +03:00
KhooLy
fcb9df3de3 Add shared discover data boundary 2026-07-13 17:43:46 +03:00
KhooLy
c4123c77e3 Add shared Apple search flow 2026-07-13 17:39:50 +03:00
KhooLy
0d438b2edb Fix Apple catalog startup actor isolation 2026-07-13 17:15:49 +03:00
KhooLy
eca5306fa6 Route Apple catalog selections to shared details 2026-07-13 16:21:16 +03:00
KhooLy
3540f8442d Add Apple shared detail data source 2026-07-13 16:16:57 +03:00
KhooLy
834fdc7980 Add Apple detail metadata effect 2026-07-13 16:14:58 +03:00
KhooLy
7b13760f2b Silence Apple runtime teardown warning 2026-07-13 16:10:42 +03:00
KhooLy
3aefc7654d Fix Apple addon catalog resolver build 2026-07-13 16:09:09 +03:00
KhooLy
a8ca1919f4 Add shared route navigation boundary 2026-07-13 16:08:19 +03:00
KhooLy
58ef97d97c Initialize Apple runtime before catalog startup 2026-07-13 16:06:21 +03:00
KhooLy
a33abcae83 Route Apple home loading through headless effects 2026-07-13 16:05:18 +03:00
KhooLy
221dd8d4ec Add shared remote image boundary 2026-07-13 16:00:50 +03:00
KhooLy
d4f5dfd49f Add Apple addon catalog bootstrap 2026-07-13 15:59:01 +03:00
KhooLy
efb6b0c233 Load Apple catalogs into shared home 2026-07-13 15:53:53 +03:00
KhooLy
47e8c7d22f Accept Apple catalog snapshots as JSON 2026-07-13 15:51:52 +03:00
KhooLy
9b2593e5fd Add Apple platform effect executor 2026-07-13 15:50:42 +03:00
KhooLy
7a3a7db34a Add Apple headless effect coordinator 2026-07-13 15:48:53 +03:00
KhooLy
5cc93c4d9f Initialize Apple Rust headless runtime 2026-07-13 15:46:26 +03:00
KhooLy
dabcbc39c2 Use Apple platform services in shared host 2026-07-13 15:44:02 +03:00
KhooLy
d2d075ed6b Accept platform services in shared app host 2026-07-13 15:40:38 +03:00
KhooLy
6fa6c81af3 Split shared platform service capabilities 2026-07-13 15:39:51 +03:00
KhooLy
8790838407 Add Android shared services composition root 2026-07-13 15:38:19 +03:00
KhooLy
fa4adcc5d8 Add shared player controls boundary 2026-07-13 15:37:40 +03:00
KhooLy
42f905af62 Add shared profile settings stores 2026-07-13 15:36:57 +03:00
KhooLy
3ecdb37e5a Add shared search and detail stores 2026-07-13 15:36:18 +03:00
KhooLy
dd54966fb8 Include shared app state 2026-07-13 15:16:59 +03:00
KhooLy
cb99b2b1e8 Add shared catalog action boundary 2026-07-13 15:08:20 +03:00
KhooLy
ae73947f4d Link UIKit as an SDK framework 2026-07-13 14:45:57 +03:00
KhooLy
dd0a5fa8ed Use Xcode 26 for Apple CI 2026-07-13 14:32:55 +03:00
KhooLy
72aa45b8c7 Support macOS Bash in Rust build script 2026-07-13 14:16:15 +03:00
KhooLy
091eaeff87 Bootstrap Apple Rust core before Xcode 2026-07-13 14:10:01 +03:00
KhooLy
c9b3dd0c6e Fix tvOS Rust CI target 2026-07-13 14:03:11 +03:00
KhooLy
60094c4e21 Build Apple Rust core in CI 2026-07-13 13:58:40 +03:00
KhooLy
52fae178e5 Link UIKit in the iOS host 2026-07-13 05:04:37 +03:00
KhooLy
47bf2f6e03 Match iOS host to Compose SDK baseline 2026-07-13 04:54:33 +03:00
KhooLy
7410d81380 Align iOS host with Compose runtime 2026-07-13 04:45:08 +03:00
KhooLy
5779930510 Configure Apple host deployment targets 2026-07-13 04:33:29 +03:00
KhooLy
b08dd5a00d Fix Apple framework export and simulator architecture 2026-07-13 04:22:39 +03:00
KhooLy
f9adf9b16f Run Apple framework builds from project root 2026-07-13 04:13:20 +03:00
KhooLy
89ec1abee6 Use Xcode 16 macOS runner for Apple CI 2026-07-13 04:07:06 +03:00
KhooLy
9344497ce4
Create LICENSE 2026-07-13 04:04:24 +03:00
KhooLy
11a3493dbc Match Apple project format to CI Xcode 2026-07-13 04:00:39 +03:00