From 739d00d399dc83681becbe9a062b0c39c417bddd Mon Sep 17 00:00:00 2001 From: hackerhgl Date: Sun, 8 Nov 2020 19:22:31 +0500 Subject: [PATCH] Revamped About Developer Screen --- assets/langs/ar.json | 58 +++- assets/langs/en.json | 42 ++- assets/langs/zh.json | 58 +++- lib/Navigator.dart | 5 +- lib/Utils.dart | 34 +- lib/Widgets/AboutUser/AboutUserBio.dart | 41 +++ .../AboutUser/AboutUserContactButton.dart | 115 +++++++ lib/Widgets/AboutUser/AboutUserHeading.dart | 38 +++ lib/Widgets/AboutUser/AboutUserJobTitle.dart | 28 ++ lib/Widgets/AboutUser/AboutUserName.dart | 25 ++ lib/Widgets/AboutUser/AboutUserSkills.dart | 57 ++++ lib/Widgets/AboutUser/messages/keys.dart | 19 ++ lib/Widgets/AboutUser/messages/strings.dart | 30 ++ lib/Widgets/Banners/Alpha.dart | 38 +++ lib/Widgets/BottomSheets/Base.dart | 59 ++++ lib/Widgets/BottomSheets/WithBoxButtons.dart | 62 ++++ lib/Widgets/Buttons/Alpha.dart | 69 ++++ lib/Widgets/Buttons/BackIcon.dart | 25 ++ lib/Widgets/Buttons/Boxed.dart | 66 ++++ lib/Widgets/Header/Header.dart | 59 ++++ lib/Widgets/Header/StackFade.dart | 73 +++++ lib/Widgets/Header/TestKeys.dart | 5 + lib/Widgets/Screen/messages/keys.dart | 20 +- .../ScreenReveals/AvatarWithPunchHole.dart | 179 +++++++++++ .../AvatarWithPunchHoleClipper.dart | 48 +++ lib/Widgets/SnackBars/Base.dart | 53 ++++ lib/Widgets/SnackBars/snackbars.dart | 1 + .../AboutDeveloper/AboutDeveloper.dart | 33 +- lib/screens/AboutDeveloper/Dimensions.dart | 23 +- lib/screens/AboutDeveloper/TestKeys.dart | 5 + lib/screens/AboutDeveloper/data.dart | 107 +++++-- lib/screens/AboutDeveloper/messages/keys.dart | 34 +- .../AboutDeveloper/messages/strings.dart | 59 +++- .../widgets/AboutDeveloperAvatar.dart | 56 ---- .../widgets/AboutDeveloperBody.dart | 296 +++++++----------- .../widgets/AboutDeveloperContent.dart | 46 --- .../widgets/AboutDeveloperMoreProjects.dart | 120 +++++++ .../widgets/AboutDeveloperShowSupport.dart | 37 --- lib/screens/Home/widgets/HomeBody.dart | 2 +- lib/statics/Links.dart | 26 ++ pubspec.lock | 21 ++ pubspec.yaml | 1 + 42 files changed, 1720 insertions(+), 453 deletions(-) create mode 100644 lib/Widgets/AboutUser/AboutUserBio.dart create mode 100644 lib/Widgets/AboutUser/AboutUserContactButton.dart create mode 100644 lib/Widgets/AboutUser/AboutUserHeading.dart create mode 100644 lib/Widgets/AboutUser/AboutUserJobTitle.dart create mode 100644 lib/Widgets/AboutUser/AboutUserName.dart create mode 100644 lib/Widgets/AboutUser/AboutUserSkills.dart create mode 100644 lib/Widgets/AboutUser/messages/keys.dart create mode 100644 lib/Widgets/AboutUser/messages/strings.dart create mode 100644 lib/Widgets/Banners/Alpha.dart create mode 100644 lib/Widgets/BottomSheets/Base.dart create mode 100644 lib/Widgets/BottomSheets/WithBoxButtons.dart create mode 100644 lib/Widgets/Buttons/Alpha.dart create mode 100644 lib/Widgets/Buttons/BackIcon.dart create mode 100644 lib/Widgets/Buttons/Boxed.dart create mode 100644 lib/Widgets/Header/Header.dart create mode 100644 lib/Widgets/Header/StackFade.dart create mode 100644 lib/Widgets/Header/TestKeys.dart create mode 100644 lib/Widgets/ScreenReveals/AvatarWithPunchHole.dart create mode 100644 lib/Widgets/ScreenReveals/AvatarWithPunchHoleClipper.dart create mode 100644 lib/Widgets/SnackBars/Base.dart create mode 100644 lib/Widgets/SnackBars/snackbars.dart create mode 100644 lib/screens/AboutDeveloper/TestKeys.dart delete mode 100644 lib/screens/AboutDeveloper/widgets/AboutDeveloperAvatar.dart delete mode 100644 lib/screens/AboutDeveloper/widgets/AboutDeveloperContent.dart create mode 100644 lib/screens/AboutDeveloper/widgets/AboutDeveloperMoreProjects.dart delete mode 100644 lib/screens/AboutDeveloper/widgets/AboutDeveloperShowSupport.dart create mode 100644 lib/statics/Links.dart diff --git a/assets/langs/ar.json b/assets/langs/ar.json index f0e7bbb..994a570 100644 --- a/assets/langs/ar.json +++ b/assets/langs/ar.json @@ -122,18 +122,30 @@ "AboutAppScreen/answer8": "من حيث YES الفهرسه لكن رفرفة يفتقر في شعبيته في ذلك الوقت من بناء هذا التطبيق", "AboutAppScreen/iDont": "أنا لا أملك أي التصاميم التي نشره في هذا التطبيق. طلبت الإذن من المصممين قبل أن ينشر معهد اليونسكو للإحصاء. ولقد أعطى الائتمان ووضع جميع معلومات الاتصال (بقدر ما يمكن أن تجد لي) من المصممين.", "AboutDeveloperScreen/title": "حول التطبيقات", - "AboutDeveloperScreen/job": "شبكة كومة كامل ومطور التطبيق", - "AboutDeveloperScreen/description": "مرحبا، أنا الكامل المطور كومة الذي تم تطوير اقصاه الى اقصاه الحلول الذكية لأكثر من ثلاث سنوات. أنا شخص ملتزم وهو كفاءة عالية ولديه مهارات تنظيمية ممتازة لتطوير التطبيقات. I مساعدة طوال دورة حياة مشروع المكلفة تجربتي وضمان حلول ذات جودة أن الأهداف الوفاء. مع كل ما يقال، وأنا فخور جدا من العمل الذي أقوم به، وسوف تتوقف عند أي شيء للتأكد من انجاز المهمة إلى 100٪ الارتياح.", + "AboutDeveloperScreen/desc1": "مرحبا، أنا الكامل المطور كومة الذي تم تطوير اقصاه الى اقصاه الحلول الذكية لأكثر من ثلاث سنوات.", + "AboutDeveloperScreen/desc2": "أنا شخص ملتزم وهو كفاءة عالية ولديه مهارات تنظيمية ممتازة لتطوير التطبيقات.", + "AboutDeveloperScreen/desc3": "I مساعدة طوال دورة حياة مشروع المكلفة تجربتي وضمان حلول ذات جودة أن الأهداف الوفاء.", + "AboutDeveloperScreen/desc4": "مع كل ما يقال، وأنا فخور جدا من العمل الذي أقوم به، وسوف تتوقف عند أي شيء للتأكد من انجاز المهمة إلى 100٪ الارتياح.", "AboutDeveloperScreen/skillSet": "مهارتي مجموعة", - "AboutDeveloperScreen/letsChat": "دعنا نتحدث !", - "AboutDeveloperScreen/note": "ملاحظة: هذه الروابط الاتصال ليست أي نوع من خط المساعدة رفرفة. أنا مشتركة اتصالاتي فقط عن الاستفسارات المتعلقة الدتك.\n\n للحصول على أي مساعدة أو الإجابة متابعة المستندات والرد على طلبك على ستاكوفيرفلوو والفيسبوك مجموعة المجتمع.", - "AboutDeveloperScreen/support": "مشاهدة دعم", - "AboutDeveloperScreen/supportDescription": "إذا كنت ترغب في المشروع وتريد أن نقدر جهدي. ثم انقر فوق أي من هذه الروابط أدناه وتنفيذ الإجراء.", - "AboutDeveloperScreen/stepGit": "نجم هذا جيثب مستودع", - "AboutDeveloperScreen/stepStore": "قيم هذا التطبيق على playstore", - "AboutDeveloperScreen/stepEndorse": "تأييد مهاراتي على بلدي تابعني على", - "AboutDeveloperScreen/stepFiver": "المفضلة العربات بلدي على انعقاده", - "AboutDeveloperScreen/stepFreelancer": "إعطاء توصية بشأن بالقطعة", + "AboutDeveloperScreen/contacts": "بلدي اتصالات", + "AboutDeveloperScreen/contactsDesc": "لقد قمت بمشاركة اتصالاتي بدقة للاستعلامات التجارية ذات الصلة فقط.\nللحصول على أي مساعدة ذات الصلة الرفرفة الرد على طلبك في الرفرفة جيثب، الرفرفة الفرعية رديت والرفرفة مجموعات الفيسبوك", + "AboutDeveloperScreen/likeProject": "مثل هذا المشروع؟", + "AboutDeveloperScreen/likeProjectDesc": "اظهار الدعم عن طريق أداء أي عمل المدرجة أدناه.", + "AboutDeveloperScreen/moreProjects": "استكشاف المزيد من مشاريع", + "AboutDeveloperScreen/projectFUD": "تنفيذ بسيط من التصاميم UI معقدة والرسوم المتحركة. في هذا المشروع سوف تواجه رحلتي من تجارب لايجاد بنية رفرفة مثالية.", + "AboutDeveloperScreen/projectRNL": "بسيطة وأنيقة استنساخ \"حلقة اللعبة\" في رد فعل الأم مع setState فقط بسيطة وسياقات للدولة المشتركة.", + "AboutDeveloperScreen/projectHCV": "صياغة بسيطة من بلدي الإبداع والخيال في نسخة الويب من CV / السيرة الذاتية مع مساعدة من الصلصال / ساس / JS. الذي يسلط الضوء على رحلة مسيرتي", + "AboutDeveloperScreen/likeProject1": "نجم هذا المستودع", + "AboutDeveloperScreen/likeProject2": "استعراض هذا التطبيق على", + "AboutDeveloperScreen/likeProject3": "الموافقة على مهاراتي", + "AboutDeveloperScreen/likeProject4": "المفضلة العربات بلدي على", + "AboutDeveloperScreen/share": "شارك", + "AboutDeveloperScreen/copy": "نسخ", + "AboutDeveloperScreen/open": "افتح", + "AboutDeveloperScreen/linkCopied": "تم نسخ الرابط", + "AboutDeveloperScreen/or": "أو", + "AboutDeveloperScreen/developers": "شركة تطوير", + "AboutDeveloperScreen/profile": "الملف الشخصي", "DesignerProfileScreen/contactMe": "اتصل بي", "DesignerProfileScreen/hireMe": "استئجار لي لحسابهم الخاص", "DesignerProfileScreen/explore": "استكشاف المزيد من التصاميم", @@ -176,6 +188,19 @@ "UIDetailScreen/ios": "دائرة الرقابة الداخلية", "UIDetailScreen/web": "شبكة", "UIDetailScreen/desktop": "سطح المكتب", + "AboutUserWidget/skillSet": "بلدي المهارة مجموعة", + "AboutUserWidget/contacts": "بلدي اتصالات", + "AboutUserWidget/likeProject": "مثل هذا المشروع؟", + "AboutUserWidget/moreProjects": "استكشاف المزيد من مشاريع", + "AboutUserWidget/contactsDesc": "لقد قمت بمشاركة اتصالاتي بدقة للاستعلامات التجارية ذات الصلة فقط.\nللحصول على أي مساعدة ذات الصلة الرفرفة الرد على طلبك في الرفرفة جيثب، الرفرفة الفرعية رديت والرفرفة مجموعات الفيسبوك", + "AboutUserWidget/likeProjectDesc": "اظهار الدعم عن طريق أداء أي عمل المدرجة أدناه.", + "AboutUserWidget/share": "شارك", + "AboutUserWidget/copy": "نسخ", + "AboutUserWidget/open": "افتح", + "AboutUserWidget/linkCopied": "تم نسخ الرابط", + "AboutUserWidget/or": "أو", + "AboutUserWidget/developers": "شركة تطوير", + "AboutUserWidget/profile": "الملف الشخصي", "ScreenWidget/smTitle": "الإعدادات", "ScreenWidget/smSelectLanguage": "اختار اللغة", "ScreenWidget/smEnglish": "الإنجليزية", @@ -186,6 +211,17 @@ "ScreenWidget/smSytemTheme": "Sytem الموضوع", "ScreenWidget/smLightTheme": "موضوع خفيف", "ScreenWidget/smDarkTheme": "موضوع الظلام", + "AboutDeveloperScreen/job": "شبكة كومة كامل ومطور التطبيق", + "AboutDeveloperScreen/description": "مرحبا، أنا الكامل المطور كومة الذي تم تطوير اقصاه الى اقصاه الحلول الذكية لأكثر من ثلاث سنوات. أنا شخص ملتزم وهو كفاءة عالية ولديه مهارات تنظيمية ممتازة لتطوير التطبيقات. I مساعدة طوال دورة حياة مشروع المكلفة تجربتي وضمان حلول ذات جودة أن الأهداف الوفاء. مع كل ما يقال، وأنا فخور جدا من العمل الذي أقوم به، وسوف تتوقف عند أي شيء للتأكد من انجاز المهمة إلى 100٪ الارتياح.", + "AboutDeveloperScreen/letsChat": "دعنا نتحدث !", + "AboutDeveloperScreen/note": "ملاحظة: هذه الروابط الاتصال ليست أي نوع من خط المساعدة رفرفة. أنا مشتركة اتصالاتي فقط عن الاستفسارات المتعلقة الدتك.\n\n للحصول على أي مساعدة أو الإجابة متابعة المستندات والرد على طلبك على ستاكوفيرفلوو والفيسبوك مجموعة المجتمع.", + "AboutDeveloperScreen/support": "مشاهدة دعم", + "AboutDeveloperScreen/supportDescription": "إذا كنت ترغب في المشروع وتريد أن نقدر جهدي. ثم انقر فوق أي من هذه الروابط أدناه وتنفيذ الإجراء.", + "AboutDeveloperScreen/stepGit": "نجم هذا جيثب مستودع", + "AboutDeveloperScreen/stepStore": "قيم هذا التطبيق على playstore", + "AboutDeveloperScreen/stepEndorse": "تأييد مهاراتي على بلدي تابعني على", + "AboutDeveloperScreen/stepFiver": "المفضلة العربات بلدي على انعقاده", + "AboutDeveloperScreen/stepFreelancer": "إعطاء توصية بشأن بالقطعة", "ScreenWidget/error": "خطأ", "ScreenWidget/cantPerform": "Platfrom لا يمكن تنفيذ الإجراء", "ETCHomeScreen/Pause": "وقفة", diff --git a/assets/langs/en.json b/assets/langs/en.json index cf1d871..5113739 100644 --- a/assets/langs/en.json +++ b/assets/langs/en.json @@ -49,10 +49,10 @@ "AboutAppScreen/answer7": "UI part of the framework is true cross platform but most of native packages lacks support for desktop and web platform.", "AboutAppScreen/answer8": "In terms of performace YES but flutter lacks in popularity at the time of building this app", "AboutAppScreen/iDont": "I don't own any designs that's published in this app. I asked for the permission of designers before I published UIs. And I've gave credit & put all contact information(as much as I could find) of designers.", - "AboutDeveloperScreen/title": "About App", + "AboutDeveloperScreen/title": "About Developer", "AboutDeveloperScreen/job": "Full stack web and app developer", "AboutDeveloperScreen/description": "Hi, I am full stack developer who has been developing end to end smart solutions for more than three years. I am a committed individual who is highly efficient and has excellent organisational skills to develop applications. I help throughout the life cycle of an assigned project with my experience and ensure quality solutions that meet objectives. With all that being said, I am very proud of the work I do, and will stop at nothing to make sure the job is done to 100% satisfaction.", - "AboutDeveloperScreen/skillSet": "My skill set", + "AboutDeveloperScreen/skillSet": "My Skill Set", "AboutDeveloperScreen/letsChat": "Let's Chat !", "AboutDeveloperScreen/note": "NOTE: These contact links are not any kind of flutter helpline. I shared my contacts only for buisness related inquiries.\n\n For any help or answer follow docs and post your query on stackoverflow and facebook community group.", "AboutDeveloperScreen/support": "Show Support", @@ -203,5 +203,41 @@ "ScreenWidget/smSelectTheme": "Select Theme", "ScreenWidget/smSytemTheme": "Sytem Theme", "ScreenWidget/smLightTheme": "Light Theme", - "ScreenWidget/smDarkTheme": "Dark Theme" + "ScreenWidget/smDarkTheme": "Dark Theme", + "AboutDeveloperScreen/desc1": "Hi, I am full stack developer who has been developing end to end smart solutions for more than three years.", + "AboutDeveloperScreen/desc2": "I am a committed individual who is highly efficient and has excellent organizational skills to develop applications.", + "AboutDeveloperScreen/desc3": "I help throughout the life cycle of an assigned project with my experience and ensure quality solutions that meet objectives.", + "AboutDeveloperScreen/desc4": "With all that being said, I am very proud of the work I do, and will stop at nothing to make sure the job is done to 100% satisfaction.", + "AboutDeveloperScreen/contacts": "My Contacts", + "AboutDeveloperScreen/contactsDesc": "I've shared my contacts strictly for business related queries ONLY.\nFor any Flutter related help post your query on Flutter Github, Flutter sub reddit & Flutter facebook groups", + "AboutDeveloperScreen/likeProject": "Like The Project?", + "AboutDeveloperScreen/likeProjectDesc": "Show support by performing any action listed below.", + "AboutDeveloperScreen/moreProjects": "Explore More Projects", + "AboutDeveloperScreen/projectFUD": "Simple implementation of complex UI designs and animations. In this project you will experience my journey of experimenting to find ideal flutter architecture.", + "AboutDeveloperScreen/projectRNL": "Simple and elegant clone \"Loop game\" in react native with just simple setState & contexts for shared state.", + "AboutDeveloperScreen/projectHCV": "Simple crafting of my creativity and imagination into web version of CV/Resume with the help of Pug/Sass/JS. Which highlights my career journey", + "AboutDeveloperScreen/likeProject1": "Star this repository", + "AboutDeveloperScreen/likeProject2": "Review this app on", + "AboutDeveloperScreen/likeProject3": "Endorse my skills on", + "AboutDeveloperScreen/likeProject4": "Favorite my gigs on", + "AboutDeveloperScreen/share": "Share", + "AboutDeveloperScreen/copy": "Copy", + "AboutDeveloperScreen/open": "Open", + "AboutDeveloperScreen/linkCopied": "link copied", + "AboutDeveloperScreen/or": "or", + "AboutDeveloperScreen/developers": "developer's", + "AboutDeveloperScreen/profile": "profile", + "AboutUserWidget/skillSet": "My Skill Set", + "AboutUserWidget/contacts": "My Contacts", + "AboutUserWidget/likeProject": "Like The Project?", + "AboutUserWidget/moreProjects": "Explore More Projects", + "AboutUserWidget/contactsDesc": "I've shared my contacts strictly for business related queries ONLY.\nFor any Flutter related help post your query on Flutter Github, Flutter sub reddit & Flutter facebook groups", + "AboutUserWidget/likeProjectDesc": "Show support by performing any action listed below.", + "AboutUserWidget/share": "Share", + "AboutUserWidget/copy": "Copy", + "AboutUserWidget/open": "Open", + "AboutUserWidget/linkCopied": "link copied", + "AboutUserWidget/or": "or", + "AboutUserWidget/developers": "developer's", + "AboutUserWidget/profile": "profile" } \ No newline at end of file diff --git a/assets/langs/zh.json b/assets/langs/zh.json index 71287c6..f19d6e8 100644 --- a/assets/langs/zh.json +++ b/assets/langs/zh.json @@ -122,18 +122,30 @@ "AboutAppScreen/answer8": "在服务表现YES但扑而言,在构建这个应用程序的时间人气缺乏", "AboutAppScreen/iDont": "我不拥有该公布的在此应用程序的任何设计。我问设计师的同意之前,我发表的UI。我也给信贷和把所有的联系信息(像我一样能找到)的设计师。", "AboutDeveloperScreen/title": "关于应用程序", - "AboutDeveloperScreen/job": "全栈的网络和应用程序开发者", - "AboutDeveloperScreen/description": "您好,我是谁一直在开发端到端的智能解决方案,为三年多来全栈开发。我是一个坚定的个人谁是高效并具有出色的组织能力来开发应用程序。整个凭我的经验分配项目的生命周期我的帮助和保证质量的解决方案,满足目标。与所有他这样说,我很自豪我所做的工作,并会不惜一切代价,确保任务完成,以100%的满意。", + "AboutDeveloperScreen/desc1": "您好,我是谁一直在开发端到端的智能解决方案,为三年多来全栈开发。", + "AboutDeveloperScreen/desc2": "我是一个坚定的个人谁是高效并具有出色的组织能力来开发应用程序。", + "AboutDeveloperScreen/desc3": "整个凭我的经验分配项目的生命周期我的帮助和保证质量的解决方案,满足目标。", + "AboutDeveloperScreen/desc4": "与所有他这样说,我很自豪我所做的工作,并会不惜一切代价,确保任务完成,以100%的满意。", "AboutDeveloperScreen/skillSet": "我的技能", - "AboutDeveloperScreen/letsChat": "让我们聊天!", - "AboutDeveloperScreen/note": "注意:这些接触环节都没有任何一种扑热线的。我分享我的联系人仅供楼内设有商务相关查询。\n\n 对于任何帮助或答案的后续文件,并张贴在计算器和Facebook社区组查询。", - "AboutDeveloperScreen/support": "表示支持", - "AboutDeveloperScreen/supportDescription": "如果你喜欢的项目,并希望欣赏我的努力。然后点击下方任意这些链接和执行的操作。", - "AboutDeveloperScreen/stepGit": "星github上库", - "AboutDeveloperScreen/stepStore": "速率对Play商店中的这个应用程序", - "AboutDeveloperScreen/stepEndorse": "赞同我的技能对我的LinkedIn", - "AboutDeveloperScreen/stepFiver": "我最喜欢的五元美钞演出", - "AboutDeveloperScreen/stepFreelancer": "给上自由职业者的建议", + "AboutDeveloperScreen/contacts": "我的联系方式", + "AboutDeveloperScreen/contactsDesc": "我分享我的联系人只用于业务相关的查询。\n对于任何扑相关帮助,发表您的查询上扑Github上,颤振子reddit的与Facebook的扑组", + "AboutDeveloperScreen/likeProject": "喜欢的项目?", + "AboutDeveloperScreen/likeProjectDesc": "显示通过执行以下所列的任何行动的支持。", + "AboutDeveloperScreen/moreProjects": "浏览更多项目", + "AboutDeveloperScreen/projectFUD": "简单实现复杂的UI设计和动画。在这个项目中,你将体验我尝试找到理想扑架构的旅程。", + "AboutDeveloperScreen/projectRNL": "古朴典雅的克隆“循环游戏”的反应与本土只是简单的的setState和共享状态上下文。", + "AboutDeveloperScreen/projectHCV": "我的创造力和想象力的简单工艺加工成的简历网页版/恢复与哈巴狗/萨斯/ JS的帮助。这凸显我的职业生涯之旅", + "AboutDeveloperScreen/likeProject1": "星库", + "AboutDeveloperScreen/likeProject2": "查看这个应用程序", + "AboutDeveloperScreen/likeProject3": "赞同我的技能上", + "AboutDeveloperScreen/likeProject4": "最喜欢我的演出", + "AboutDeveloperScreen/share": "分享", + "AboutDeveloperScreen/copy": "复制", + "AboutDeveloperScreen/open": "打开", + "AboutDeveloperScreen/linkCopied": "复制链接", + "AboutDeveloperScreen/or": "要么", + "AboutDeveloperScreen/developers": "开发者", + "AboutDeveloperScreen/profile": "简介", "DesignerProfileScreen/contactMe": "联络我", "DesignerProfileScreen/hireMe": "雇用我自由", "DesignerProfileScreen/explore": "探索更多的设计", @@ -176,6 +188,19 @@ "UIDetailScreen/ios": "iOS版", "UIDetailScreen/web": "卷筒纸", "UIDetailScreen/desktop": "桌面", + "AboutUserWidget/skillSet": "我的技能", + "AboutUserWidget/contacts": "我的联系方式", + "AboutUserWidget/likeProject": "喜欢的项目?", + "AboutUserWidget/moreProjects": "浏览更多项目", + "AboutUserWidget/contactsDesc": "我分享我的联系人只用于业务相关的查询。\n对于任何扑相关帮助,发表您的查询上扑Github上,颤振子reddit的与Facebook的扑组", + "AboutUserWidget/likeProjectDesc": "显示通过执行以下所列的任何行动的支持。", + "AboutUserWidget/share": "分享", + "AboutUserWidget/copy": "复制", + "AboutUserWidget/open": "打开", + "AboutUserWidget/linkCopied": "复制链接", + "AboutUserWidget/or": "要么", + "AboutUserWidget/developers": "开发者", + "AboutUserWidget/profile": "简介", "ScreenWidget/smTitle": "设置", "ScreenWidget/smSelectLanguage": "选择语言", "ScreenWidget/smEnglish": "英语", @@ -186,6 +211,17 @@ "ScreenWidget/smSytemTheme": "系统正主题", "ScreenWidget/smLightTheme": "光主题", "ScreenWidget/smDarkTheme": "黑暗主题", + "AboutDeveloperScreen/job": "全栈的网络和应用程序开发者", + "AboutDeveloperScreen/description": "您好,我是谁一直在开发端到端的智能解决方案,为三年多来全栈开发。我是一个坚定的个人谁是高效并具有出色的组织能力来开发应用程序。整个凭我的经验分配项目的生命周期我的帮助和保证质量的解决方案,满足目标。与所有他这样说,我很自豪我所做的工作,并会不惜一切代价,确保任务完成,以100%的满意。", + "AboutDeveloperScreen/letsChat": "让我们聊天!", + "AboutDeveloperScreen/note": "注意:这些接触环节都没有任何一种扑热线的。我分享我的联系人仅供楼内设有商务相关查询。\n\n 对于任何帮助或答案的后续文件,并张贴在计算器和Facebook社区组查询。", + "AboutDeveloperScreen/support": "表示支持", + "AboutDeveloperScreen/supportDescription": "如果你喜欢的项目,并希望欣赏我的努力。然后点击下方任意这些链接和执行的操作。", + "AboutDeveloperScreen/stepGit": "星github上库", + "AboutDeveloperScreen/stepStore": "速率对Play商店中的这个应用程序", + "AboutDeveloperScreen/stepEndorse": "赞同我的技能对我的LinkedIn", + "AboutDeveloperScreen/stepFiver": "我最喜欢的五元美钞演出", + "AboutDeveloperScreen/stepFreelancer": "给上自由职业者的建议", "ScreenWidget/error": "错误", "ScreenWidget/cantPerform": "洗车台无法执行操作", "ETCHomeScreen/Pause": "暂停", diff --git a/lib/Navigator.dart b/lib/Navigator.dart index 0a19479..83cf005 100644 --- a/lib/Navigator.dart +++ b/lib/Navigator.dart @@ -3,9 +3,8 @@ import 'package:flutter/services.dart'; import 'package:provider/provider.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; -import './configs/theme.dart' as theme; - -import 'package:flutter_uis/AppLocalizations.dart'; +import 'configs/theme.dart' as theme; +import 'AppLocalizations.dart'; import 'Providers/AppProvider.dart'; import 'screens/Home/Home.dart'; diff --git a/lib/Utils.dart b/lib/Utils.dart index cd44481..e79b66c 100644 --- a/lib/Utils.dart +++ b/lib/Utils.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_uis/io/io.dart'; +import 'package:universal_io/io.dart'; import 'package:url_launcher/url_launcher.dart' as url; import 'package:open_url/open_url.dart'; @@ -21,8 +21,19 @@ class Utils { } static double rangeMap( - double number, double inMin, double inMax, double outMin, double outMax) { - return (number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; + double number, + double inMin, + double inMax, + double outMin, + double outMax, { + bool safe = false, + }) { + final range = + (number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin; + if (safe) { + return range.clamp(outMin, outMax); + } + return range; } static double rangeL2LMap( @@ -32,20 +43,26 @@ class Utils { double inMax, double outMin, double outMid, - double outMax, - ) { + double outMax, { + bool safe = false, + }) { double parsed = Utils.rangeMap(number, inMin, inMid, outMin, outMid); if (parsed > outMid) { parsed = Utils.rangeMap(number, inMid, inMax, outMid, outMax); } + if (safe) { + if (parsed <= outMin) return outMin; + if (parsed >= outMax) return outMax; + } + return parsed; } static launchUrl(link) async { try { - if (Platform.isLinux || Platform.isWindows) { + if (Platform.isWindows || Platform.isLinux) { final result = await openUrl(link); return result.exitCode != 0; } else { @@ -56,6 +73,7 @@ class Utils { return safeCheck; } } catch (e) { + print(e); return false; } } @@ -134,4 +152,8 @@ class Utils { static bool isDesktop() { return Platform.isMacOS || Platform.isWindows || Platform.isLinux; } + + static bool isMobile() { + return Platform.isAndroid || Platform.isIOS; + } } diff --git a/lib/Widgets/AboutUser/AboutUserBio.dart b/lib/Widgets/AboutUser/AboutUserBio.dart new file mode 100644 index 0000000..cff8ee1 --- /dev/null +++ b/lib/Widgets/AboutUser/AboutUserBio.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; +import 'package:flutter_uis/configs/App.dart'; + +class AboutUserBio extends StatelessWidget { + AboutUserBio({ + @required this.points, + this.translate = true, + }); + + final List points; + final bool translate; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: this + .points + .map( + (text) => Padding( + padding: EdgeInsets.only( + left: AppDimensions.padding * 2, + right: AppDimensions.padding * 2, + top: AppDimensions.padding * 0.8, + ), + child: Text( + App.translate(text, context), + style: TextStyles.body16.copyWith( + color: AppTheme.subText, + ), + ), + ), + ) + .toList(), + ); + } +} diff --git a/lib/Widgets/AboutUser/AboutUserContactButton.dart b/lib/Widgets/AboutUser/AboutUserContactButton.dart new file mode 100644 index 0000000..f5cd0a9 --- /dev/null +++ b/lib/Widgets/AboutUser/AboutUserContactButton.dart @@ -0,0 +1,115 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_icons/flutter_icons.dart'; +import 'package:supercharged/supercharged.dart'; +import 'package:share/share.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/App.dart'; + +import 'package:flutter_uis/Utils.dart'; + +import 'package:flutter_uis/widgets/BottomSheets/WithBoxButtons.dart'; +import 'package:flutter_uis/widgets/SnackBars/Base.dart'; +import 'package:flutter_uis/widgets/Buttons/Alpha.dart'; + +import 'messages/keys.dart'; + +class AboutUserContactButton extends StatelessWidget { + AboutUserContactButton({ + this.url, + @required this.icon, + @required this.label, + @required this.platform, + @required this.initContext, + }); + + final String url; + final String label; + final IconData icon; + final String platform; + final Function(BuildContext) initContext; + + void onTap(BuildContext context) { + final socialUrl = this.url ?? Utils.socialLink(this.label, this.platform); + final isMobile = Utils.isMobile(); + + // Labels + final label1 = App.translate( + isMobile ? AboutUserWidgetMessages.share : AboutUserWidgetMessages.copy, + context, + ); + final label2 = App.translate( + AboutUserWidgetMessages.open, + context, + ); + final linkCopied = App.translate( + AboutUserWidgetMessages.linkCopied, + context, + ); + + final or = App.translate( + AboutUserWidgetMessages.or, + context, + ); + final developers = App.translate( + AboutUserWidgetMessages.developers, + context, + ); + final profile = App.translate( + AboutUserWidgetMessages.profile, + context, + ); + + final icon1 = isMobile + ? MaterialCommunityIcons.share_variant + : MaterialCommunityIcons.content_copy; + final icon2 = this.icon; + + showBottomSheetWithBoxButtons( + context: context, + appinit: this.initContext, + button1: (bottomSheetContext) async { + if (isMobile) { + Share.share(socialUrl, subject: this.platform); + } else { + Clipboard.setData( + ClipboardData( + text: socialUrl, + ), + ); + Navigator.pop(bottomSheetContext); + await 200.milliseconds.delay; + Scaffold.of(context).hideCurrentSnackBar( + reason: SnackBarClosedReason.dismiss, + ); + showSnackBarBase( + context: context, + width: AppDimensions.maxContainerWidth, + text: "${this.platform} $linkCopied", + ); + } + }, + button2: (_) => Utils.launchUrl(socialUrl), + title: "$label2 $or $label1 $developers ${this.platform} $profile", + label1: label1, + label2: label2, + icon1: icon1, + icon2: icon2, + ); + } + + @override + Widget build(BuildContext context) { + return AlphaButton( + icon: this.icon, + label: this.label.toUpperCase(), + onTap: () => this.onTap(context), + margin: EdgeInsets.only( + top: AppDimensions.padding * 2, + left: AppDimensions.padding * 2, + right: AppDimensions.padding * 2, + ), + ); + } +} diff --git a/lib/Widgets/AboutUser/AboutUserHeading.dart b/lib/Widgets/AboutUser/AboutUserHeading.dart new file mode 100644 index 0000000..4a3a815 --- /dev/null +++ b/lib/Widgets/AboutUser/AboutUserHeading.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/App.dart'; + +import 'messages/keys.dart'; + +final map = { + "skills": AboutUserWidgetMessages.skillSet, + "contacts": AboutUserWidgetMessages.contacts, + "likeProject": AboutUserWidgetMessages.likeProject, + "moreProjects": AboutUserWidgetMessages.moreProjects, +}; + +class AboutUserHeading extends StatelessWidget { + AboutUserHeading({ + @required this.label, + this.isMapped = true, + }); + + final String label; + final bool isMapped; + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: EdgeInsets.symmetric( + horizontal: AppDimensions.padding * 2, + ), + child: Text( + this.isMapped ? App.translate(map[this.label], context) : this.label, + style: TextStyles.heading4, + ), + ); + } +} diff --git a/lib/Widgets/AboutUser/AboutUserJobTitle.dart b/lib/Widgets/AboutUser/AboutUserJobTitle.dart new file mode 100644 index 0000000..6e93420 --- /dev/null +++ b/lib/Widgets/AboutUser/AboutUserJobTitle.dart @@ -0,0 +1,28 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +class AboutUserJobTitle extends StatelessWidget { + AboutUserJobTitle({ + @required this.label, + }); + + final String label; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric( + horizontal: AppDimensions.padding * 2, + ), + child: Text( + this.label, + style: TextStyles.body17.copyWith( + color: AppTheme.primary, + ), + ), + ); + } +} diff --git a/lib/Widgets/AboutUser/AboutUserName.dart b/lib/Widgets/AboutUser/AboutUserName.dart new file mode 100644 index 0000000..25b1b61 --- /dev/null +++ b/lib/Widgets/AboutUser/AboutUserName.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; + +class AboutUserName extends StatelessWidget { + AboutUserName({ + @required this.name, + }); + + final String name; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric( + horizontal: AppDimensions.padding * 2, + ), + child: Text( + this.name, + style: TextStyles.heading16, + ), + ); + } +} diff --git a/lib/Widgets/AboutUser/AboutUserSkills.dart b/lib/Widgets/AboutUser/AboutUserSkills.dart new file mode 100644 index 0000000..25ecde4 --- /dev/null +++ b/lib/Widgets/AboutUser/AboutUserSkills.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +class AboutUserSkills extends StatelessWidget { + AboutUserSkills({ + @required this.skills, + }); + + final List skills; + + @override + Widget build(BuildContext context) { + return Container( + margin: EdgeInsets.symmetric( + horizontal: AppDimensions.padding * 1, + ), + child: Wrap( + children: this + .skills + .map( + (text) => Container( + decoration: BoxDecoration( + color: AppTheme.background, + borderRadius: BorderRadius.circular(6.0), + border: Border.all( + width: 1.6, + color: AppTheme.primary, + ), + boxShadow: [ + BoxShadow( + offset: Offset(0.0, 1.0), + blurRadius: 3, + color: AppTheme.primary.withOpacity(0.30), + ), + ], + ), + margin: EdgeInsets.all( + AppDimensions.padding * 1, + ), + padding: EdgeInsets.symmetric( + vertical: AppDimensions.padding * 1.2, + horizontal: AppDimensions.padding * 2, + ), + child: Text( + text.toUpperCase(), + style: TextStyles.body27, + ), + ), + ) + .toList(), + ), + ); + } +} diff --git a/lib/Widgets/AboutUser/messages/keys.dart b/lib/Widgets/AboutUser/messages/keys.dart new file mode 100644 index 0000000..c9a320e --- /dev/null +++ b/lib/Widgets/AboutUser/messages/keys.dart @@ -0,0 +1,19 @@ +// This is an auto generated file. Do not make any change on this. + +const scope = 'AboutUserWidget'; + +abstract class AboutUserWidgetMessages { + static String skillSet = '$scope/skillSet'; + static String contacts = '$scope/contacts'; + static String likeProject = '$scope/likeProject'; + static String moreProjects = '$scope/moreProjects'; + static String contactsDesc = '$scope/contactsDesc'; + static String likeProjectDesc = '$scope/likeProjectDesc'; + static String share = '$scope/share'; + static String copy = '$scope/copy'; + static String open = '$scope/open'; + static String linkCopied = '$scope/linkCopied'; + static String or = '$scope/or'; + static String developers = '$scope/developers'; + static String profile = '$scope/profile'; +} diff --git a/lib/Widgets/AboutUser/messages/strings.dart b/lib/Widgets/AboutUser/messages/strings.dart new file mode 100644 index 0000000..9b4b231 --- /dev/null +++ b/lib/Widgets/AboutUser/messages/strings.dart @@ -0,0 +1,30 @@ +import 'dart:isolate'; + +const String scope = 'AboutUserWidget'; + +const Map strings = { + // Headings + '$scope/skillSet': 'My Skill Set', + '$scope/contacts': 'My Contacts', + '$scope/likeProject': 'Like The Project?', + '$scope/moreProjects': 'Explore More Projects', + + // Banners + '$scope/contactsDesc': + "I've shared my contacts strictly for business related queries ONLY.\nFor any Flutter related help post your query on Flutter Github, Flutter sub reddit & Flutter facebook groups", + '$scope/likeProjectDesc': + "Show support by performing any action listed below.", + + // singulars + '$scope/share': 'Share', + '$scope/copy': 'Copy', + '$scope/open': 'Open', + '$scope/linkCopied': 'link copied', + '$scope/or': 'or', + '$scope/developers': "developer\'s", + '$scope/profile': 'profile', +}; + +main(List args, SendPort port) { + port.send({"strings": strings, "scope": scope}); +} diff --git a/lib/Widgets/Banners/Alpha.dart b/lib/Widgets/Banners/Alpha.dart new file mode 100644 index 0000000..764859f --- /dev/null +++ b/lib/Widgets/Banners/Alpha.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; + +class AlphaBanner extends StatelessWidget { + AlphaBanner({ + @required this.text, + this.margin = EdgeInsets.zero, + }); + + final String text; + final EdgeInsets margin; + + @override + Widget build(BuildContext context) { + return Container( + margin: this.margin, + width: double.infinity, + decoration: BoxDecoration( + color: AppTheme.text.withOpacity(0.65), + ), + padding: EdgeInsets.only( + left: AppDimensions.padding * 2.0, + right: AppDimensions.padding * 2.0, + top: AppDimensions.padding * 1.0, + bottom: AppDimensions.padding * 1.5, + ), + child: Text( + this.text, + style: TextStyles.body17.copyWith( + color: AppTheme.background, + // color: Theme.of(context).scaffoldBackgroundColor, + ), + ), + ); + } +} diff --git a/lib/Widgets/BottomSheets/Base.dart b/lib/Widgets/BottomSheets/Base.dart new file mode 100644 index 0000000..4003275 --- /dev/null +++ b/lib/Widgets/BottomSheets/Base.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +class BottomSheetBase extends StatelessWidget { + BottomSheetBase({ + this.width, + @required this.children, + }); + + final double width; + final List children; + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + child: FittedBox( + fit: BoxFit.scaleDown, + child: Container( + padding: EdgeInsets.all(AppDimensions.padding * 2), + decoration: BoxDecoration( + color: AppTheme.background, + borderRadius: BorderRadius.vertical( + top: Radius.circular(24.0), + ), + boxShadow: [ + BoxShadow( + blurRadius: 16.0, + color: AppTheme.shadow, + ) + ], + ), + child: Container( + width: this.width, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Align( + child: Container( + height: 7.0, + width: AppDimensions.padding * 16, + margin: EdgeInsets.only(top: AppDimensions.padding), + decoration: BoxDecoration( + color: AppTheme.shadow, + borderRadius: BorderRadius.circular(10.0), + ), + ), + ), + Container(height: AppDimensions.padding * 2), + ...children, + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/Widgets/BottomSheets/WithBoxButtons.dart b/lib/Widgets/BottomSheets/WithBoxButtons.dart new file mode 100644 index 0000000..ac48e6e --- /dev/null +++ b/lib/Widgets/BottomSheets/WithBoxButtons.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; + +import 'package:flutter_uis/widgets/Buttons/Boxed.dart'; + +import 'Base.dart'; + +void showBottomSheetWithBoxButtons({ + // Contexts + BuildContext context, + Function(BuildContext) appinit, + Future Function(BuildContext context) button1, + Future Function(BuildContext context) button2, + + // Strings + String title, + String label1, + String label2, + + // Icons + IconData icon1, + IconData icon2, +}) { + Scaffold.of(context).showBottomSheet( + (bottomSheetContext) { + appinit(bottomSheetContext); + + return BottomSheetBase( + width: AppDimensions.maxContainerWidth, + children: [ + Container( + margin: EdgeInsets.symmetric( + vertical: AppDimensions.padding * 1, + horizontal: AppDimensions.padding * 2, + ), + child: Text( + title, + style: TextStyles.heading56, + ), + ), + Row( + children: [ + BoxedButton( + icon: icon1, + label: label1.toUpperCase(), + onPressed: () => button1(bottomSheetContext), + ), + BoxedButton( + icon: icon2, + label: (label2).toUpperCase(), + onPressed: () => button2(bottomSheetContext), + ), + ], + ), + ], + ); + }, + backgroundColor: Colors.transparent, + ); +} diff --git a/lib/Widgets/Buttons/Alpha.dart b/lib/Widgets/Buttons/Alpha.dart new file mode 100644 index 0000000..405d1d7 --- /dev/null +++ b/lib/Widgets/Buttons/Alpha.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +class AlphaButton extends StatelessWidget { + AlphaButton({ + // Required + @required this.onTap, + @required this.label, + + // Not required + this.icon, + this.margin = EdgeInsets.zero, + + // Assignable + borderRadius, + }) : this.borderRadius = borderRadius ?? BorderRadius.circular(8.0); + + final String label; + final IconData icon; + final EdgeInsets margin; + final VoidCallback onTap; + final BorderRadius borderRadius; + + @override + Widget build(BuildContext context) { + final hasIcon = this.icon != null; + final textColor = AppTheme.text.withOpacity(0.1); + + return Padding( + padding: this.margin, + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: this.onTap, + borderRadius: this.borderRadius, + child: Container( + decoration: BoxDecoration( + color: textColor, + borderRadius: this.borderRadius, + ), + padding: EdgeInsets.symmetric( + vertical: AppDimensions.padding * 2, + horizontal: AppDimensions.padding * 3, + ), + child: Row( + children: [ + hasIcon + ? Icon( + this.icon, + size: 10 + AppDimensions.ratio * 4, + ) + : SizedBox(), + SizedBox(width: hasIcon ? AppDimensions.padding * 2 : 0.0), + Text( + this.label, + style: TextStyle( + fontSize: 8 + AppDimensions.ratio * 3, + fontWeight: FontWeight.w700, + ), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/Widgets/Buttons/BackIcon.dart b/lib/Widgets/Buttons/BackIcon.dart new file mode 100644 index 0000000..447f387 --- /dev/null +++ b/lib/Widgets/Buttons/BackIcon.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_icons/flutter_icons.dart'; + +import 'package:flutter_uis/configs/App.dart'; + +class BackIconButton extends StatelessWidget { + BackIconButton({ + this.onPressed, + }); + + final VoidCallback onPressed; + + @override + Widget build(BuildContext context) { + return IconButton( + onPressed: () => + this.onPressed != null ? this.onPressed : Navigator.pop(context), + icon: Icon( + App.isLtr + ? MaterialCommunityIcons.chevron_left + : MaterialCommunityIcons.chevron_right, + ), + ); + } +} diff --git a/lib/Widgets/Buttons/Boxed.dart b/lib/Widgets/Buttons/Boxed.dart new file mode 100644 index 0000000..cd8e378 --- /dev/null +++ b/lib/Widgets/Buttons/Boxed.dart @@ -0,0 +1,66 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +class BoxedButton extends StatelessWidget { + BoxedButton({ + @required this.icon, + @required this.label, + @required this.onPressed, + + // Not Required + margin, + }) : this.margin = margin ?? EdgeInsets.all(AppDimensions.padding * 2); + + final String label; + final IconData icon; + final VoidCallback onPressed; + + final EdgeInsets margin; + + @override + Widget build(BuildContext context) { + return Container( + margin: this.margin, + constraints: BoxConstraints( + minWidth: AppDimensions.ratio * 25 + 40, + ), + decoration: BoxDecoration( + color: AppTheme.background, + borderRadius: BorderRadius.circular(8.0), + boxShadow: [ + BoxShadow( + blurRadius: 5, + offset: Offset(0, 2.0), + color: AppTheme.shadow, + ), + ], + ), + child: Material( + color: Colors.transparent, + child: InkWell( + onTap: this.onPressed, + borderRadius: BorderRadius.circular(8.0), + child: Padding( + padding: EdgeInsets.all(AppDimensions.padding * 2), + child: Column( + children: [ + Icon( + this.icon, + size: TextStyles.heading3.fontSize, + ), + SizedBox(height: AppDimensions.padding), + Text( + this.label, + style: TextStyles.body37, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/Widgets/Header/Header.dart b/lib/Widgets/Header/Header.dart new file mode 100644 index 0000000..c61944e --- /dev/null +++ b/lib/Widgets/Header/Header.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; +import 'package:flutter_uis/configs/App.dart'; + +import 'package:flutter_uis/Utils.dart'; + +import 'package:flutter_uis/widgets/Buttons/BackIcon.dart'; + +import 'TestKeys.dart'; + +class Header extends StatelessWidget { + Header({ + this.label, + this.enableSafePadding = true, + }); + + final String label; + final bool enableSafePadding; + + @override + Widget build(BuildContext context) { + return Container( + padding: this.enableSafePadding + ? Utils.safePaddingUnit(context, "top") + : EdgeInsets.zero, + width: double.infinity, + decoration: BoxDecoration( + color: AppTheme.background, + boxShadow: [ + BoxShadow( + blurRadius: 8, + color: AppTheme.lightShadow, + ) + ], + ), + child: Material( + color: Colors.transparent, + child: Row( + children: [ + Container( + key: Key(HeaderWidgetKey.backButton), + child: BackIconButton(), + ), + Container( + padding: EdgeInsets.all(AppDimensions.padding * 2), + child: Text( + App.translate(this.label, context), + style: TextStyles.heading46, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/Widgets/Header/StackFade.dart b/lib/Widgets/Header/StackFade.dart new file mode 100644 index 0000000..5ec9d20 --- /dev/null +++ b/lib/Widgets/Header/StackFade.dart @@ -0,0 +1,73 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +import 'TestKeys.dart'; + +class StackFadeHeader extends StatelessWidget { + StackFadeHeader({ + this.children, + @required this.onTap, + this.disableStack = false, + this.mainAxisAlignment = MainAxisAlignment.start, + }); + + final bool disableStack; + final List children; + final void Function(BuildContext) onTap; + final MainAxisAlignment mainAxisAlignment; + + @override + Widget build(BuildContext context) { + final List toRender = [ + InkResponse( + key: Key(HeaderWidgetKey.backButton), + onTap: () => this.onTap(context), + child: Padding( + padding: EdgeInsets.all(AppDimensions.padding * 2), + child: Icon( + Icons.chevron_left, + ), + ), + ), + ]; + if (this.children != null) { + toRender.addAll(this.children); + } + + Widget child = Material( + color: Colors.transparent, + child: Ink( + padding: EdgeInsets.only( + top: MediaQuery.of(context).padding.top, + ), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + AppTheme.background, + AppTheme.background.withOpacity(0.01), + ], + ), + ), + child: Row( + mainAxisAlignment: this.mainAxisAlignment, + children: toRender, + ), + ), + ); + + if (disableStack) { + return child; + } + + return Positioned( + top: 0, + left: 0, + right: 0, + child: child, + ); + } +} diff --git a/lib/Widgets/Header/TestKeys.dart b/lib/Widgets/Header/TestKeys.dart new file mode 100644 index 0000000..b7abc7b --- /dev/null +++ b/lib/Widgets/Header/TestKeys.dart @@ -0,0 +1,5 @@ +const String scope = "HeaderWidget"; + +abstract class HeaderWidgetKey { + static final String backButton = "$scope/drawerButton"; +} diff --git a/lib/Widgets/Screen/messages/keys.dart b/lib/Widgets/Screen/messages/keys.dart index 8aa1bce..45e623f 100644 --- a/lib/Widgets/Screen/messages/keys.dart +++ b/lib/Widgets/Screen/messages/keys.dart @@ -3,14 +3,14 @@ const scope = 'ScreenWidget'; abstract class ScreenWidgetMessages { - static String smTitle = '$scope/smTitle'; - static String smSelectLanguage = '$scope/smSelectLanguage'; - static String smEnglish = '$scope/smEnglish'; - static String smChinese = '$scope/smChinese'; - static String smArabic = '$scope/smArabic'; - static String smSystemDefault = '$scope/smSystemDefault'; - static String smSelectTheme = '$scope/smSelectTheme'; - static String smSytemTheme = '$scope/smSytemTheme'; - static String smLightTheme = '$scope/smLightTheme'; - static String smDarkTheme = '$scope/smDarkTheme'; + static String smTitle = '$scope/smTitle'; + static String smSelectLanguage = '$scope/smSelectLanguage'; + static String smEnglish = '$scope/smEnglish'; + static String smChinese = '$scope/smChinese'; + static String smArabic = '$scope/smArabic'; + static String smSystemDefault = '$scope/smSystemDefault'; + static String smSelectTheme = '$scope/smSelectTheme'; + static String smSytemTheme = '$scope/smSytemTheme'; + static String smLightTheme = '$scope/smLightTheme'; + static String smDarkTheme = '$scope/smDarkTheme'; } diff --git a/lib/Widgets/ScreenReveals/AvatarWithPunchHole.dart b/lib/Widgets/ScreenReveals/AvatarWithPunchHole.dart new file mode 100644 index 0000000..63d94b2 --- /dev/null +++ b/lib/Widgets/ScreenReveals/AvatarWithPunchHole.dart @@ -0,0 +1,179 @@ +import 'package:flutter/material.dart'; +import 'package:simple_animations/simple_animations.dart'; +import 'package:dotted_border/dotted_border.dart'; +import 'package:supercharged/supercharged.dart'; + +import 'package:flutter_uis/configs/AppTheme.dart'; +import 'package:flutter_uis/UI.dart'; + +import 'AvatarWithPunchHoleClipper.dart'; + +class ScreenRevealAvatarWithPunchHole extends StatefulWidget { + ScreenRevealAvatarWithPunchHole({ + @required this.avatar, + @required this.avatarRadius, + }); + + final String avatar; + final double avatarRadius; + + @override + _ScreenRevealAvatarWithPunchHoleState createState() => + _ScreenRevealAvatarWithPunchHoleState(); +} + +class _ScreenRevealAvatarWithPunchHoleState + extends State { + bool hide = false; + + @override + void initState() { + this.initAsync(); + super.initState(); + } + + Future initAsync() async { + await 1400.milliseconds.delay; + + if (!this.mounted) { + return; + } + this.setState(() { + this.hide = true; + }); + } + + @override + Widget build(BuildContext context) { + final sliceHeight = UI.height / 2; + + return CustomAnimation( + tween: 0.0.tweenTo(1.0), + duration: 900.milliseconds, + control: + this.hide ? CustomAnimationControl.PLAY : CustomAnimationControl.STOP, + builder: (context, _, animation) { + return Stack( + children: [ + Positioned( + left: 0, + right: 0, + top: animation * -sliceHeight, + child: ClipPath( + clipper: AvatarWithPunchHoleClipper( + holeRadius: this.widget.avatarRadius, + position: "bottom", + ), + child: Container( + height: sliceHeight, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + AppTheme.primary, + Colors.purple, + ], + ), + ), + ), + ), + ), + Positioned( + left: 0, + right: 0, + bottom: animation * -sliceHeight, + child: ClipPath( + clipper: AvatarWithPunchHoleClipper( + holeRadius: this.widget.avatarRadius, + position: "top", + ), + child: Container( + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topCenter, + end: Alignment.bottomCenter, + colors: [ + Colors.purple, + AppTheme.primary, + ], + ), + ), + height: sliceHeight, + ), + ), + ), + Center( + child: CustomAnimation( + tween: 0.0.tweenTo(1.0), + duration: 700.milliseconds, + curve: Curves.slowMiddle, + control: this.hide + ? CustomAnimationControl.STOP + : CustomAnimationControl.MIRROR, + child: Container( + width: this.widget.avatarRadius, + height: this.widget.avatarRadius, + decoration: BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + border: Border.all(width: 13, style: BorderStyle.solid), + boxShadow: [ + BoxShadow( + color: Colors.yellow, + blurRadius: 10, + spreadRadius: -23.0, + ), + ], + ), + child: ClipOval( + child: Image.asset(this.widget.avatar), + ), + ), + builder: (context, child, value) { + double scale = 1 + value * .2; + if (hide) { + scale = (1 - (animation * 1.5)).clamp(0.0, 3.0); + } + return Transform( + transform: Matrix4.identity()..scale(scale, scale), + origin: Offset( + this.widget.avatarRadius / 2, + this.widget.avatarRadius / 2, + ), + child: Opacity( + opacity: (1 - (animation * 1.5)).clamp(0.0, 1.0), + child: Stack( + children: [ + child, + Positioned( + top: 6, + left: 6, + child: Transform.rotate( + angle: value * 0.45, + child: DottedBorder( + strokeWidth: 5, + color: Colors.white, + dashPattern: [4, 12], + strokeCap: StrokeCap.round, + borderType: BorderType.Circle, + child: Container( + width: this.widget.avatarRadius - 16, + height: this.widget.avatarRadius - 16, + ), + ), + ), + ), + ], + ), + ), + ); + }, + ), + ) + ], + ); + }, + ); + } +} diff --git a/lib/Widgets/ScreenReveals/AvatarWithPunchHoleClipper.dart b/lib/Widgets/ScreenReveals/AvatarWithPunchHoleClipper.dart new file mode 100644 index 0000000..5d52e4c --- /dev/null +++ b/lib/Widgets/ScreenReveals/AvatarWithPunchHoleClipper.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; + +class AvatarWithPunchHoleClipper extends CustomClipper { + AvatarWithPunchHoleClipper({ + @required this.holeRadius, + @required this.position, + }); + final double holeRadius; + final String position; + + @override + Path getClip(Size size) { + final x = size.width / 2; + final xRadius = holeRadius / 2; + + final path = Path() + ..moveTo(0, 0) + ..lineTo(x - xRadius, 0.0); + if (position == "top") { + path + ..arcToPoint( + Offset(x + xRadius, 0.0), + clockwise: false, + radius: Radius.circular(1), + ); + } + path + ..lineTo(size.width, 0.0) + ..lineTo(size.width, size.height) + ..lineTo(x + xRadius, size.height); + if (position == "bottom") { + path + ..arcToPoint( + Offset(x - xRadius, size.height), + clockwise: false, + radius: Radius.circular(1), + ); + } + + path.lineTo(0.0, size.height); + + path.close(); + return path; + } + + @override + bool shouldReclip(AvatarWithPunchHoleClipper oldClipper) => true; +} diff --git a/lib/Widgets/SnackBars/Base.dart b/lib/Widgets/SnackBars/Base.dart new file mode 100644 index 0000000..2256c5b --- /dev/null +++ b/lib/Widgets/SnackBars/Base.dart @@ -0,0 +1,53 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; + +void showSnackBarBase({ + @required BuildContext context, + Widget child, + String text, + double width, +}) { + final snackbar = SnackBar( + elevation: 0.0, + margin: EdgeInsets.zero, + padding: EdgeInsets.zero, + behavior: SnackBarBehavior.floating, + backgroundColor: Colors.transparent, + content: FittedBox( + fit: BoxFit.scaleDown, + child: Container( + width: width, + margin: EdgeInsets.symmetric( + horizontal: AppDimensions.padding * 2, + ), + padding: EdgeInsets.symmetric( + vertical: AppDimensions.padding * 2, + horizontal: AppDimensions.padding * 2, + ), + decoration: BoxDecoration( + color: AppTheme.background, + borderRadius: BorderRadius.circular(6.0), + boxShadow: [ + BoxShadow( + blurRadius: 10, + color: AppTheme.shadow, + offset: Offset(0.0, 4.0), + ), + ], + ), + child: child ?? + Text( + text, + style: TextStyles.body26.copyWith( + color: AppTheme.text, + ), + ), + ), + ), + ); + + Scaffold.of(context).showSnackBar(snackbar); +} diff --git a/lib/Widgets/SnackBars/snackbars.dart b/lib/Widgets/SnackBars/snackbars.dart new file mode 100644 index 0000000..60344d2 --- /dev/null +++ b/lib/Widgets/SnackBars/snackbars.dart @@ -0,0 +1 @@ +export 'Base.dart'; diff --git a/lib/screens/AboutDeveloper/AboutDeveloper.dart b/lib/screens/AboutDeveloper/AboutDeveloper.dart index 115398d..d0fcd8e 100644 --- a/lib/screens/AboutDeveloper/AboutDeveloper.dart +++ b/lib/screens/AboutDeveloper/AboutDeveloper.dart @@ -1,12 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:flutter_uis/configs/Theme.dart' as theme; -import 'package:flutter_uis/Utils.dart'; - +import 'package:flutter_uis/widgets/ScreenReveals/AvatarWithPunchHole.dart'; import 'package:flutter_uis/widgets/Screen/Screen.dart'; -import 'widgets/AboutDeveloperContent.dart'; -import 'widgets/AboutDeveloperAvatar.dart'; +import 'widgets/AboutDeveloperBody.dart'; + import 'Dimensions.dart'; class AboutDeveloperScreen extends StatelessWidget { @@ -15,20 +13,19 @@ class AboutDeveloperScreen extends StatelessWidget { Dimensions.init(context); return Screen( - scaffoldBackgroundColor: theme.darkBackground, - child: SingleChildScrollView( - child: Stack( - children: [ - AboutDeveloperContent(), - AboutDeveloperAvatar(), - Positioned( - child: Padding( - padding: Utils.safePaddingUnit(context, "all"), - child: BackButton(), - ), + child: Stack( + fit: StackFit.expand, + children: [ + Positioned.fill( + child: AboutDeveloperBody(), + ), + Positioned.fill( + child: ScreenRevealAvatarWithPunchHole( + avatar: "assets/users/hamza.jpg", + avatarRadius: Dimensions.avatarRadius, ), - ], - ), + ), + ], ), ); } diff --git a/lib/screens/AboutDeveloper/Dimensions.dart b/lib/screens/AboutDeveloper/Dimensions.dart index 2a38dc5..c400536 100644 --- a/lib/screens/AboutDeveloper/Dimensions.dart +++ b/lib/screens/AboutDeveloper/Dimensions.dart @@ -2,28 +2,19 @@ import 'package:flutter/material.dart'; import 'package:flutter_uis/configs/AppDimensions.dart'; import 'package:flutter_uis/configs/App.dart'; -import 'package:flutter_uis/UI.dart'; class Dimensions { - static double redBackground; - static double avatarSize; + static double projectCardWidth; + static double projectCardHeight; + + static double avatarRadius; static init(BuildContext context) { App.init(context); - redBackground = AppDimensions.ratio * 60; - avatarSize = AppDimensions.ratio * 60; + projectCardHeight = 80 + AppDimensions.ratio * 60; + projectCardWidth = 150 + AppDimensions.ratio * 80; - if (UI.md && UI.height > 480) { - avatarSize = AppDimensions.padding * 17; - redBackground = AppDimensions.ratio * 80; - } - if (UI.lg && UI.height > 600) { - avatarSize = AppDimensions.padding * 20; - redBackground = AppDimensions.ratio * 120; - } - if (UI.xlg && UI.height > 800) { - redBackground = AppDimensions.ratio * 160; - } + avatarRadius = 150 + AppDimensions.ratio * 60; } } diff --git a/lib/screens/AboutDeveloper/TestKeys.dart b/lib/screens/AboutDeveloper/TestKeys.dart new file mode 100644 index 0000000..b2aa156 --- /dev/null +++ b/lib/screens/AboutDeveloper/TestKeys.dart @@ -0,0 +1,5 @@ +const String scope = "AboutDeveloperScreen"; + +abstract class AboutDeveloperTestKeys { + static final String rootScroll = "$scope/rootScroll"; +} diff --git a/lib/screens/AboutDeveloper/data.dart b/lib/screens/AboutDeveloper/data.dart index 6c759ab..31b7fd3 100644 --- a/lib/screens/AboutDeveloper/data.dart +++ b/lib/screens/AboutDeveloper/data.dart @@ -1,18 +1,26 @@ import 'package:flutter_icons/flutter_icons.dart'; +import 'package:flutter_uis/statics/Links.dart'; + import 'messages/keys.dart'; +final devDescription = [ + AboutDeveloperScreenMessages.desc1, + AboutDeveloperScreenMessages.desc2, + AboutDeveloperScreenMessages.desc3, + AboutDeveloperScreenMessages.desc4, +]; + final skills = [ - "HTML", - "CSS", - "Pug", - "Sass", + "HTML/CSS", + "Pug(Jade)", + "Sass/Less", "Javascript", "JQuery", "React JS", "React SSR", "Redux", - "Redux-saga", + "Redux Saga", "React Native", "Dart", "Flutter", @@ -26,51 +34,112 @@ final skills = [ "Socket.IO", "Go lang", "Dart Server", + "Automation Scripting", ]; final contacts = [ { "platform": "facebook", - "username": "hackerhgl", + "label": "hackerhgl", "icon": MaterialCommunityIcons.facebook, }, { "platform": "linkedin", - "username": "hackerhgl", + "label": "hackerhgl", "icon": MaterialCommunityIcons.linkedin, }, + { + "platform": "gmail", + "label": "hamza.iqdev@gmail.com", + "icon": MaterialCommunityIcons.gmail, + "url": "mailto:hamza.iqdev@gmail.com", + }, { "platform": "skype", - "username": "hamza.iqbal.jawaid.iqbal", - "icon": MaterialCommunityIcons.skype_business + "label": "hamza.iqbal.jawaid.iqbal", + "icon": MaterialCommunityIcons.skype_business, + "url": "https://join.skype.com/invite/XGRknTea0kKf", }, { "platform": "whatsapp", - "username": "+923148155304", + "label": "+923148155304", "icon": MaterialCommunityIcons.whatsapp }, ]; final showSupport = [ { - "text": AboutDeveloperScreenMessages.stepGit, - "link": "https://github.com/hackerhgl/flutter-ui-designs", + "label": AboutDeveloperScreenMessages.likeProject1, + "icon": MaterialCommunityIcons.github_face, + "link": MyLinks.invmovieconcept1Github, }, { - "text": AboutDeveloperScreenMessages.stepStore, - "link": - "https://play.google.com/store/apps/details?id=com.onemdev.flutter_ui_challenges", + "platform": "Play Store", + "label": AboutDeveloperScreenMessages.likeProject2, + "icon": MaterialCommunityIcons.google_play, + "link": MyLinks.invmovieconcept1GooglePlay, }, { - "text": AboutDeveloperScreenMessages.stepEndorse, + "platform": "Linkedin", + "label": AboutDeveloperScreenMessages.likeProject3, + "icon": MaterialCommunityIcons.linkedin, "link": "https://www.linkedin.com/in/hackerhgl/", }, { - "text": AboutDeveloperScreenMessages.stepFiver, + "platform": "Fiverr", + "label": AboutDeveloperScreenMessages.likeProject4, + "icon": MaterialCommunityIcons.heart_outline, "link": "https://www.fiverr.com/hackerhgl", }, +]; + +final moreProjects = [ + { + "label": "Flutter Movie Concept UI", + "desc": AboutDeveloperScreenMessages.projectFUD, + "links": [ + { + "label": "Google Play", + "icon": MaterialCommunityIcons.google_play, + "url": MyLinks.invmovieconcept1GooglePlay, + }, + { + "label": "Github", + "icon": MaterialCommunityIcons.github_face, + "url": MyLinks.invmovieconcept1GooglePlay, + }, + ], + }, + { + "label": "React Native Loop", + "desc": AboutDeveloperScreenMessages.projectRNL, + "links": [ + { + "label": "Google Play", + "icon": MaterialCommunityIcons.google_play, + "url": MyLinks.rnLoopGooglePlay, + }, + { + "label": "Github", + "icon": MaterialCommunityIcons.github_face, + "url": MyLinks.invmovieconcept1GooglePlay, + }, + ], + }, { - "text": AboutDeveloperScreenMessages.stepFreelancer, - "link": "https://www.freelancer.com/u/hackerhgl", + "label": "Hackerhgl CV", + "desc": AboutDeveloperScreenMessages.projectHCV, + "links": [ + { + "label": "Website", + "icon": MaterialCommunityIcons.web, + "url": MyLinks.hackerhglCVWeb, + }, + { + "label": "Github", + "icon": MaterialCommunityIcons.github_face, + "url": MyLinks.hackerhglCVGithub, + }, + ], }, ]; diff --git a/lib/screens/AboutDeveloper/messages/keys.dart b/lib/screens/AboutDeveloper/messages/keys.dart index de0726c..5f45f49 100644 --- a/lib/screens/AboutDeveloper/messages/keys.dart +++ b/lib/screens/AboutDeveloper/messages/keys.dart @@ -4,16 +4,28 @@ const scope = 'AboutDeveloperScreen'; abstract class AboutDeveloperScreenMessages { static String title = '$scope/title'; - static String job = '$scope/job'; - static String description = '$scope/description'; + static String desc1 = '$scope/desc1'; + static String desc2 = '$scope/desc2'; + static String desc3 = '$scope/desc3'; + static String desc4 = '$scope/desc4'; static String skillSet = '$scope/skillSet'; - static String letsChat = '$scope/letsChat'; - static String note = '$scope/note'; - static String support = '$scope/support'; - static String supportDescription = '$scope/supportDescription'; - static String stepGit = '$scope/stepGit'; - static String stepStore = '$scope/stepStore'; - static String stepEndorse = '$scope/stepEndorse'; - static String stepFiver = '$scope/stepFiver'; - static String stepFreelancer = '$scope/stepFreelancer'; + static String contacts = '$scope/contacts'; + static String contactsDesc = '$scope/contactsDesc'; + static String likeProject = '$scope/likeProject'; + static String likeProjectDesc = '$scope/likeProjectDesc'; + static String moreProjects = '$scope/moreProjects'; + static String projectFUD = '$scope/projectFUD'; + static String projectRNL = '$scope/projectRNL'; + static String projectHCV = '$scope/projectHCV'; + static String likeProject1 = '$scope/likeProject1'; + static String likeProject2 = '$scope/likeProject2'; + static String likeProject3 = '$scope/likeProject3'; + static String likeProject4 = '$scope/likeProject4'; + static String share = '$scope/share'; + static String copy = '$scope/copy'; + static String open = '$scope/open'; + static String linkCopied = '$scope/linkCopied'; + static String or = '$scope/or'; + static String developers = '$scope/developers'; + static String profile = '$scope/profile'; } diff --git a/lib/screens/AboutDeveloper/messages/strings.dart b/lib/screens/AboutDeveloper/messages/strings.dart index 4c40b13..a67d3c3 100644 --- a/lib/screens/AboutDeveloper/messages/strings.dart +++ b/lib/screens/AboutDeveloper/messages/strings.dart @@ -3,22 +3,49 @@ import 'dart:isolate'; const String scope = 'AboutDeveloperScreen'; const Map strings = { - '$scope/title': 'About App', - '$scope/job': 'Full stack web and app developer', - '$scope/description': - 'Hi, I am full stack developer who has been developing end to end smart solutions for more than three years. I am a committed individual who is highly efficient and has excellent organisational skills to develop applications. I help throughout the life cycle of an assigned project with my experience and ensure quality solutions that meet objectives. With all that being said, I am very proud of the work I do, and will stop at nothing to make sure the job is done to 100% satisfaction.', - '$scope/skillSet': 'My skill set', - '$scope/letsChat': "Let's Chat !", - '$scope/note': - "NOTE: These contact links are not any kind of flutter helpline. I shared my contacts only for buisness related inquiries.\n\n For any help or answer follow docs and post your query on stackoverflow and facebook community group.", - '$scope/support': 'Show Support', - '$scope/supportDescription': - 'If you like the project and want to appreciate my effort. Then click any of these links below and perform the action.', - '$scope/stepGit': "Star this github repository", - '$scope/stepStore': "Rate this app on playstore", - '$scope/stepEndorse': "Endorse my skills on my Linkedin", - '$scope/stepFiver': "Favorite my gigs on fiver", - '$scope/stepFreelancer': "Give a recommendation on freelancer", + // Title + '$scope/title': 'About Developer', + + '$scope/desc1': + "Hi, I am full stack developer who has been developing end to end smart solutions for more than three years.", + '$scope/desc2': + "I am a committed individual who is highly efficient and has excellent organizational skills to develop applications.", + '$scope/desc3': + "I help throughout the life cycle of an assigned project with my experience and ensure quality solutions that meet objectives.", + '$scope/desc4': + "With all that being said, I am very proud of the work I do, and will stop at nothing to make sure the job is done to 100% satisfaction.", + + '$scope/skillSet': 'My Skill Set', + '$scope/contacts': 'My Contacts', + '$scope/contactsDesc': + "I've shared my contacts strictly for business related queries ONLY.\nFor any Flutter related help post your query on Flutter Github, Flutter sub reddit & Flutter facebook groups", + '$scope/likeProject': 'Like The Project?', + '$scope/likeProjectDesc': + "Show support by performing any action listed below.", + '$scope/moreProjects': 'Explore More Projects', + + // Projects + '$scope/projectFUD': + "Simple implementation of complex UI designs and animations. In this project you will experience my journey of experimenting to find ideal flutter architecture.", + '$scope/projectRNL': + "Simple and elegant clone \"Loop game\" in react native with just simple setState & contexts for shared state.", + '$scope/projectHCV': + "Simple crafting of my creativity and imagination into web version of CV/Resume with the help of Pug/Sass/JS. Which highlights my career journey", + + // actions + '$scope/likeProject1': "Star this repository", + '$scope/likeProject2': "Review this app on", + '$scope/likeProject3': "Endorse my skills on", + '$scope/likeProject4': "Favorite my gigs on", + + // singulars + '$scope/share': 'Share', + '$scope/copy': 'Copy', + '$scope/open': 'Open', + '$scope/linkCopied': 'link copied', + '$scope/or': 'or', + '$scope/developers': "developer\'s", + '$scope/profile': 'profile', }; main(List args, SendPort port) { diff --git a/lib/screens/AboutDeveloper/widgets/AboutDeveloperAvatar.dart b/lib/screens/AboutDeveloper/widgets/AboutDeveloperAvatar.dart deleted file mode 100644 index 4fdbe92..0000000 --- a/lib/screens/AboutDeveloper/widgets/AboutDeveloperAvatar.dart +++ /dev/null @@ -1,56 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_uis/configs/AppDimensions.dart'; -import 'package:flutter_uis/configs/Theme.dart' as theme; - -import '../Dimensions.dart'; - -class AboutDeveloperAvatar extends StatelessWidget { - @override - Widget build(BuildContext context) { - final borderWidth = AppDimensions.ratio * 8; - return Positioned( - left: 0, - right: 0, - top: (Dimensions.redBackground - - (Dimensions.avatarSize / 2) - - borderWidth / 2), - child: Container( - child: Stack( - children: [ - Center( - child: ClipRRect( - borderRadius: BorderRadius.circular(Dimensions.avatarSize), - child: Container( - width: Dimensions.avatarSize + borderWidth, - height: Dimensions.avatarSize + borderWidth, - child: Column( - children: [ - Flexible(child: Container(color: theme.darkBackground)), - Flexible(child: Container(color: theme.primary)), - ], - ), - ), - ), - ), - Positioned( - top: borderWidth / 2, - left: 0, - right: 0, - child: Center( - child: Container( - width: Dimensions.avatarSize, - child: CircleAvatar( - backgroundColor: theme.primary, - radius: Dimensions.avatarSize / 2, - backgroundImage: AssetImage("assets/user/hamza.jpg"), - ), - ), - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/screens/AboutDeveloper/widgets/AboutDeveloperBody.dart b/lib/screens/AboutDeveloper/widgets/AboutDeveloperBody.dart index b487920..cad6f4b 100644 --- a/lib/screens/AboutDeveloper/widgets/AboutDeveloperBody.dart +++ b/lib/screens/AboutDeveloper/widgets/AboutDeveloperBody.dart @@ -1,218 +1,136 @@ import 'package:flutter/material.dart'; -import 'package:flutter_uis/configs/Theme.dart' as theme; import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/AppTheme.dart'; import 'package:flutter_uis/configs/App.dart'; + import 'package:flutter_uis/Utils.dart'; -import 'AboutDeveloperShowSupport.dart'; +import 'package:flutter_uis/widgets/AboutUser/AboutUserContactButton.dart'; +import 'package:flutter_uis/widgets/AboutUser/AboutUserJobTitle.dart'; +import 'package:flutter_uis/widgets/AboutUser/AboutUserHeading.dart'; +import 'package:flutter_uis/widgets/AboutUser/AboutUserSkills.dart'; +import 'package:flutter_uis/widgets/AboutUser/AboutUserName.dart'; +import 'package:flutter_uis/widgets/AboutUser/AboutUserBio.dart'; + +import 'package:flutter_uis/widgets/Buttons/Alpha.dart'; +import 'package:flutter_uis/widgets/Header/Header.dart'; +import 'package:flutter_uis/widgets/Banners/Alpha.dart'; + +import 'AboutDeveloperMoreProjects.dart'; + import '../messages/keys.dart'; import '../data.dart' as data; import '../Dimensions.dart'; +import '../TestKeys.dart'; class AboutDeveloperBody extends StatelessWidget { + Widget mapSupportButton( + BuildContext context, + Map obj, + ) { + final buttonMargin = EdgeInsets.only( + top: AppDimensions.padding * 2, + left: AppDimensions.padding * 2, + right: AppDimensions.padding * 2, + ); + final prefix = obj["platform"]; + + String label = obj["label"].toString(); + + if (prefix != null) { + label = App.translate(label) + " " + prefix; + } + + return AlphaButton( + icon: obj["icon"], + margin: buttonMargin, + label: (App.translate(label, context)).toUpperCase(), + onTap: () => Utils.launchUrl(obj["link"]), + ); + } + @override Widget build(BuildContext context) { - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Container(height: Dimensions.avatarSize / 2), - Padding( - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding * 3, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.title), - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.w600, + return Align( + child: Container( + width: AppDimensions.maxContainerWidth, + child: ListView( + key: Key(AboutDeveloperTestKeys.rootScroll), + padding: EdgeInsets.zero, + children: [ + Header( + label: AboutDeveloperScreenMessages.title, ), - ), - ), - Padding( - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.description), - ), - ), - Padding( - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding * 3, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.skillSet), - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.w600, + SizedBox(height: AppDimensions.padding * 1), + AboutUserName(name: "Hamza Iqbal"), + AboutUserJobTitle( + label: "Full Stack, React Native & Flutter Developer", ), - ), - ), - Padding( - padding: EdgeInsets.only( - top: AppDimensions.padding, - ), - child: Wrap( - children: data.skills + AboutUserBio(points: data.devDescription), + SizedBox(height: AppDimensions.padding * 3), + Container(height: 1, color: AppTheme.subText3.withOpacity(0.1)), + SizedBox(height: AppDimensions.padding * 2), + AboutUserHeading( + label: "skills", + ), + SizedBox(height: AppDimensions.padding * 1), + AboutUserSkills( + skills: data.skills, + ), + SizedBox(height: AppDimensions.padding * 2), + Container(height: 1, color: AppTheme.subText3.withOpacity(0.1)), + SizedBox(height: AppDimensions.padding * 2), + AboutUserHeading(label: "contacts"), + SizedBox(height: AppDimensions.padding * 2), + AlphaBanner( + text: App.translate( + AboutDeveloperScreenMessages.contactsDesc, + context, + ), + ), + SizedBox(height: AppDimensions.padding * 1), + ...data.contacts .map( - (skill) => Container( - margin: EdgeInsets.all(AppDimensions.padding * 1), - padding: EdgeInsets.symmetric( - vertical: AppDimensions.padding, - horizontal: AppDimensions.padding * 2, - ), - decoration: BoxDecoration( - color: theme.darkBackground, - borderRadius: BorderRadius.circular(4.0), - border: Border.all( - width: 1, - color: theme.primary, - ), - boxShadow: [ - BoxShadow( - color: theme.primary.withOpacity(0.5), - blurRadius: 3, - ), - ], - ), - child: Text( - skill, - style: TextStyle( - fontWeight: FontWeight.w600, - ), - ), + (contact) => AboutUserContactButton( + url: contact["url"], + icon: contact["icon"], + label: contact["label"], + initContext: Dimensions.init, + platform: contact["platform"], ), ) .toList(), - ), - ), - Padding( - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding * 3, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.letsChat), - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.w600, + SizedBox(height: AppDimensions.padding * 3), + Container(height: 1, color: AppTheme.subText3.withOpacity(0.1)), + SizedBox(height: AppDimensions.padding * 2), + AboutUserHeading( + label: "likeProject", ), - ), - ), - Container( - decoration: BoxDecoration(), - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding, - bottom: AppDimensions.padding * 2, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.note), - style: TextStyle( - fontSize: 16, - fontWeight: FontWeight.w600, - color: Colors.white.withOpacity(0.5), + SizedBox(height: AppDimensions.padding * 2), + AlphaBanner( + text: App.translate( + AboutDeveloperScreenMessages.likeProjectDesc, + context, + ), ), - ), - ), - Padding( - padding: EdgeInsets.symmetric( - horizontal: AppDimensions.padding, - ), - child: Column( - children: data.contacts + SizedBox(height: AppDimensions.padding * 1), + ...data.showSupport .map( - (contact) => Padding( - padding: - EdgeInsets.symmetric(vertical: AppDimensions.padding), - child: OutlineButton( - onPressed: () async { - final check = await Utils.launchUrl(Utils.socialLink( - contact["username"], - contact["platform"], - )); - if (!check) { - // this.screenKey.currentState.showPopUp(); - } - }, - padding: EdgeInsets.symmetric( - vertical: AppDimensions.padding * 1.2, - ), - color: theme.primary, - textColor: theme.primary, - highlightedBorderColor: theme.primary, - borderSide: BorderSide( - color: theme.primary.withOpacity(0.7), - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.symmetric( - horizontal: AppDimensions.padding, - ), - child: Icon( - contact["icon"], - color: Colors.white, - ), - ), - Text( - (["facebook", "instagram", "linkedin"] - .contains(contact["platform"]) - ? "@" - : "") + - contact["username"], - style: TextStyle( - color: Colors.white, - ), - ), - ], - ), - ), - ), + (obj) => this.mapSupportButton(context, obj), ) .toList(), - ), - ), - Padding( - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding * 3, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.support), - style: TextStyle( - fontSize: 22, - fontWeight: FontWeight.w600, - ), - ), - ), - Padding( - padding: EdgeInsets.only( - left: AppDimensions.padding, - right: AppDimensions.padding, - top: AppDimensions.padding, - ), - child: Text( - App.translate(AboutDeveloperScreenMessages.supportDescription), - style: TextStyle( - fontSize: 8 + AppDimensions.ratio * 4, - color: Colors.white.withOpacity(0.55), + SizedBox(height: AppDimensions.padding * 3), + Container(height: 1, color: AppTheme.subText3.withOpacity(0.1)), + SizedBox(height: AppDimensions.padding * 2), + AboutUserHeading( + label: "moreProjects", ), - ), + SizedBox(height: AppDimensions.padding * 1), + AboutDeveloperMoreProjects(), + ], ), - AboutDeveloperShowSupport(), - ], + ), ); } } diff --git a/lib/screens/AboutDeveloper/widgets/AboutDeveloperContent.dart b/lib/screens/AboutDeveloper/widgets/AboutDeveloperContent.dart deleted file mode 100644 index fe22c5f..0000000 --- a/lib/screens/AboutDeveloper/widgets/AboutDeveloperContent.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_uis/configs/Theme.dart' as theme; -import 'package:flutter_uis/configs/AppDimensions.dart'; - -import 'AboutDeveloperBody.dart'; -import '../Dimensions.dart'; - -class AboutDeveloperContent extends StatelessWidget { - @override - Widget build(BuildContext context) { - final textStyle = Theme.of(context).textTheme.bodyText1.copyWith( - color: Colors.white, - ); - - return Column( - children: [ - Container( - height: Dimensions.redBackground, - decoration: BoxDecoration( - color: theme.primary, - boxShadow: [ - BoxShadow( - color: theme.primary.withOpacity(0.4), - blurRadius: 10, - spreadRadius: 3, - ), - ], - ), - ), - Container( - padding: EdgeInsets.all(AppDimensions.padding * 2), - width: double.infinity, - constraints: BoxConstraints( - maxWidth: AppDimensions.maxContainerWidth, - ), - child: DefaultTextStyle( - style: textStyle, - // child: Container(), - child: AboutDeveloperBody(), - ), - ) - ], - ); - } -} diff --git a/lib/screens/AboutDeveloper/widgets/AboutDeveloperMoreProjects.dart b/lib/screens/AboutDeveloper/widgets/AboutDeveloperMoreProjects.dart new file mode 100644 index 0000000..56a6399 --- /dev/null +++ b/lib/screens/AboutDeveloper/widgets/AboutDeveloperMoreProjects.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_uis/Utils.dart'; + +import 'package:flutter_uis/configs/AppDimensions.dart'; +import 'package:flutter_uis/configs/TextStyles.dart'; +import 'package:flutter_uis/configs/App.dart'; + +import '../data.dart' as data; +import '../Dimensions.dart'; + +class AboutDeveloperMoreProjects extends StatelessWidget { + @override + Widget build(BuildContext context) { + final borderRadius = BorderRadius.circular(4.0); + + return Container( + height: Dimensions.projectCardHeight, + width: Dimensions.projectCardWidth, + child: ListView.builder( + padding: EdgeInsets.all( + AppDimensions.padding * 1, + ), + scrollDirection: Axis.horizontal, + itemCount: data.moreProjects.length, + itemBuilder: (context, index) { + final project = data.moreProjects[index]; + final List links = project["links"]; + + return Container( + width: Dimensions.projectCardWidth, + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.topLeft, + end: Alignment.bottomRight, + colors: [ + Colors.purple, + Theme.of(context).primaryColor, + ], + ), + borderRadius: BorderRadius.circular(6.0), + ), + padding: EdgeInsets.all( + AppDimensions.padding * 2, + ), + margin: EdgeInsets.all( + AppDimensions.padding * 1, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + project["label"], + style: TextStyles.heading5.copyWith( + color: Colors.white, + ), + ), + Text( + App.translate(project["desc"], context), + style: TextStyles.body2.copyWith( + color: Colors.white.withOpacity(0.85), + ), + ), + Flexible(child: SizedBox(height: double.infinity)), + Row( + children: links + .map( + (link) => Container( + margin: EdgeInsets.only( + right: App.isLtr ? AppDimensions.padding * 2 : 0.0, + left: !App.isLtr ? AppDimensions.padding * 2 : 0.0, + ), + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.08), + border: Border.all( + width: 1, + color: Colors.white, + ), + borderRadius: borderRadius, + ), + child: Material( + color: Colors.transparent, + child: InkWell( + borderRadius: borderRadius, + onTap: () => Utils.launchUrl(link["url"]), + child: Padding( + padding: EdgeInsets.symmetric( + vertical: AppDimensions.padding, + horizontal: AppDimensions.padding * 2, + ), + child: Row( + children: [ + Icon( + link["icon"], + color: Colors.white, + size: TextStyles.body2.fontSize, + ), + SizedBox(width: AppDimensions.padding), + Text( + link["label"].toString(), + style: TextStyles.body2.copyWith( + color: Colors.white, + ), + ), + ], + ), + ), + ), + ), + ), + ) + .toList(), + ) + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/screens/AboutDeveloper/widgets/AboutDeveloperShowSupport.dart b/lib/screens/AboutDeveloper/widgets/AboutDeveloperShowSupport.dart deleted file mode 100644 index 5ec3f85..0000000 --- a/lib/screens/AboutDeveloper/widgets/AboutDeveloperShowSupport.dart +++ /dev/null @@ -1,37 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'package:flutter_uis/configs/AppDimensions.dart'; -import 'package:flutter_uis/configs/App.dart'; -import 'package:flutter_uis/Utils.dart'; - -import '../data.dart' as data; - -class AboutDeveloperShowSupport extends StatelessWidget { - @override - Widget build(BuildContext context) { - return Padding( - padding: EdgeInsets.only( - top: AppDimensions.padding * 2, - left: AppDimensions.padding * 1, - right: AppDimensions.padding * 1, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: data.showSupport - .map( - (support) => GestureDetector( - onTap: () => Utils.launchUrl(support["link"]), - child: Text( - "* ${App.translate(support["text"])}", - style: TextStyle( - height: 1 + AppDimensions.ratio * 0.5, - fontSize: 10 + AppDimensions.ratio * 5, - ), - ), - ), - ) - .toList(), - ), - ); - } -} diff --git a/lib/screens/Home/widgets/HomeBody.dart b/lib/screens/Home/widgets/HomeBody.dart index 359ce8a..d11874b 100644 --- a/lib/screens/Home/widgets/HomeBody.dart +++ b/lib/screens/Home/widgets/HomeBody.dart @@ -83,7 +83,7 @@ class HomeBody extends StatelessWidget { item["label"], context, ), - style: TextStyles.body17, + style: TextStyles.body16, ), ], ), diff --git a/lib/statics/Links.dart b/lib/statics/Links.dart new file mode 100644 index 0000000..ceda5ef --- /dev/null +++ b/lib/statics/Links.dart @@ -0,0 +1,26 @@ +abstract class MyLinks { + static final facebook = 'https://facebook.com/hackerhgl'; + static final twitter = 'https://twitter.com/hackerhgl'; + static final github = 'https://github.com/hackerhgl'; + + // + static final fudGithub = 'https://github.com/hackerhgl/flutter-ui-designs'; + static final fudGooglePlay = + 'https://play.google.com/store/apps/details?id=com.onemdev.flutter_ui_challenges'; + + // + static final rnLoopGithub = + 'https://github.com/hackerhgl/react-native-loop-game'; + static final rnLoopGooglePlay = + 'https://play.google.com/store/apps/details?id=com.onemdev.rnloop'; + + // + static final invmovieconcept1Github = + 'https://github.com/hackerhgl/invmovieconcept1'; + static final invmovieconcept1GooglePlay = + 'https://play.google.com/store/apps/details?id=com.onemdev.invmovieconcept1'; + + // + static final hackerhglCVGithub = 'https://github.com/hackerhgl/CV'; + static final hackerhglCVWeb = 'https://hackerhgl-cv.web.app/'; +} diff --git a/pubspec.lock b/pubspec.lock index d31a952..0039037 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -120,6 +120,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.3.6" + dotted_border: + dependency: "direct main" + description: + name: dotted_border + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.6" emojis: dependency: "direct main" description: @@ -423,6 +430,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.0-nullsafety.2" + path_drawing: + dependency: transitive + description: + name: path_drawing + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.1+1" + path_parsing: + dependency: transitive + description: + name: path_parsing + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.4" path_provider: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 6028d69..11ea9cc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: provider: 4.3.2+2 supercharged: 1.10.0 flutter_icons: 1.1.0 + dotted_border: 1.0.6 fluttery_dart2: 0.0.9 touchable_opacity: 1.1.2 page_transition: 1.1.7+2