fix(buscar): build the 2x2 "Explorar por" grid, add Novedades

Audit 3.2 (t4 lines 162-171): the prototype groups Países, Géneros,
Tendencias and the entirely-missing Novedades into one 2x2 entry-point
grid. The build had them as three unrelated always-visible widgets
(a Países ListTile, a Géneros FilterChip Wrap, a Tendencias ActionChip
strip) and no Novedades entry at all.

Replaces all three with a single grid section, capability-preserving:
Países still pushes PantallaPaises; Géneros and Tendencias now open
their exact existing content in a picker sheet instead of always-on-
screen (Géneros auto-closes on selection, matching this screen's other
single-choice filter sheets; Tendencias stays open, a browse list, not
a filter). Novedades re-triggers the existing discovery refresh, since
no distinct "new stations" feed exists anywhere in the domain.

New ARB key set (exploreByTitle/exploreTrendingTitle/
exploreTrendingSubtitle/exploreNewTitle/exploreNewSubtitle) translated
across all 13 locales with zero anti-copy allowlist entries needed.

Also fixes a pre-existing PluriEmptyState overflow this restructure
exposed (unrelated to the grid itself, confirmed via isolated repro):
wraps its Column in a SingleChildScrollView so a too-tall title/
subtitle scrolls instead of throwing a hard RenderFlex overflow.
This commit is contained in:
2026-07-30 00:43:27 +02:00
parent a49b2b6519
commit e5d461af53
31 changed files with 755 additions and 58 deletions
+34 -23
View File
@@ -74,31 +74,42 @@ class PluriEmptyState extends StatelessWidget {
child: PluriGlassSurface(
borderRadius: BorderRadius.circular(t.radiusLg + 10),
padding: const EdgeInsets.all(28),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
PluriIcon(
glyph: glyph,
variant: PluriIconVariant.activeGlow,
size: 58,
),
const SizedBox(height: 18),
Text(
title,
textAlign: TextAlign.center,
style: theme.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.w900,
// Bugfix: every call site constrains this widget to a fixed
// height (`SizedBox(height: 260)`). At a narrow width with
// realistic two-line title/subtitle copy, the icon + gaps +
// wrapped text can exceed what's actually left after this
// surface's own padding — a hard RenderFlex overflow rather
// than a graceful clip. `SingleChildScrollView` is a no-op
// visually whenever the content already fits (the normal
// case, on any real device width this was designed for) and
// only engages scrolling in the rare case it does not.
child: SingleChildScrollView(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
PluriIcon(
glyph: glyph,
variant: PluriIconVariant.activeGlow,
size: 58,
),
),
const SizedBox(height: 8),
Text(
subtitle,
textAlign: TextAlign.center,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withValues(alpha: 0.72),
const SizedBox(height: 18),
Text(
title,
textAlign: TextAlign.center,
style: theme.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.w900,
),
),
),
],
const SizedBox(height: 8),
Text(
subtitle,
textAlign: TextAlign.center,
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface.withValues(alpha: 0.72),
),
),
],
),
),
),
),