3.4 KiB
App Navigation Shell Specification
Purpose
The 5-root tab contract, the push-chrome rule for second-level screens, the explicit Favoritos exemption from that rule, and root-to-root switching (Escuchar "Ver todas" to Favoritos). Traceable to WU1.
Requirements
Requirement: Five-Tab Root Navigation
The app MUST render exactly 5 root tabs, in order: Escuchar, Buscar,
Favoritos, Alarmas, Ajustes, using the existing PluriIconGlyph.* icon set.
PluriIconGlyph.home MUST be the Escuchar tab's icon.
Scenario: App launch renders the 5 tabs in order
- GIVEN the app has finished cold-start
- WHEN the bottom navigation renders
- THEN exactly 5 tabs appear, labeled Escuchar, Buscar, Favoritos, Alarmas, Ajustes, in that order
Scenario: Escuchar uses the home glyph
- GIVEN the bottom navigation is rendered
- WHEN the Escuchar tab's icon is inspected
- THEN it is
PluriIconGlyph.home
Requirement: Push-Chrome on Second-Level Screens
Every genuine second-level screen (Reproductor completo, Países, Vacaciones, Ecualizador, Grabaciones, and every new Settings detail screen) MUST render a 56px header with a back affordance and MUST NOT render a bottom tab bar.
Scenario: Reproductor completo hides the tab bar
- GIVEN the user opens Reproductor completo from Escuchar
- WHEN the screen renders
- THEN it shows a 56px header with a back arrow and no bottom tab bar
Scenario: A Settings detail screen hides the tab bar
- GIVEN the user pushes any Settings detail screen from the Ajustes root
- WHEN the screen renders
- THEN it shows a 56px header with a back arrow and no bottom tab bar
Requirement: Favoritos Tab-Bar Exemption
Favoritos MUST keep its bottom tab bar. This is the one deliberate exception to the push-chrome rule: the source mockup draws this content as a pushed screen only because its own 4-root IA had demoted Favoritos out of the root set. In this app's 5-tab IA, Favoritos is root-level and MUST render the tab bar like every other root.
Scenario: Favoritos renders with its tab bar
- GIVEN the user is on the Favoritos tab
- WHEN the screen renders
- THEN the bottom tab bar is visible, unlike every true second-level screen
Requirement: Root-to-Root Switching Without Push
Navigating from Escuchar's "Tus emisoras" section to the full favorites list MUST switch the active tab index to Favoritos. It MUST NOT push a new route.
Scenario: "Ver todas" switches tabs, not routes
- GIVEN the user is on Escuchar with 1 or more favorite stations
- WHEN they tap "Ver todas"
- THEN the active tab index becomes Favoritos
- AND no new route is pushed onto the navigation stack (back from Favoritos returns to whatever screen preceded Escuchar, not to Escuchar itself)
Requirement: Escuchar Tab Rename Preserves the ARB Key
The former "Inicio" tab MUST be relabeled "Escuchar" (English: "Listen") by
changing the navHome key's VALUE, not by introducing a new key. The key
navHome MUST continue to exist, unchanged, in all 13 ARB locales.
Scenario: English and Spanish values are updated
- GIVEN
lib/l10n/app_en.arbandlib/l10n/app_es.arb - WHEN the
navHomekey is read - THEN
app_en.arbreturns"Listen"andapp_es.arbreturns"Escuchar"
Scenario: Key parity across all 13 locales (edge case)
- GIVEN all 13 ARB files
- WHEN each is checked for the
navHomekey - THEN every file still contains the key
navHome(value content may differ), and no file is missing it