feat(ui_kit): add quote / skill / portfolio cards (#126)
continuous-integration/drone/push Build is failing

This commit was merged in pull request #133.
This commit is contained in:
2023-02-10 16:01:07 +01:00
parent a563bd1fe3
commit 55822ad870
18 changed files with 1282 additions and 6 deletions
@@ -15,3 +15,6 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
export './information_card/information_card.dart';
export './portfolio_card/portfolio_card.dart';
export './quote_card/quote_card.dart';
export './skill_card/skill_card.dart';
@@ -0,0 +1,111 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/cards/portfolio_card/widgets/portfolio_card_description.dart';
import 'package:wyatt_ui_kit/src/components/cards/portfolio_card/widgets/portfolio_card_header.dart';
import 'package:wyatt_ui_kit/src/components/cards/portfolio_card/widgets/portfolio_card_images.dart';
import 'package:wyatt_ui_kit/src/components/cards/widgets/card_wrapper.dart';
part 'portfolio_card.g.dart';
@ComponentCopyWithExtension()
class PortfolioCard extends PortfolioCardComponent with $PortfolioCardCWMixin {
const PortfolioCard({
super.showImagesOnTop,
super.keyword,
super.description,
super.logo,
super.projectName,
super.subtitle,
super.ctas,
super.assets,
super.radius,
super.padding,
super.borderColors,
super.backgroundColor,
super.minSize,
super.maxSize = const Size(330, double.infinity),
super.shadow,
super.background,
super.key,
});
@override
Widget build(BuildContext context) => CardWrapper(
background: background,
padding: padding,
backgroundColor: backgroundColor,
borderColors: borderColors,
shadow: shadow,
maxSize: maxSize,
minSize: minSize,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
if (showImagesOnTop ?? false) ...[
if (assets != null) ...[
PortfolioCardImages(
radius: radius,
maxSize: maxSize,
images: assets,
),
const Gap(20),
],
PortfolioCardDescription(
description: description,
ctas: ctas,
),
const Gap(10),
PortfolioCardHeader(
logo: logo,
padding: padding,
radius: radius,
projectName: projectName,
subtitle: subtitle,
keyword: keyword,
),
] else ...[
PortfolioCardHeader(
logo: logo,
padding: padding,
radius: radius,
projectName: projectName,
subtitle: subtitle,
keyword: keyword,
),
const Gap(10),
if (assets != null) ...[
PortfolioCardImages(
radius: radius,
maxSize: maxSize,
images: assets,
),
const Gap(20),
],
PortfolioCardDescription(
description: description,
ctas: ctas,
),
],
],
),
);
}
@@ -0,0 +1,95 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'portfolio_card.dart';
// **************************************************************************
// ComponentCopyWithGenerator
// **************************************************************************
class $PortfolioCardCWProxyImpl implements $PortfolioCardComponentCWProxy {
const $PortfolioCardCWProxyImpl(this._value);
final PortfolioCard _value;
@override
PortfolioCard showImagesOnTop(bool? showImagesOnTop) =>
this(showImagesOnTop: showImagesOnTop);
@override
PortfolioCard keyword(List<TextWrapper>? keyword) => this(keyword: keyword);
@override
PortfolioCard description(TextWrapper? description) =>
this(description: description);
@override
PortfolioCard logo(Widget? logo) => this(logo: logo);
@override
PortfolioCard projectName(TextWrapper? projectName) =>
this(projectName: projectName);
@override
PortfolioCard subtitle(TextWrapper? subtitle) => this(subtitle: subtitle);
@override
PortfolioCard ctas(List<Widget>? ctas) => this(ctas: ctas);
@override
PortfolioCard assets(List<Widget>? assets) => this(assets: assets);
@override
PortfolioCard radius(double? radius) => this(radius: radius);
@override
PortfolioCard padding(double? padding) => this(padding: padding);
@override
PortfolioCard borderColors(List<Color>? borderColors) =>
this(borderColors: borderColors);
@override
PortfolioCard backgroundColor(Color? backgroundColor) =>
this(backgroundColor: backgroundColor);
@override
PortfolioCard minSize(Size? minSize) => this(minSize: minSize);
@override
PortfolioCard maxSize(Size? maxSize) => this(maxSize: maxSize);
@override
PortfolioCard shadow(BoxShadow? shadow) => this(shadow: shadow);
@override
PortfolioCard background(Widget? background) => this(background: background);
@override
PortfolioCard key(Key? key) => this(key: key);
@override
PortfolioCard call({
bool? showImagesOnTop,
List<TextWrapper>? keyword,
TextWrapper? description,
Widget? logo,
TextWrapper? projectName,
TextWrapper? subtitle,
List<Widget>? ctas,
List<Widget>? assets,
double? radius,
double? padding,
List<Color>? borderColors,
Color? backgroundColor,
Size? minSize,
Size? maxSize,
BoxShadow? shadow,
Widget? background,
Key? key,
}) =>
PortfolioCard(
showImagesOnTop: showImagesOnTop ?? _value.showImagesOnTop,
keyword: keyword ?? _value.keyword,
description: description ?? _value.description,
logo: logo ?? _value.logo,
projectName: projectName ?? _value.projectName,
subtitle: subtitle ?? _value.subtitle,
ctas: ctas ?? _value.ctas,
assets: assets ?? _value.assets,
radius: radius ?? _value.radius,
padding: padding ?? _value.padding,
borderColors: borderColors ?? _value.borderColors,
backgroundColor: backgroundColor ?? _value.backgroundColor,
minSize: minSize ?? _value.minSize,
maxSize: maxSize ?? _value.maxSize,
shadow: shadow ?? _value.shadow,
background: background ?? _value.background,
key: key ?? _value.key,
);
}
mixin $PortfolioCardCWMixin on Component {
$PortfolioCardComponentCWProxy get copyWith =>
$PortfolioCardCWProxyImpl(this as PortfolioCard);
}
@@ -0,0 +1,60 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart';
import 'package:wyatt_ui_kit/src/core/helpers/helpers.dart';
class PortfolioCardDescription extends StatelessWidget {
const PortfolioCardDescription({
this.description,
this.ctas,
super.key,
});
final TextWrapper? description;
final List<Widget>? ctas;
@override
Widget build(BuildContext context) => Row(
children: [
if (description != null) ...[
Expanded(
child: Text(
description!.text,
style: description!.style ?? context.textTheme.bodyMedium,
).toGradient(
LinearGradientHelper.fromNullableColors(
description!.gradient,
),
),
),
],
if (ctas != null) ...[
const Gap(5),
...ctas!.map(
(e) => Padding(
padding: const EdgeInsets.symmetric(horizontal: 5),
child: e,
),
),
],
],
);
}
@@ -0,0 +1,99 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
import 'package:wyatt_ui_kit/wyatt_ui_kit.dart';
class PortfolioCardHeader extends StatelessWidget {
const PortfolioCardHeader({
this.logo,
this.padding,
this.radius,
this.projectName,
this.subtitle,
this.keyword,
super.key,
});
final Widget? logo;
final double? padding;
final double? radius;
final TextWrapper? projectName;
final TextWrapper? subtitle;
final List<TextWrapper>? keyword;
@override
Widget build(BuildContext context) => Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
if (logo != null) logo!,
const Gap(10),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (projectName != null)
Text(
projectName!.text,
style:
projectName!.style ?? context.textTheme.titleMedium,
).toGradient(
LinearGradientHelper.fromNullableColors(
projectName!.gradient,
),
),
if (subtitle != null) ...[
const Gap(5),
Text(
subtitle!.text,
style: subtitle!.style ?? context.textTheme.titleSmall,
).toGradient(
LinearGradientHelper.fromNullableColors(
subtitle!.gradient,
),
),
],
],
),
],
),
const Gap(10),
Wrap(
children: [
if (keyword != null)
...keyword!.map(
(e) => Container(
margin: const EdgeInsets.all(3),
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: Theme.of(context).focusColor,
borderRadius: BorderRadius.circular(8),
),
child: Text(
e.text,
style: e.style ?? context.textTheme.bodySmall,
),
),
),
],
),
],
);
}
@@ -0,0 +1,57 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
class PortfolioCardImages extends StatelessWidget {
const PortfolioCardImages({
this.images,
this.radius,
this.maxSize,
super.key,
});
final List<Widget>? images;
final double? radius;
final Size? maxSize;
@override
Widget build(BuildContext context) {
final result = <Widget>[];
for (final image in images ?? List<Widget>.empty()) {
result.addAll([
Expanded(
child: ClipRRect(
borderRadius: BorderRadius.circular(radius ?? 0),
child: Container(
constraints: BoxConstraints(
maxHeight: maxSize != null ? maxSize!.width : 100,
),
child: image,
),
),
),
const Gap(25),
]);
}
result.removeLast();
return Row(
mainAxisAlignment: MainAxisAlignment.center,
children: result,
);
}
}
@@ -0,0 +1,127 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/cards/widgets/card_wrapper.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart';
import 'package:wyatt_ui_kit/src/core/helpers/helpers.dart';
part 'quote_card.g.dart';
@ComponentCopyWithExtension()
class QuoteCard extends QuoteCardComponent with $QuoteCardCWMixin {
const QuoteCard({
super.avatar,
super.name,
super.subtitle,
super.gradient,
super.quote,
super.leftQuote,
super.rightQuote,
super.radius,
super.padding,
super.borderColors,
super.backgroundColor,
super.minSize,
super.maxSize,
super.shadow,
super.background,
super.key,
});
@override
Widget build(BuildContext context) => CardWrapper(
background: background,
padding: padding,
backgroundColor: backgroundColor,
borderColors: borderColors,
shadow: shadow,
maxSize: maxSize,
minSize: minSize,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
leftQuote ??
Align(
alignment: Alignment.topLeft,
child: GradientText(
'',
gradient: gradient,
style: context.textTheme.titleLarge
?.copyWith(fontWeight: FontWeight.bold),
),
),
if (quote != null) ...[
Text(
quote!.text,
style: quote!.style ??
context.textTheme.bodyMedium
?.copyWith(fontStyle: FontStyle.italic),
).toGradient(
LinearGradientHelper.fromNullableColors(
quote!.gradient,
),
)
],
const Gap(15),
rightQuote ??
Align(
alignment: Alignment.bottomRight,
child: GradientText(
'',
gradient: gradient,
style: context.textTheme.titleLarge
?.copyWith(fontWeight: FontWeight.bold),
),
),
Row(
children: [
if (avatar != null) ...[
avatar!,
const Gap(25),
],
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (name != null) ...[
Text(
name!.text,
style: name!.style ?? context.textTheme.titleMedium,
).toGradient(
LinearGradientHelper.fromNullableColors(
name!.gradient,
),
),
],
if (subtitle != null) ...[
const Gap(5),
Text(
subtitle!.text,
style: subtitle!.style ?? context.textTheme.titleMedium,
).toGradient(gradient),
],
],
)
],
),
],
),
);
}
@@ -0,0 +1,88 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'quote_card.dart';
// **************************************************************************
// ComponentCopyWithGenerator
// **************************************************************************
class $QuoteCardCWProxyImpl implements $QuoteCardComponentCWProxy {
const $QuoteCardCWProxyImpl(this._value);
final QuoteCard _value;
@override
QuoteCard avatar(Widget? avatar) => this(avatar: avatar);
@override
QuoteCard name(TextWrapper? name) => this(name: name);
@override
QuoteCard subtitle(TextWrapper? subtitle) => this(subtitle: subtitle);
@override
QuoteCard gradient(Gradient? gradient) => this(gradient: gradient);
@override
QuoteCard quote(TextWrapper? quote) => this(quote: quote);
@override
QuoteCard leftQuote(Widget? leftQuote) => this(leftQuote: leftQuote);
@override
QuoteCard rightQuote(Widget? rightQuote) => this(rightQuote: rightQuote);
@override
QuoteCard radius(double? radius) => this(radius: radius);
@override
QuoteCard padding(double? padding) => this(padding: padding);
@override
QuoteCard borderColors(List<Color>? borderColors) =>
this(borderColors: borderColors);
@override
QuoteCard backgroundColor(Color? backgroundColor) =>
this(backgroundColor: backgroundColor);
@override
QuoteCard minSize(Size? minSize) => this(minSize: minSize);
@override
QuoteCard maxSize(Size? maxSize) => this(maxSize: maxSize);
@override
QuoteCard shadow(BoxShadow? shadow) => this(shadow: shadow);
@override
QuoteCard background(Widget? background) => this(background: background);
@override
QuoteCard key(Key? key) => this(key: key);
@override
QuoteCard call({
Widget? avatar,
TextWrapper? name,
TextWrapper? subtitle,
Gradient? gradient,
TextWrapper? quote,
Widget? leftQuote,
Widget? rightQuote,
double? radius,
double? padding,
List<Color>? borderColors,
Color? backgroundColor,
Size? minSize,
Size? maxSize,
BoxShadow? shadow,
Widget? background,
Key? key,
}) =>
QuoteCard(
avatar: avatar ?? _value.avatar,
name: name ?? _value.name,
subtitle: subtitle ?? _value.subtitle,
gradient: gradient ?? _value.gradient,
quote: quote ?? _value.quote,
leftQuote: leftQuote ?? _value.leftQuote,
rightQuote: rightQuote ?? _value.rightQuote,
radius: radius ?? _value.radius,
padding: padding ?? _value.padding,
borderColors: borderColors ?? _value.borderColors,
backgroundColor: backgroundColor ?? _value.backgroundColor,
minSize: minSize ?? _value.minSize,
maxSize: maxSize ?? _value.maxSize,
shadow: shadow ?? _value.shadow,
background: background ?? _value.background,
key: key ?? _value.key,
);
}
mixin $QuoteCardCWMixin on Component {
$QuoteCardComponentCWProxy get copyWith =>
$QuoteCardCWProxyImpl(this as QuoteCard);
}
@@ -0,0 +1,85 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_component_copy_with_extension/component_copy_with_extension.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/cards/skill_card/widgets/skill_card_header.dart';
import 'package:wyatt_ui_kit/src/components/cards/skill_card/widgets/skill_card_skills.dart';
import 'package:wyatt_ui_kit/src/components/cards/widgets/card_wrapper.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
import 'package:wyatt_ui_kit/src/core/extensions/extensions.dart';
import 'package:wyatt_ui_kit/src/core/helpers/helpers.dart';
part 'skill_card.g.dart';
@ComponentCopyWithExtension()
class SkillCard extends SkillCardComponent with $SkillCardCWMixin {
const SkillCard({
super.icon,
super.gradient,
super.title,
super.description,
super.skills,
super.leadingIcon,
super.radius,
super.padding,
super.borderColors,
super.backgroundColor,
super.minSize,
super.maxSize = const Size(330, double.infinity),
super.shadow,
super.background,
super.key,
});
@override
Widget build(BuildContext context) => CardWrapper(
background: background,
padding: padding,
backgroundColor: backgroundColor,
borderColors: borderColors,
shadow: shadow,
maxSize: maxSize,
minSize: minSize,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
SkillCardHeader(
icon: icon,
title: title,
gradient: gradient,
),
const Gap(25),
if (description != null) ...[
Text(
description!.text,
style: description!.style ?? context.textTheme.bodyMedium,
).toGradient(
LinearGradientHelper.fromNullableColors(description!.gradient),
),
const Gap(25),
],
if (skills != null)
SkillCardSkills(
gradient: gradient,
skills: skills,
leadingIcon: leadingIcon,
),
],
),
);
}
@@ -0,0 +1,86 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'skill_card.dart';
// **************************************************************************
// ComponentCopyWithGenerator
// **************************************************************************
class $SkillCardCWProxyImpl implements $SkillCardComponentCWProxy {
const $SkillCardCWProxyImpl(this._value);
final SkillCard _value;
@override
SkillCard icon(IconData? icon) => this(icon: icon);
@override
SkillCard gradient(List<Color>? gradient) => this(gradient: gradient);
@override
SkillCard title(TextWrapper? title) => this(title: title);
@override
SkillCard description(TextWrapper? description) =>
this(description: description);
@override
SkillCard skills(List<TextWrapper>? skills) => this(skills: skills);
@override
SkillCard leadingIcon(IconData? leadingIcon) =>
this(leadingIcon: leadingIcon);
@override
SkillCard radius(double? radius) => this(radius: radius);
@override
SkillCard padding(double? padding) => this(padding: padding);
@override
SkillCard borderColors(List<Color>? borderColors) =>
this(borderColors: borderColors);
@override
SkillCard backgroundColor(Color? backgroundColor) =>
this(backgroundColor: backgroundColor);
@override
SkillCard minSize(Size? minSize) => this(minSize: minSize);
@override
SkillCard maxSize(Size? maxSize) => this(maxSize: maxSize);
@override
SkillCard shadow(BoxShadow? shadow) => this(shadow: shadow);
@override
SkillCard background(Widget? background) => this(background: background);
@override
SkillCard key(Key? key) => this(key: key);
@override
SkillCard call({
IconData? icon,
List<Color>? gradient,
TextWrapper? title,
TextWrapper? description,
List<TextWrapper>? skills,
IconData? leadingIcon,
double? radius,
double? padding,
List<Color>? borderColors,
Color? backgroundColor,
Size? minSize,
Size? maxSize,
BoxShadow? shadow,
Widget? background,
Key? key,
}) =>
SkillCard(
icon: icon ?? _value.icon,
gradient: gradient ?? _value.gradient,
title: title ?? _value.title,
description: description ?? _value.description,
skills: skills ?? _value.skills,
leadingIcon: leadingIcon ?? _value.leadingIcon,
radius: radius ?? _value.radius,
padding: padding ?? _value.padding,
borderColors: borderColors ?? _value.borderColors,
backgroundColor: backgroundColor ?? _value.backgroundColor,
minSize: minSize ?? _value.minSize,
maxSize: maxSize ?? _value.maxSize,
shadow: shadow ?? _value.shadow,
background: background ?? _value.background,
key: key ?? _value.key,
);
}
mixin $SkillCardCWMixin on Component {
$SkillCardComponentCWProxy get copyWith =>
$SkillCardCWProxyImpl(this as SkillCard);
}
@@ -0,0 +1,65 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_icon.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
import 'package:wyatt_ui_kit/src/core/extensions/extensions.dart';
import 'package:wyatt_ui_kit/src/core/helpers/linear_gradient_helper.dart';
class SkillCardHeader extends StatelessWidget {
const SkillCardHeader({super.key, this.icon, this.title, this.gradient});
final IconData? icon;
final TextWrapper? title;
final List<Color>? gradient;
@override
Widget build(BuildContext context) => Column(
children: [
if (icon != null) ...[
if (gradient != null)
GradientIcon(
icon,
size: 60,
gradient: LinearGradient(colors: gradient!),
)
else
Icon(
icon,
size: 60,
),
const Gap(25),
Column(
children: [
if (title != null) ...[
Text(
title!.text,
style: title!.style ?? context.textTheme.titleLarge,
).toGradient(
LinearGradientHelper.fromNullableColors(
title!.gradient,
),
),
],
],
)
],
],
);
}
@@ -0,0 +1,62 @@
// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import 'package:flutter/material.dart';
import 'package:gap/gap.dart';
import 'package:wyatt_ui_components/wyatt_wyatt_ui_components.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_icon.dart';
import 'package:wyatt_ui_kit/src/components/gradients/gradient_text.dart';
import 'package:wyatt_ui_kit/src/core/extensions/theme_extensions.dart';
import 'package:wyatt_ui_kit/src/core/helpers/linear_gradient_helper.dart';
class SkillCardSkills extends StatelessWidget {
const SkillCardSkills({
super.key,
this.skills,
this.leadingIcon,
this.gradient,
});
final List<TextWrapper>? skills;
final IconData? leadingIcon;
final List<Color>? gradient;
@override
Widget build(BuildContext context) => Column(
children: skills!
.map(
(e) => Row(
children: [
Icon(
leadingIcon ?? Icons.check,
).toGradient(
LinearGradientHelper.fromNullableColors(gradient),
),
const Gap(10),
Expanded(
child: Text(
e.text,
style: e.style ?? context.textTheme.bodyMedium,
).toGradient(
LinearGradientHelper.fromNullableColors(e.gradient),
),
),
],
),
)
.toList(),
);
}