Files
please-pay-me/mobile/lib/ui/navigation/app_nav_bar.dart
T
2026-09-21 04:06:43 +03:00

87 lines
2.4 KiB
Dart

import 'package:flutter/cupertino.dart';
import 'package:please_pay_me/theme/tokens.dart';
import 'package:please_pay_me/ui/atoms/app_text.dart';
/// Standard iOS navigation bar (44pt) with optional subtitle line.
class AppNavBar extends StatelessWidget implements ObstructingPreferredSizeWidget {
const AppNavBar({
super.key,
required this.title,
this.subtitle,
this.leading,
this.trailing,
this.previousPageTitle,
this.transparent = false,
});
final String title;
final String? subtitle;
final Widget? leading;
final Widget? trailing;
final String? previousPageTitle;
final bool transparent;
@override
Size get preferredSize => const Size.fromHeight(44);
@override
bool shouldFullyObstruct(BuildContext context) => !transparent;
@override
Widget build(BuildContext context) {
return CupertinoNavigationBar(
leading: leading,
trailing: trailing,
previousPageTitle: previousPageTitle,
backgroundColor: transparent
? const Color(0x00000000)
: AppColors.of(context, AppColors.barBackground),
border: transparent
? null
: Border(
bottom: BorderSide(
color: AppColors.of(context, AppColors.separator),
width: AppSizes.hairline,
),
),
middle: subtitle == null
? AppText.headline(title)
: Column(
mainAxisSize: MainAxisSize.min,
children: [
AppText.headline(title, maxLines: 1, overflow: TextOverflow.ellipsis),
AppText.caption(
subtitle!,
color: AppColors.secondaryLabel,
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
);
}
}
/// Large-title bar for the root of a scrollable screen.
class AppLargeNavBar extends StatelessWidget {
const AppLargeNavBar({super.key, required this.title, this.trailing});
final String title;
final Widget? trailing;
@override
Widget build(BuildContext context) {
return CupertinoSliverNavigationBar(
largeTitle: AppText.largeTitle(title),
trailing: trailing,
backgroundColor: AppColors.of(context, AppColors.barBackground),
border: Border(
bottom: BorderSide(
color: AppColors.of(context, AppColors.separator),
width: AppSizes.hairline,
),
),
);
}
}