182 lines
5.2 KiB
Dart
182 lines
5.2 KiB
Dart
import "package:flutter/material.dart";
|
|
import "package:google_fonts/google_fonts.dart";
|
|
import "../theme/ensup_colors.dart";
|
|
|
|
/// Barre supérieure ENSUP. L'utilisateur et le bouton retour sont optionnels
|
|
/// (absents sur l'écran d'identification).
|
|
class EnsupTopBar extends StatelessWidget {
|
|
const EnsupTopBar({
|
|
super.key,
|
|
this.brandText = "EME",
|
|
required this.campusTag,
|
|
this.userName,
|
|
this.userInitials,
|
|
this.onBack,
|
|
});
|
|
|
|
final String brandText;
|
|
final String campusTag;
|
|
final String? userName;
|
|
final String? userInitials;
|
|
final VoidCallback? onBack;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final name = userName;
|
|
final initials = userInitials;
|
|
final onBack = this.onBack;
|
|
|
|
return Container(
|
|
height: 60,
|
|
padding: const EdgeInsets.symmetric(horizontal: 18),
|
|
color: EnsupColors.blue3,
|
|
child: LayoutBuilder(
|
|
builder: (context, constraints) {
|
|
final compact = constraints.maxWidth < 620;
|
|
final showCampus = constraints.maxWidth >= 520;
|
|
final showName = constraints.maxWidth >= 760;
|
|
|
|
return Row(
|
|
children: [
|
|
if (onBack != null) ...[
|
|
_BackButton(onTap: onBack, compact: compact),
|
|
SizedBox(width: compact ? 5 : 8),
|
|
],
|
|
const Icon(Icons.badge_outlined, color: Colors.white, size: 18),
|
|
const SizedBox(width: 9),
|
|
Expanded(
|
|
child: Text(
|
|
brandText,
|
|
maxLines: 1,
|
|
overflow: TextOverflow.ellipsis,
|
|
style: GoogleFonts.darkerGrotesque(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.w900,
|
|
fontSize: compact ? 18 : 21,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(width: 10),
|
|
if (showCampus)
|
|
Container(
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 11,
|
|
vertical: 5,
|
|
),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white.withValues(alpha: 0.14),
|
|
borderRadius: BorderRadius.circular(999),
|
|
border: Border.all(
|
|
color: Colors.white.withValues(alpha: 0.2),
|
|
),
|
|
),
|
|
child: Text(
|
|
campusTag,
|
|
style: GoogleFonts.titilliumWeb(
|
|
color: Colors.white,
|
|
fontSize: 11,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
),
|
|
),
|
|
if (name != null && initials != null) ...[
|
|
const SizedBox(width: 10),
|
|
_Avatar(initials: initials),
|
|
if (showName) ...[
|
|
const SizedBox(width: 8),
|
|
Text(
|
|
name,
|
|
style: GoogleFonts.titilliumWeb(
|
|
color: Colors.white,
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
),
|
|
],
|
|
],
|
|
],
|
|
);
|
|
},
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _BackButton extends StatelessWidget {
|
|
const _BackButton({required this.onTap, required this.compact});
|
|
|
|
final VoidCallback onTap;
|
|
final bool compact;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Tooltip(
|
|
message: "Retour",
|
|
child: InkWell(
|
|
onTap: onTap,
|
|
borderRadius: BorderRadius.circular(7),
|
|
child: Container(
|
|
height: 34,
|
|
padding: EdgeInsets.symmetric(horizontal: compact ? 8 : 10),
|
|
decoration: BoxDecoration(
|
|
color: Colors.white.withValues(alpha: 0.08),
|
|
borderRadius: BorderRadius.circular(7),
|
|
),
|
|
child: Row(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Icon(
|
|
Icons.arrow_back_rounded,
|
|
size: 17,
|
|
color: Colors.white.withValues(alpha: 0.9),
|
|
),
|
|
if (!compact) ...[
|
|
const SizedBox(width: 6),
|
|
Text(
|
|
"Retour",
|
|
style: GoogleFonts.titilliumWeb(
|
|
color: Colors.white.withValues(alpha: 0.9),
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _Avatar extends StatelessWidget {
|
|
const _Avatar({required this.initials});
|
|
|
|
final String initials;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
width: 30,
|
|
height: 30,
|
|
decoration: BoxDecoration(
|
|
shape: BoxShape.circle,
|
|
color: EnsupColors.purple,
|
|
border: Border.all(
|
|
color: Colors.white.withValues(alpha: 0.3),
|
|
width: 2,
|
|
),
|
|
),
|
|
alignment: Alignment.center,
|
|
child: Text(
|
|
initials,
|
|
style: GoogleFonts.darkerGrotesque(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.w900,
|
|
fontSize: 12,
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|