Instruction file imported from Open-Sikh-Apps/gurbani-audio-player (
.cursor/rules/navigation.mdc). Copyright stays with the author.
Navigation
Root Stack: (tabs) plus full-screen modals. Follow .agents/skills/expo-router/SKILL.md. Use JS Tabs from expo-router (not NativeTabs) so Simple mode can restyle the tab bar. Custom tabBar via @/tw. src/app/ is routes and layouts only — screens live in src/screens/.
- Tabs: Home and Library. Each owns a nested Stack; pushes stay in that tab. Android system back on a tab root (Home or Library) leaves the app (
backBehavior="none"). Nested screens in a tab still pop first. - Share / deeplinks: scheme
gurbaniaudioplayer(gurbaniaudioplayer-devwhenAPP_VARIANT=development). Paths/a/{albumId}and/a/{albumId}/t/{trackId}live under the Home stack only. Cold open and in-app share links both land on Home. Home and album folders setanchor: "index"so Back has a screen under the link. Album?trackId=//t/scroll to the row — do notplayAlbumfrom the link (that restarted from 0). Do not set stackheaderTintColorto accent — that recolors titles. Rootanchor: "(tabs)"keeps Settings/Now Playing on top of tabs. - Tab press: every tab bar tap — including switching — lands on that tab’s root. Nested screens in that tab are discarded.
- Settings: tab bar item presents a full-screen modal. No tab bar, no mini player.
- Mini player: above the tab items in the custom
tabBarwhile a session is loaded (playing, paused, or album-ended replay), on Home/Library and nested screens only. Hidden on Settings and Now Playing. Tap opens the Now Playing modal. - Now Playing: full-screen modal (no tab bar). Nested: sleep timer, bookmarks, bookmark-note (optional note before save).
- Album bookmarks:
/bookmarks?albumId=as a root full-screen modal (no tab bar). SameBookmarksScreenas Now Playing’s nested/now-playing/bookmarks. Edit note uses that stack’sbookmark-noteroute (bookmarkId).