selfprivacy.org.app/lib/ui/components/brand_text/brand_text.dart

189 lines
4.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:selfprivacy/config/text_themes.dart';
export 'package:selfprivacy/utils/extensions/text_extensions.dart';
enum TextType {
h1, // right now only at onboarding and opened providers
h2, // cards titles
h3, // titles in about page
h4, // caption
h5, // Table data
body1, // normal
body2, // with opacity
medium,
small,
onboardingTitle,
buttonTitleText // risen button title text,
}
class BrandText extends StatelessWidget {
const BrandText(
this.text, {
Key? key,
this.style,
required this.type,
this.overflow,
this.softWrap,
this.textAlign,
}) : super(key: key);
final String? text;
final TextStyle? style;
final TextType type;
final TextOverflow? overflow;
final bool? softWrap;
final TextAlign? textAlign;
factory BrandText.h1(
String? text, {
TextStyle? style,
TextOverflow? overflow,
bool? softWrap,
}) =>
BrandText(
text,
type: TextType.h1,
style: style,
);
factory BrandText.onboardingTitle(String text, {TextStyle? style}) =>
BrandText(
text,
type: TextType.onboardingTitle,
style: style,
);
factory BrandText.h2(String? text, {TextStyle? style}) => BrandText(
text,
type: TextType.h2,
style: style,
);
factory BrandText.h3(String text, {TextStyle? style, TextAlign? textAlign}) =>
BrandText(
text,
type: TextType.h3,
style: style,
textAlign: textAlign,
overflow: TextOverflow.ellipsis,
);
factory BrandText.h4(
String? text, {
TextStyle? style,
TextAlign? textAlign,
}) =>
BrandText(
text,
type: TextType.h4,
style: style,
textAlign: textAlign,
);
factory BrandText.h5(
String? text, {
TextStyle? style,
TextAlign? textAlign,
}) =>
BrandText(
text,
type: TextType.h5,
style: style,
textAlign: textAlign,
);
factory BrandText.body1(String? text, {TextStyle? style}) => BrandText(
text,
type: TextType.body1,
style: style,
);
factory BrandText.body2(String? text, {TextStyle? style}) => BrandText(
text,
type: TextType.body2,
style: style,
);
factory BrandText.medium(String? text,
{TextStyle? style, TextAlign? textAlign}) =>
BrandText(
text,
type: TextType.medium,
style: style,
textAlign: textAlign,
);
factory BrandText.small(String text, {TextStyle? style}) => BrandText(
text,
type: TextType.small,
style: style,
);
factory BrandText.buttonTitleText(String? text, {TextStyle? style}) =>
BrandText(
text,
type: TextType.buttonTitleText,
style: style,
);
@override
Text build(BuildContext context) {
TextStyle style;
var isDark = Theme.of(context).brightness == Brightness.dark;
switch (type) {
case TextType.h1:
style = isDark
? headline1Style.copyWith(color: Colors.white)
: headline1Style;
break;
case TextType.h2:
style = isDark
? headline2Style.copyWith(color: Colors.white)
: headline2Style;
break;
case TextType.h3:
style = isDark
? headline3Style.copyWith(color: Colors.white)
: headline3Style;
break;
case TextType.h4:
style = isDark
? headline4Style.copyWith(color: Colors.white)
: headline4Style;
break;
case TextType.h5:
style = isDark
? headline5Style.copyWith(color: Colors.white)
: headline5Style;
break;
case TextType.body1:
style = isDark ? body1Style.copyWith(color: Colors.white) : body1Style;
break;
case TextType.body2:
style = isDark
? body2Style.copyWith(color: Colors.white.withOpacity(0.6))
: body2Style;
break;
case TextType.small:
style = isDark ? smallStyle.copyWith(color: Colors.white) : smallStyle;
break;
case TextType.onboardingTitle:
style = isDark
? onboardingTitle.copyWith(color: Colors.white)
: onboardingTitle;
break;
case TextType.medium:
style =
isDark ? mediumStyle.copyWith(color: Colors.white) : mediumStyle;
break;
case TextType.buttonTitleText:
style = !isDark
? buttonTitleText.copyWith(color: Colors.white)
: buttonTitleText;
break;
}
if (this.style != null) {
style = style.merge(this.style);
}
return Text(
text!,
style: style,
overflow: overflow,
softWrap: softWrap,
textAlign: textAlign,
);
}
}