From e779b761a986c2856a25707d5d0c24e37dd4ec48 Mon Sep 17 00:00:00 2001 From: GreyLabsDev Date: Fri, 11 Oct 2024 23:54:57 +0300 Subject: [PATCH] Updated skills page design --- assets/img/card_conf_mb.jpg | Bin 0 -> 6019 bytes assets/img/card_conf_pl.jpg | Bin 0 -> 11330 bytes assets/img/card_conf_st.jpg | Bin 0 -> 3048 bytes assets/img/card_conf_uic.jpg | Bin 0 -> 3998 bytes lib/pages/TestPage.dart | 27 +++- lib/pages/UiTestPage.dart | 153 +------------------ lib/pages/base/BaseInfoPage.dart | 10 +- lib/resources/Resources.dart | 7 + lib/widgets/base/MainPageInfoButton.dart | 2 +- lib/widgets/base/SkillsColumn.dart | 66 ++++++++ lib/widgets/base/TextContentBig.dart | 23 +++ lib/widgets/cv_elements/EventButton.dart | 71 +++++++++ lib/widgets/cv_elements/EventsBlock.dart | 45 ++++++ lib/widgets/cv_elements/WorkExpTimeline.dart | 76 +++++++++ pubspec.lock | 48 +++--- pubspec.yaml | 4 + 16 files changed, 344 insertions(+), 188 deletions(-) create mode 100644 assets/img/card_conf_mb.jpg create mode 100644 assets/img/card_conf_pl.jpg create mode 100644 assets/img/card_conf_st.jpg create mode 100644 assets/img/card_conf_uic.jpg create mode 100644 lib/widgets/base/SkillsColumn.dart create mode 100644 lib/widgets/base/TextContentBig.dart create mode 100644 lib/widgets/cv_elements/EventButton.dart create mode 100644 lib/widgets/cv_elements/EventsBlock.dart create mode 100644 lib/widgets/cv_elements/WorkExpTimeline.dart diff --git a/assets/img/card_conf_mb.jpg b/assets/img/card_conf_mb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0652b0387231094ad002959c86132f33ce06a19 GIT binary patch literal 6019 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 literal 0 HcmV?d00001 diff --git a/assets/img/card_conf_uic.jpg b/assets/img/card_conf_uic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7e170cf37d1215fe0934d713700beeda40fb1237 GIT binary patch literal 3998 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 literal 0 HcmV?d00001 diff --git a/lib/pages/TestPage.dart b/lib/pages/TestPage.dart index ee3c0ed..519bc66 100644 --- a/lib/pages/TestPage.dart +++ b/lib/pages/TestPage.dart @@ -4,11 +4,14 @@ import 'package:threeactions_area/resources/Resources.dart'; import 'package:threeactions_area/widgets/base/TextContent.dart'; import 'package:threeactions_area/widgets/base/TextSubtitle.dart'; import 'package:threeactions_area/widgets/base/TextTitle.dart'; +import 'package:threeactions_area/widgets/cv_elements/EventsBlock.dart'; import 'package:url_launcher/url_launcher_string.dart'; import '../widgets/base/ImageGallery.dart'; import '../widgets/base/MainPageInfoButton.dart'; +import '../widgets/base/SkillsColumn.dart'; import '../widgets/base/SocialButton.dart'; +import '../widgets/cv_elements/WorkExpTimeline.dart'; import 'base/BaseInfoPage.dart'; class TestPage extends StatefulWidget { @@ -130,24 +133,32 @@ class TestPageState extends State { logoImageAsset: "assets/img/logo_skills_big.png", subtitle: "Hard & Soft", accentFilterColor: AppColors.ContentDarkBlue, - content: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, + content:Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + EventsBlock(titleColor: AppColors.ContentDarkBlue,), + SizedBox(height: 32.0,), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, children: [ - WorkExpTimeline(), - Spacer(), + SizedBox(width: 60.0,), SkillsColumn([ SkillItem("Main", ["Android", "Kotlin", "Java", "Flutter"]), SkillItem("UI", ["Jetpack Compose", "XML"]), SkillItem( - "Data", ["Realm", "Room", "SQL", "Retrofit", "GraphQL"]), + "Data", ["Realm", "Room", "SQL", "Retrofit", "GraphQL", "JSON"]), SkillItem( "Architecture", ["Clean", "MVP", "MVVM", "MVI", "Redux"]), SkillItem("DI", ["Dagger 2", "Koin", "Hilt"]), SkillItem("Async", ["RxJava 2", "Kotlin Coroutines", "Hilt"]), - ]) + ]), + SizedBox(width: 16.0,), + WorkExpTimeline(), ], - ), + ) + ], + ), ); } diff --git a/lib/pages/UiTestPage.dart b/lib/pages/UiTestPage.dart index 35ca069..6fd6fea 100644 --- a/lib/pages/UiTestPage.dart +++ b/lib/pages/UiTestPage.dart @@ -1,14 +1,10 @@ -import 'dart:math'; import 'dart:core'; import 'package:flutter/material.dart'; import 'package:threeactions_area/pages/base/BaseInfoPage.dart'; import 'package:threeactions_area/resources/Resources.dart'; -import 'package:threeactions_area/widgets/base/TextContent.dart'; -import 'package:threeactions_area/widgets/base/TextContentMin.dart'; -import 'package:threeactions_area/widgets/base/TextSubtitle.dart'; -import 'package:threeactions_area/widgets/base/TextTitle.dart'; -import 'package:threeactions_area/widgets/base/TextTitleBig.dart'; + +import '../widgets/cv_elements/EventsBlock.dart'; class UiTestpage extends StatefulWidget { @override @@ -24,152 +20,9 @@ class UiTestPageState extends State { title: "UiTestPage", mainImageAsset: "assets/img/button_bg_skills.png", logoImageAsset: "assets/img/logo_skills_big.png", - content: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - WorkExpTimeline(), - SkillsColumn([ - SkillItem("Main", ["Android", "Kotlin", "Java", "Flutter"]), - SkillItem("UI", ["Jetpack Compose", "XML"]), - SkillItem( - "Data", ["Realm", "Room", "SQL", "Retrofit", "GraphQL"]), - SkillItem( - "Architecture", ["Clean", "MVP", "MVVM", "MVI", "Redux"]), - SkillItem("DI", ["Dagger 2", "Koin", "Hilt"]), - SkillItem("Async", ["RxJava 2", "Kotlin Coroutines", "Hilt"]), - ]) - ], - )); - } -} - -class SkillItem { - String name; - List skillsList; - - SkillItem(this.name, this.skillsList); -} - -class SkillsColumn extends StatelessWidget { - final List items; - - SkillsColumn(this.items); - - @override - Widget build(BuildContext context) { - return Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.end, - children: _buildRowContent(), - ); - } - - List _buildRowContent() { - return items.map((item) => SkillsBlock(item)).toList(); + content: EventsBlock(titleColor: AppColors.ContentDarkBlue,)); } } -class SkillsBlock extends StatelessWidget { - final SkillItem item; - SkillsBlock(this.item); - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only(bottom: 8.0), - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - TextSubtitle(text: item.name, textColor: AppColors.ContentDarkBlue,), - Wrap( - spacing: 4.0, - children: _buildWrapContent(item.skillsList), - ) - ], - ), - ); - } - - List _buildWrapContent(List items) { - return items - .map((item) => Container( - padding: EdgeInsets.all(4.0), - color: Colors.blueGrey, - child: TextContent(text: item, textColor: Colors.black), - )) - .toList(); - } -} - -class WorkExpTimeline extends StatelessWidget { - Widget _buildExpItem(String date, String companyInfo, String description) { - return Padding( - padding: EdgeInsets.only(bottom: 16.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Container( - width: 16.0, - height: 2.0, - // color: Colors.white, - color: Color(0xff6EA1A9), - ), - SizedBox( - width: 8.0, - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - TextSubtitle(text: date, textColor: AppColors.ContentDarkBlue,), - TextContent(text: companyInfo, textColor: AppColors.ContentDarkBlue), - TextContentMin(text: description, textColor: AppColors.ContentDarkBlue) - ], - ) - ], - ), - ); - } - - @override - Widget build(BuildContext context) { - return IntrinsicHeight( - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container( - width: 2.0, - // color: Colors.white, - color: Color(0xff6EA1A9), - ), - Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _buildExpItem( - "2016-2018", - "HOSTCO - Information Security Analyst", - "Audit and integration of security\nsystems in IT companies"), - _buildExpItem("2018", "ARGIN - Android Developer", - "Augmented reality projects, video/image\ntracking"), - _buildExpItem("2018-2019", "EastWind - Android Developer", - "Custom development, projects in\nbanking, services and marketplaces"), - _buildExpItem( - "2019-2021", - "Home Credit Bank - Middle Android Developer", - "FinTech (financial technology), private\nbanking, marketplace, loan projects"), - _buildExpItem( - "2021 - Current time", - "Skyeng - Senior Android Developer", - "EdTech (educational technology),\ninternational language learning projects"), - ], - ) - ], - ), - ); - } -} diff --git a/lib/pages/base/BaseInfoPage.dart b/lib/pages/base/BaseInfoPage.dart index 5395f33..b1f661f 100644 --- a/lib/pages/base/BaseInfoPage.dart +++ b/lib/pages/base/BaseInfoPage.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:threeactions_area/resources/Resources.dart'; +import 'package:threeactions_area/widgets/base/TextTitle.dart'; import 'package:threeactions_area/widgets/base/TextTitleBig.dart'; import '../../widgets/base/TextSubtitle.dart'; @@ -79,21 +80,20 @@ class BaseInfoPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ Align( - alignment: Alignment.bottomLeft, + alignment: Alignment.bottomCenter, child: isPaddingEnabled ? Padding( - padding: EdgeInsets.only(left: 32.0, top: 32.0), - child: TextSubtitle( + padding: EdgeInsets.only(top: 32.0), + child: TextTitle( text: subtitle!, textColor: accentFilterColor ?? AppColors.ContentWhite, ), ) - : TextSubtitle( + : TextTitle( text: subtitle!, textColor: accentFilterColor ?? AppColors.ContentWhite, ), ), - // SizedBox(height: 32.0), Flexible(child: _buildContentContainer(content)) ], ); diff --git a/lib/resources/Resources.dart b/lib/resources/Resources.dart index e57481f..75c4694 100644 --- a/lib/resources/Resources.dart +++ b/lib/resources/Resources.dart @@ -25,6 +25,13 @@ class TextStylesContent { fontFamily: 'NohemiRegular', letterSpacing: 1.0); + static const ContentBig = TextStyle( + color: Color(0xffffffff), + // color: Color(0xff6EA1A9), + fontSize: 22.0, + fontFamily: 'NohemiRegular', + letterSpacing: 1.0); + static const ContentMain = TextStyle( color: Color(0xffffffff), fontSize: 18.0, diff --git a/lib/widgets/base/MainPageInfoButton.dart b/lib/widgets/base/MainPageInfoButton.dart index 55df858..aa61363 100644 --- a/lib/widgets/base/MainPageInfoButton.dart +++ b/lib/widgets/base/MainPageInfoButton.dart @@ -100,7 +100,7 @@ class MainPageInfoButtonState extends State fit: BoxFit.cover, opacity: opacityAcnimation.value)), padding: EdgeInsets.only( - left: 32.0, right: 32.0, bottom: 96.0, top: 16.0), + left: 32.0, right: 32.0, bottom: 218.0, top: 16.0), child: Column( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/widgets/base/SkillsColumn.dart b/lib/widgets/base/SkillsColumn.dart new file mode 100644 index 0000000..91ef505 --- /dev/null +++ b/lib/widgets/base/SkillsColumn.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +import '../../resources/Resources.dart'; +import 'TextContent.dart'; +import 'TextSubtitle.dart'; + +class SkillItem { + String name; + List skillsList; + + SkillItem(this.name, this.skillsList); +} + +class SkillsColumn extends StatelessWidget { + final List items; + + SkillsColumn(this.items); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: _buildRowContent(), + ); + } + + List _buildRowContent() { + return items.map((item) => SkillsBlock(item)).toList(); + } +} + +class SkillsBlock extends StatelessWidget { + final SkillItem item; + + SkillsBlock(this.item); + + @override + Widget build(BuildContext context) { + return Padding( + padding: EdgeInsets.only(bottom: 8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + TextSubtitle(text: item.name, textColor: AppColors.ContentDarkBlue,), + Wrap( + spacing: 4.0, + children: _buildWrapContent(item.skillsList), + ) + ], + ), + ); + } + + List _buildWrapContent(List items) { + return items + .map((item) => Container( + padding: EdgeInsets.all(4.0), + color: Colors.blueGrey, + child: TextContent(text: item, textColor: Colors.black), + )) + .toList(); + } +} diff --git a/lib/widgets/base/TextContentBig.dart b/lib/widgets/base/TextContentBig.dart new file mode 100644 index 0000000..138efe2 --- /dev/null +++ b/lib/widgets/base/TextContentBig.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:threeactions_area/resources/Resources.dart'; + +class TextContentBig extends StatelessWidget { + final String text; + Color textColor = AppColors.ContentWhite; + TextAlign textAlign = TextAlign.start; + + TextContentBig( + {super.key, + required this.text, + this.textColor = AppColors.ContentWhite, + this.textAlign = TextAlign.start}); + + @override + Widget build(BuildContext context) { + return (Text( + text, + style: TextStylesContent.ContentBig.copyWith(color: textColor), + textAlign: textAlign, + )); + } +} \ No newline at end of file diff --git a/lib/widgets/cv_elements/EventButton.dart b/lib/widgets/cv_elements/EventButton.dart new file mode 100644 index 0000000..3c75f82 --- /dev/null +++ b/lib/widgets/cv_elements/EventButton.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class EventButton extends StatefulWidget { + final String imageAsset; + final String url; + + const EventButton({ + super.key, + required this.imageAsset, + required this.url, + }); + + @override + EventButtonState createState() { + return EventButtonState( + imageAsset: imageAsset, + url: url, + ); + } +} + +class EventButtonState extends State { + final String imageAsset; + final String url; + + bool _isHovered = false; + + EventButtonState({ + required this.imageAsset, + required this.url, + }); + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => {_handleRedirect(url)}, + onHover: (value) { + setState(() { + _isHovered = value; + }); + }, + child: SizedBox( + child: Stack(children: [ + Image.asset( + imageAsset, + width: 140.0, + height: 50.0, + fit: BoxFit.fill, + ), + AnimatedOpacity( + opacity: _isHovered ? 0.0 : 0.3, + duration: Duration(microseconds: 250), + child: Container( + width: 140.0, + height: 50.0, + color: Colors.black, + ), + ) + ]), + ), + ); + } + + void _handleRedirect(String redirectUrl) async { + if (await canLaunchUrlString(redirectUrl)) { + await launchUrlString(redirectUrl); + } + } +} \ No newline at end of file diff --git a/lib/widgets/cv_elements/EventsBlock.dart b/lib/widgets/cv_elements/EventsBlock.dart new file mode 100644 index 0000000..32e43c0 --- /dev/null +++ b/lib/widgets/cv_elements/EventsBlock.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:threeactions_area/widgets/cv_elements/EventButton.dart'; + +import '../base/TextContentBig.dart'; + +class EventsBlock extends StatelessWidget { + final Color titleColor; + + const EventsBlock({super.key, required this.titleColor}); + + @override + Widget build(BuildContext context) { + return Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + TextContentBig(text: "Speaking", textColor: titleColor,), + SizedBox(height: 16.0,), + Wrap( + spacing: 8.0, + runSpacing: 8.0, + children: [ + EventButton( + imageAsset: "assets/img/card_conf_pl.jpg", + url: "https://podlodka.io/crew-records#:~:text=%D0%94%D0%B5%D1%82%D0%B0%D0%BB%D0%B8-,Android%20Crew%20%239,-12%20%D1%87%D0%B0%D1%81%D0%BE%D0%B2%20%D1%81%D0%B5%D1%81%D1%81%D0%B8%D0%B9" + ), + EventButton( + imageAsset: "assets/img/card_conf_uic.jpg", + url: "https://uic.dev/speakers/shardiko", + ), + EventButton( + imageAsset: "assets/img/card_conf_mb.jpg", + url: "https://mobiusconf.com/archive/2022%20Autumn/persons/a214a136347b4c91887655e42fe06113/", + ), + EventButton( + imageAsset: "assets/img/card_conf_st.jpg", + url: "https://ul24.nastachku.ru/sdui-and-copmose-%D0%B1%D1%83%D0%B4%D1%83%D1%89%D0%B5%D0%B5", + ), + ], + ) + ], + ); + } + +} \ No newline at end of file diff --git a/lib/widgets/cv_elements/WorkExpTimeline.dart b/lib/widgets/cv_elements/WorkExpTimeline.dart new file mode 100644 index 0000000..2e0dd64 --- /dev/null +++ b/lib/widgets/cv_elements/WorkExpTimeline.dart @@ -0,0 +1,76 @@ +import 'package:flutter/widgets.dart'; + +import '../../resources/Resources.dart'; +import '../base/TextContent.dart'; +import '../base/TextContentMin.dart'; +import '../base/TextSubtitle.dart'; + +class WorkExpTimeline extends StatelessWidget { + Widget _buildExpItem(String date, String companyInfo, String description) { + return Padding( + padding: EdgeInsets.only(bottom: 16.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + width: 16.0, + height: 2.0, + // color: Colors.white, + color: Color(0xff6EA1A9), + ), + SizedBox( + width: 8.0, + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextSubtitle(text: date, textColor: AppColors.ContentDarkBlue,), + TextContent(text: companyInfo, textColor: AppColors.ContentDarkBlue), + TextContentMin(text: description, textColor: AppColors.ContentDarkBlue) + ], + ) + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 2.0, + // color: Colors.white, + color: Color(0xff6EA1A9), + ), + Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + _buildExpItem( + "2016-2018", + "HOSTCO - Information Security Analyst", + "Audit and integration of security\nsystems in IT companies"), + _buildExpItem("2018", "ARGIN - Android Developer", + "Augmented reality projects, video/image\ntracking"), + _buildExpItem("2018-2019", "EastWind - Android Developer", + "Custom development, projects in\nbanking, services and marketplaces"), + _buildExpItem( + "2019-2021", + "Home Credit Bank - Middle Android Developer", + "FinTech (financial technology), private\nbanking, marketplace, loan projects"), + _buildExpItem( + "2021 - Current time", + "Skyeng - Senior Android Developer", + "EdTech (educational technology),\ninternational language learning projects"), + ], + ) + ], + ), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 40f5fd0..b5d9f50 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -84,18 +84,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7f0df31977cb2c0b88585095d168e689669a2cc9b97c309665e3386f3e9d341a" + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "10.0.4" + version: "10.0.5" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "06e98f569d004c1315b991ded39924b21af84cf14cc94791b8aea337d25b57f8" + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.5" leak_tracker_testing: dependency: transitive description: @@ -124,18 +124,18 @@ packages: dependency: transitive description: name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.8.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: "7687075e408b093f36e6bbf6c91878cc0d4cd10f409506f7bc996f68220b9136" + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.15.0" path: dependency: transitive description: @@ -201,10 +201,10 @@ packages: dependency: transitive description: name: test_api - sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.7.0" + version: "0.7.2" url_launcher: dependency: "direct main" description: @@ -217,10 +217,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "94d8ad05f44c6d4e2ffe5567ab4d741b82d62e3c8e288cc1fcea45965edf47c9" + sha256: "8fc3bae0b68c02c47c5c86fa8bfa74471d42687b0eded01b78de87872db745e2" url: "https://pub.dev" source: hosted - version: "6.3.8" + version: "6.3.12" url_launcher_ios: dependency: transitive description: @@ -233,18 +233,18 @@ packages: dependency: transitive description: name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.1" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" + sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_platform_interface: dependency: transitive description: @@ -257,10 +257,10 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: a36e2d7981122fa185006b216eb6b5b97ede3f9a54b7a511bc966971ab98d049 + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.3.3" url_launcher_windows: dependency: transitive description: @@ -281,18 +281,18 @@ packages: dependency: transitive description: name: vm_service - sha256: "3923c89304b715fb1eb6423f017651664a03bf5f4b29983627c4da791f74a4ec" + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "14.2.1" + version: "14.2.5" web: dependency: transitive description: name: web - sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 + sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb url: "https://pub.dev" source: hosted - version: "1.0.0" + version: "1.1.0" sdks: - dart: ">=3.4.0 <4.0.0" - flutter: ">=3.22.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 1a9c9fa..62d4403 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -114,3 +114,7 @@ flutter: - assets/img/img_gallery_3.jpg - assets/img/img_gallery_4.jpg - assets/img/img_gallery_5.jpg + - assets/img/card_conf_mb.jpg + - assets/img/card_conf_pl.jpg + - assets/img/card_conf_st.jpg + - assets/img/card_conf_uic.jpg