87 lines
2.4 KiB
Dart
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,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|