90 lines
3.4 KiB
Markdown
90 lines
3.4 KiB
Markdown
# 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.arb` and `lib/l10n/app_es.arb`
|
|
- WHEN the `navHome` key is read
|
|
- THEN `app_en.arb` returns `"Listen"` and `app_es.arb` returns `"Escuchar"`
|
|
|
|
#### Scenario: Key parity across all 13 locales (edge case)
|
|
|
|
- GIVEN all 13 ARB files
|
|
- WHEN each is checked for the `navHome` key
|
|
- THEN every file still contains the key `navHome` (value content may differ), and no file is missing it
|