import 'package:flutter/material.dart'; import '../tema/pluriwave_theme.dart'; import 'mini_reproductor.dart'; import 'pluri_bottom_navigation.dart'; abstract final class PluriLayout { static const double horizontal = 16; static const double sectionGap = 12; static const double panelGap = 12; static const double compactGap = 8; /// `app.dart`'s `bottomNavigationBar` stacks `MiniReproductor` above /// `PluriBottomNavigation` with no gap between them, wrapped in a /// `SafeArea(minimum: EdgeInsets.only(bottom: compactGap))` — this is that /// same sum, derived from the two chrome widgets' own measured heights /// instead of a guessed constant. See /// `pluri_bottom_navigation_test.dart`'s composed-chrome-height assertion. static const double bottomChromeInset = MiniReproductor.altura + PluriBottomNavigation.altura + compactGap; /// ADR-7(b): `bottomChromeInset` assumes `MiniReproductor` is visible. /// Escuchar hides it (design's one exception — the embedded hero already /// shows the same station), so its content needs less bottom padding. static const double escucharBottomChromeInset = bottomChromeInset - MiniReproductor.altura; static const EdgeInsets pageListPadding = EdgeInsets.fromLTRB( 0, 0, 0, bottomChromeInset, ); static const EdgeInsets pageContentPadding = EdgeInsets.symmetric( horizontal: horizontal, ); static const EdgeInsets sheetPadding = EdgeInsets.all(18); } class PluriPanelColumn extends StatelessWidget { const PluriPanelColumn({super.key, required this.children, this.gap}); final List children; final double? gap; @override Widget build(BuildContext context) { final resolvedGap = gap ?? context.pluriTokens.spacingSm + 4; return Column( children: [ for (var i = 0; i < children.length; i++) ...[ if (i > 0) SizedBox(height: resolvedGap), children[i], ], ], ); } }