diff --git a/android/app/build.gradle b/android/app/build.gradle index 1f9789d..3685753 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -23,7 +23,7 @@ if (flutterVersionName == null) { } android { - namespace "com.denicks21.ndenicolais" + namespace "com.ndn21.myportfolio" compileSdkVersion flutter.compileSdkVersion ndkVersion flutter.ndkVersion @@ -42,7 +42,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.denicks21.ndenicolais" + applicationId "com.ndn21.myportfolio" // You can update the following values to match your application needs. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration. minSdkVersion flutter.minSdkVersion @@ -62,7 +62,7 @@ android { } flutter { - source 'C:/Users/ndenicolais/source/repos/Android/Flutter/myGithub' + source 'C:/Users/ndenicolais/source/repos/Android/Flutter/myportfolio' } dependencies {} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ccd3dac..2e65e2e 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,26 +1,13 @@ - + - - + + - + @@ -28,8 +15,6 @@ - + diff --git a/android/app/src/main/kotlin/com/denicks21/ndenicolais/MainActivity.kt b/android/app/src/main/kotlin/com/ndn21/myportfolio/MainActivity.kt similarity index 73% rename from android/app/src/main/kotlin/com/denicks21/ndenicolais/MainActivity.kt rename to android/app/src/main/kotlin/com/ndn21/myportfolio/MainActivity.kt index 604215a..93840ca 100644 --- a/android/app/src/main/kotlin/com/denicks21/ndenicolais/MainActivity.kt +++ b/android/app/src/main/kotlin/com/ndn21/myportfolio/MainActivity.kt @@ -1,4 +1,4 @@ -package com.denicks21.ndenicolais +package com.ndn21.myportfolio import io.flutter.embedding.android.FlutterActivity diff --git a/android/build.gradle b/android/build.gradle index e83fb5d..839f898 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.7.10' + ext.kotlin_version = '1.8.0' repositories { google() mavenCentral() diff --git a/assets/images/development/android.png b/assets/images/development/android.png new file mode 100644 index 0000000..ee6c9ad Binary files /dev/null and b/assets/images/development/android.png differ diff --git a/assets/images/development/compose.png b/assets/images/development/compose.png deleted file mode 100644 index 7ca036a..0000000 Binary files a/assets/images/development/compose.png and /dev/null differ diff --git a/assets/images/development/figma.png b/assets/images/development/figma.png new file mode 100644 index 0000000..e90d3a8 Binary files /dev/null and b/assets/images/development/figma.png differ diff --git a/assets/images/development/firebase.png b/assets/images/development/firebase.png index 2efe8c2..68fb36e 100644 Binary files a/assets/images/development/firebase.png and b/assets/images/development/firebase.png differ diff --git a/assets/images/development/java.png b/assets/images/development/java.png deleted file mode 100644 index 542ccbc..0000000 Binary files a/assets/images/development/java.png and /dev/null differ diff --git a/assets/images/development/mongodb.png b/assets/images/development/mongodb.png deleted file mode 100644 index d5baa35..0000000 Binary files a/assets/images/development/mongodb.png and /dev/null differ diff --git a/assets/images/development/mysql.png b/assets/images/development/mysql.png deleted file mode 100644 index c443122..0000000 Binary files a/assets/images/development/mysql.png and /dev/null differ diff --git a/assets/images/development/nodejs.png b/assets/images/development/nodejs.png new file mode 100644 index 0000000..75b2f49 Binary files /dev/null and b/assets/images/development/nodejs.png differ diff --git a/assets/images/development/sqlite.png b/assets/images/development/sqlite.png deleted file mode 100644 index 11ff4e2..0000000 Binary files a/assets/images/development/sqlite.png and /dev/null differ diff --git a/assets/images/logo.png b/assets/images/logo.png index 714e52e..f89dc6e 100644 Binary files a/assets/images/logo.png and b/assets/images/logo.png differ diff --git a/assets/images/myPhoto.png b/assets/images/myPhoto.png index b68fcf0..674c7a6 100644 Binary files a/assets/images/myPhoto.png and b/assets/images/myPhoto.png differ diff --git a/assets/images/projects/compose/compose_contact.png b/assets/images/projects/compose/compose_contact.png index cbd0e36..c5dea78 100644 Binary files a/assets/images/projects/compose/compose_contact.png and b/assets/images/projects/compose/compose_contact.png differ diff --git a/assets/images/projects/compose/compose_countdown.png b/assets/images/projects/compose/compose_countdown.png index 11b7b91..669166e 100644 Binary files a/assets/images/projects/compose/compose_countdown.png and b/assets/images/projects/compose/compose_countdown.png differ diff --git a/assets/images/projects/compose/compose_darkmode.png b/assets/images/projects/compose/compose_darkmode.png index cbe3d02..0a45e45 100644 Binary files a/assets/images/projects/compose/compose_darkmode.png and b/assets/images/projects/compose/compose_darkmode.png differ diff --git a/assets/images/projects/compose/compose_egg.png b/assets/images/projects/compose/compose_egg.png index 9fc02da..90d65f3 100644 Binary files a/assets/images/projects/compose/compose_egg.png and b/assets/images/projects/compose/compose_egg.png differ diff --git a/assets/images/projects/compose/compose_language.png b/assets/images/projects/compose/compose_language.png index 4da1691..1321229 100644 Binary files a/assets/images/projects/compose/compose_language.png and b/assets/images/projects/compose/compose_language.png differ diff --git a/assets/images/projects/compose/compose_onboarding.png b/assets/images/projects/compose/compose_onboarding.png index 7485dc6..03f248e 100644 Binary files a/assets/images/projects/compose/compose_onboarding.png and b/assets/images/projects/compose/compose_onboarding.png differ diff --git a/assets/images/projects/compose/compose_photo.png b/assets/images/projects/compose/compose_photo.png new file mode 100644 index 0000000..d984c82 Binary files /dev/null and b/assets/images/projects/compose/compose_photo.png differ diff --git a/assets/images/projects/compose/compose_photopicker.png b/assets/images/projects/compose/compose_photopicker.png deleted file mode 100644 index 50c7927..0000000 Binary files a/assets/images/projects/compose/compose_photopicker.png and /dev/null differ diff --git a/assets/images/projects/compose/compose_recorder.png b/assets/images/projects/compose/compose_recorder.png index 00f90f2..524a146 100644 Binary files a/assets/images/projects/compose/compose_recorder.png and b/assets/images/projects/compose/compose_recorder.png differ diff --git a/assets/images/projects/compose/compose_scanner.png b/assets/images/projects/compose/compose_scanner.png index 69794f4..4f2bc82 100644 Binary files a/assets/images/projects/compose/compose_scanner.png and b/assets/images/projects/compose/compose_scanner.png differ diff --git a/assets/images/projects/compose/compose_speechtext.png b/assets/images/projects/compose/compose_speechtext.png deleted file mode 100644 index 6256a35..0000000 Binary files a/assets/images/projects/compose/compose_speechtext.png and /dev/null differ diff --git a/assets/images/projects/compose/compose_st.png b/assets/images/projects/compose/compose_st.png new file mode 100644 index 0000000..64b2975 Binary files /dev/null and b/assets/images/projects/compose/compose_st.png differ diff --git a/assets/images/projects/compose/compose_stopwatch.png b/assets/images/projects/compose/compose_stopwatch.png index 053a3b8..61bbd49 100644 Binary files a/assets/images/projects/compose/compose_stopwatch.png and b/assets/images/projects/compose/compose_stopwatch.png differ diff --git a/assets/images/projects/flutter/logo_shox.png b/assets/images/projects/flutter/logo_shox.png new file mode 100644 index 0000000..71d8a28 Binary files /dev/null and b/assets/images/projects/flutter/logo_shox.png differ diff --git a/assets/images/projects/react/react_clock.png b/assets/images/projects/react/react_clock.png new file mode 100644 index 0000000..214631e Binary files /dev/null and b/assets/images/projects/react/react_clock.png differ diff --git a/assets/images/projects/react/react_digital_clock.png b/assets/images/projects/react/react_digital_clock.png deleted file mode 100644 index ec1a17f..0000000 Binary files a/assets/images/projects/react/react_digital_clock.png and /dev/null differ diff --git a/assets/images/projects/react/react_password.png b/assets/images/projects/react/react_password.png new file mode 100644 index 0000000..11268ce Binary files /dev/null and b/assets/images/projects/react/react_password.png differ diff --git a/assets/images/projects/react/react_password_generator.png b/assets/images/projects/react/react_password_generator.png deleted file mode 100644 index 8adc73a..0000000 Binary files a/assets/images/projects/react/react_password_generator.png and /dev/null differ diff --git a/assets/images/projects/react/react_pwa.png b/assets/images/projects/react/react_pwa.png index 2943670..8d422a4 100644 Binary files a/assets/images/projects/react/react_pwa.png and b/assets/images/projects/react/react_pwa.png differ diff --git a/assets/images/projects/react/react_qr.png b/assets/images/projects/react/react_qr.png new file mode 100644 index 0000000..f73b442 Binary files /dev/null and b/assets/images/projects/react/react_qr.png differ diff --git a/assets/images/projects/react/react_qr_code_generator.png b/assets/images/projects/react/react_qr_code_generator.png deleted file mode 100644 index fcac95e..0000000 Binary files a/assets/images/projects/react/react_qr_code_generator.png and /dev/null differ diff --git a/assets/images/projects/xml/xml_animations.png b/assets/images/projects/xml/xml_animations.png index 18f1328..b7b13e3 100644 Binary files a/assets/images/projects/xml/xml_animations.png and b/assets/images/projects/xml/xml_animations.png differ diff --git a/assets/images/projects/xml/xml_dark_mode.png b/assets/images/projects/xml/xml_dark_mode.png deleted file mode 100644 index 550c879..0000000 Binary files a/assets/images/projects/xml/xml_dark_mode.png and /dev/null differ diff --git a/assets/images/projects/xml/xml_darkmode.png b/assets/images/projects/xml/xml_darkmode.png new file mode 100644 index 0000000..1a350ae Binary files /dev/null and b/assets/images/projects/xml/xml_darkmode.png differ diff --git a/assets/images/projects/xml/xml_folder.png b/assets/images/projects/xml/xml_folder.png new file mode 100644 index 0000000..f19d7bb Binary files /dev/null and b/assets/images/projects/xml/xml_folder.png differ diff --git a/assets/images/projects/xml/xml_folder_creation.png b/assets/images/projects/xml/xml_folder_creation.png deleted file mode 100644 index b6fa5bb..0000000 Binary files a/assets/images/projects/xml/xml_folder_creation.png and /dev/null differ diff --git a/assets/images/projects/xml/xml_language.png b/assets/images/projects/xml/xml_language.png new file mode 100644 index 0000000..ca9f06d Binary files /dev/null and b/assets/images/projects/xml/xml_language.png differ diff --git a/assets/images/projects/xml/xml_logo.png b/assets/images/projects/xml/xml_logo.png new file mode 100644 index 0000000..6d89b8e Binary files /dev/null and b/assets/images/projects/xml/xml_logo.png differ diff --git a/assets/images/projects/xml/xml_onboarding.png b/assets/images/projects/xml/xml_onboarding.png index d48348a..ff93965 100644 Binary files a/assets/images/projects/xml/xml_onboarding.png and b/assets/images/projects/xml/xml_onboarding.png differ diff --git a/assets/images/projects/xml/xml_recorder.png b/assets/images/projects/xml/xml_recorder.png index 97ff2d8..1853590 100644 Binary files a/assets/images/projects/xml/xml_recorder.png and b/assets/images/projects/xml/xml_recorder.png differ diff --git a/assets/images/projects/xml/xml_sensors.png b/assets/images/projects/xml/xml_sensors.png index e5cd7c2..d3fb9ef 100644 Binary files a/assets/images/projects/xml/xml_sensors.png and b/assets/images/projects/xml/xml_sensors.png differ diff --git a/assets/images/projects/xml/xml_speech_to_text.png b/assets/images/projects/xml/xml_speech_to_text.png deleted file mode 100644 index c52edab..0000000 Binary files a/assets/images/projects/xml/xml_speech_to_text.png and /dev/null differ diff --git a/assets/images/projects/xml/xml_sql_lite.png b/assets/images/projects/xml/xml_sql_lite.png deleted file mode 100644 index 0627ed1..0000000 Binary files a/assets/images/projects/xml/xml_sql_lite.png and /dev/null differ diff --git a/assets/images/projects/xml/xml_sqlite.png b/assets/images/projects/xml/xml_sqlite.png new file mode 100644 index 0000000..b20897d Binary files /dev/null and b/assets/images/projects/xml/xml_sqlite.png differ diff --git a/assets/images/projects/xml/xml_stt.png b/assets/images/projects/xml/xml_stt.png new file mode 100644 index 0000000..7a7a7eb Binary files /dev/null and b/assets/images/projects/xml/xml_stt.png differ diff --git a/assets/images/projects/xml/xml_switch_language.png b/assets/images/projects/xml/xml_switch_language.png deleted file mode 100644 index 3e92f22..0000000 Binary files a/assets/images/projects/xml/xml_switch_language.png and /dev/null differ diff --git a/assets/images/projects/xml/xml_toast.png b/assets/images/projects/xml/xml_toast.png new file mode 100644 index 0000000..d6b5fcd Binary files /dev/null and b/assets/images/projects/xml/xml_toast.png differ diff --git a/assets/images/projects/xml/xml_toast_message.png b/assets/images/projects/xml/xml_toast_message.png deleted file mode 100644 index ab29959..0000000 Binary files a/assets/images/projects/xml/xml_toast_message.png and /dev/null differ diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 07fdef2..856027e 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -367,7 +367,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.myPortfolio; + PRODUCT_BUNDLE_IDENTIFIER = com.ndn21.myportfolio; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -384,7 +384,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.myPortfolio.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.ndn21.myportfolio.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -402,7 +402,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.myPortfolio.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.ndn21.myportfolio.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -418,7 +418,7 @@ CURRENT_PROJECT_VERSION = 1; GENERATE_INFOPLIST_FILE = YES; MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.myPortfolio.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.ndn21.myportfolio.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -545,7 +545,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.myPortfolio; + PRODUCT_BUNDLE_IDENTIFIER = com.ndn21.myportfolio; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -567,7 +567,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.myPortfolio; + PRODUCT_BUNDLE_IDENTIFIER = com.ndn21.myportfolio; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/lib/main.dart b/lib/main.dart index 716bc2c..bd62824 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,9 +1,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:ndenicolais/routes.dart'; +import 'package:myportfolio/pages/intro_page.dart'; +import 'package:myportfolio/theme/app_theme.dart'; import 'package:provider/provider.dart'; -import 'package:ndenicolais/providers/theme_notifier.dart'; -import 'package:shared_preferences/shared_preferences.dart'; +import 'package:myportfolio/theme/theme_notifier.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -14,15 +14,9 @@ void main() async { DeviceOrientation.portraitDown, ]); - // Carica le preferenze salvate - final prefs = await SharedPreferences.getInstance(); - final isDarkMode = prefs.getBool('isDarkMode') ?? false; - runApp( ChangeNotifierProvider( - create: (context) => ThemeNotifier( - isDarkMode ? ThemeNotifier.darkTheme : ThemeNotifier.lightTheme, - ), + create: (_) => ThemeNotifier(AppTheme.lightTheme(), false), child: const MyApp(), ), ); @@ -34,14 +28,24 @@ class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return Consumer( - builder: (context, themeNotifier, _) { + builder: (context, themeNotifier, child) { + final brightness = MediaQuery.of(context).platformBrightness; + + if (!themeNotifier.isManualTheme) { + if (brightness == Brightness.dark && !themeNotifier.isDarkMode) { + themeNotifier.setDarkTheme(); + } else if (brightness == Brightness.light && + themeNotifier.isDarkMode) { + themeNotifier.setLightTheme(); + } + themeNotifier.resetManualTheme(); + } + return MaterialApp( + debugShowCheckedModeBanner: false, title: "Nicola De Nicolais", - theme: themeNotifier.getTheme(), - darkTheme: themeNotifier.getDarkTheme(), - themeMode: themeNotifier.getThemeMode(), - initialRoute: Routes.intro, - routes: Routes.getRoutes(), + theme: themeNotifier.currentTheme, + home: const IntroPage(), ); }, ); diff --git a/lib/models/card_model.dart b/lib/models/card_model.dart deleted file mode 100644 index 5282564..0000000 --- a/lib/models/card_model.dart +++ /dev/null @@ -1,13 +0,0 @@ -class CardModel { - final String title; - final String description; - final String imagePath; - final String githubLink; - - CardModel({ - required this.title, - required this.description, - required this.imagePath, - required this.githubLink, - }); -} diff --git a/lib/pages/home/home_large.dart b/lib/pages/home/home_large.dart deleted file mode 100644 index 410a538..0000000 --- a/lib/pages/home/home_large.dart +++ /dev/null @@ -1,669 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/bottom_bar.dart'; -import 'package:ndenicolais/widgets/top_bar.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class HomePageLarge extends StatelessWidget { - const HomePageLarge({super.key}); - - @override - Widget build(BuildContext context) { - final Uri uriPdf = Uri.parse( - 'https://drive.google.com/file/d/1XY10jnOqsJbNAeiPJV00Pw8LfErro5TI/view?usp=sharing'); - - return PopScope( - canPop: false, - child: Material( - child: ListView( - children: [ - const MyTopBar(), - Padding( - padding: const EdgeInsets.symmetric(vertical: 40), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'NICOLA\nDE NICOLAIS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 140, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - ' SOFTWARE DEVELOPER', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 30, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 40), - Divider( - thickness: 1, - indent: 250, - endIndent: 250, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 40), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 320), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - 'assets/images/myPhoto.png', - width: 250, - height: 250, - ), - const SizedBox(width: 16), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'ABOUT ME', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - description, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ), - ), - const SizedBox(height: 40), - SizedBox( - width: 120, - height: 50, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriPdf); - }, - icon: Icon( - FontAwesomeIcons.download, - size: 24, - color: Theme.of(context).colorScheme.primary, - ), - label: Text( - 'CV', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 18, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - style: ElevatedButton.styleFrom( - foregroundColor: Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - padding: const EdgeInsets.all(12), - ), - ), - ), - const SizedBox(height: 40), - Divider( - thickness: 1, - indent: 250, - endIndent: 250, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 40), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(24), - width: 500, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'EDUCAZIONE', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Text( - "Diploma scientifico", - style: TextStyle( - fontSize: 20, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "Liceo Scientifico Rummo di Benevento", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 8), - Text( - "Laurea triennale in\nIngegneria Informatica", - style: TextStyle( - fontSize: 20, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "Università Guglielmo Marconi di Roma", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - const SizedBox(width: 20), - Container( - padding: const EdgeInsets.all(24), - width: 500, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'LINGUE', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/italian.png', - width: 30, - height: 30, - ), - const SizedBox(width: 4), - SizedBox( - width: 200, - height: 10, - child: LinearProgressIndicator( - value: 1, - backgroundColor: Theme.of(context) - .colorScheme - .primary, - valueColor: - AlwaysStoppedAnimation( - Theme.of(context) - .colorScheme - .tertiary), - borderRadius: BorderRadius.circular(25), - ), - ), - ], - ), - const SizedBox(height: 4), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/english.png', - width: 30, - height: 30, - ), - const SizedBox(width: 4), - SizedBox( - width: 200, - height: 10, - child: LinearProgressIndicator( - value: 0.7, - backgroundColor: Theme.of(context) - .colorScheme - .primary, - valueColor: - AlwaysStoppedAnimation( - Theme.of(context) - .colorScheme - .tertiary), - borderRadius: BorderRadius.circular(25), - ), - ), - ], - ), - const SizedBox(height: 8), - Text( - "Certificazione di lingua inglese B2", - style: TextStyle( - fontSize: 20, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "2008 | Trinity Hall College di Dublino", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "2007 | Goldsmiths College di Londra", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(24), - width: 500, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'CODING', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: - Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/flutter.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "Flutter", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/dart.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "Dart", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/typescript.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "TypeScript", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/html.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "HTML", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ], - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/compose.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "Compose", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/kotlin.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "Kotlin", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/javascript.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "JavaScript", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/css.png', - width: 28, - height: 28, - ), - const SizedBox(width: 4), - Text( - "CSS", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ], - ), - ], - ), - ], - )), - const SizedBox(width: 20), - Container( - padding: const EdgeInsets.all(24), - width: 500, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'SKILLS', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Text( - "Attenzione ai dettagli", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Problem solving", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Precisione", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Propensione all'innovazione", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Capacià di lavorare in team", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Adattabilità", - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ), - ], - ), - const SizedBox(height: 40), - ], - ), - ), - MyBottomBar(), - ], - ), - ), - ); - } -} diff --git a/lib/pages/home/home_medium.dart b/lib/pages/home/home_medium.dart deleted file mode 100644 index 9ccba81..0000000 --- a/lib/pages/home/home_medium.dart +++ /dev/null @@ -1,665 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/bottom_bar.dart'; -import 'package:ndenicolais/widgets/top_bar.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class HomePageMedium extends StatelessWidget { - const HomePageMedium({super.key}); - - @override - Widget build(BuildContext context) { - final Uri uriPdf = Uri.parse( - 'https://drive.google.com/file/d/1XY10jnOqsJbNAeiPJV00Pw8LfErro5TI/view?usp=sharing'); - - return PopScope( - canPop: false, - child: Material( - child: ListView( - children: [ - const MyTopBar(), - Padding( - padding: const EdgeInsets.symmetric(vertical: 30), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'NICOLA\nDE NICOLAIS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 100, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - ' SOFTWARE DEVELOPER', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 20, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 30), - Divider( - thickness: 1, - indent: 180, - endIndent: 180, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 180), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'ABOUT ME', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 16), - Image.asset( - 'assets/images/myPhoto.png', - width: 180, - height: 180, - ), - const SizedBox(height: 16), - Text( - description, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ), - ), - const SizedBox(height: 30), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriPdf); - }, - icon: Icon( - FontAwesomeIcons.download, - size: 24, - color: Theme.of(context).colorScheme.primary, - ), - label: Text( - 'CV', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 18, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - style: ElevatedButton.styleFrom( - foregroundColor: Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - padding: const EdgeInsets.all(12), - ), - ), - ), - const SizedBox(height: 30), - Divider( - thickness: 1, - indent: 180, - endIndent: 180, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 30), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(20), - width: 520, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'EDUCAZIONE', - style: TextStyle( - fontSize: 22, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Text( - "Diploma scientifico", - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "Liceo Scientifico Rummo di Benevento", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 8), - Text( - "Laurea triennale in\nIngegneria Informatica", - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "Università Guglielmo Marconi di Roma", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - const SizedBox(height: 20), - Container( - padding: const EdgeInsets.all(20), - width: 520, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'LINGUE', - style: TextStyle( - fontSize: 22, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/italian.png', - width: 30, - height: 30, - ), - const SizedBox(width: 4), - SizedBox( - width: 200, - height: 10, - child: LinearProgressIndicator( - value: 1, - backgroundColor: Theme.of(context) - .colorScheme - .primary, - valueColor: - AlwaysStoppedAnimation( - Theme.of(context) - .colorScheme - .tertiary), - borderRadius: BorderRadius.circular(25), - ), - ), - ], - ), - const SizedBox(height: 4), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/english.png', - width: 30, - height: 30, - ), - const SizedBox(width: 4), - SizedBox( - width: 200, - height: 10, - child: LinearProgressIndicator( - value: 0.7, - backgroundColor: Theme.of(context) - .colorScheme - .primary, - valueColor: - AlwaysStoppedAnimation( - Theme.of(context) - .colorScheme - .tertiary), - borderRadius: BorderRadius.circular(25), - ), - ), - ], - ), - const SizedBox(height: 8), - Text( - "Certificazione di lingua inglese B2", - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "2008 | Trinity Hall College di Dublino", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "2007 | Goldsmiths College di Londra", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - const SizedBox(height: 20), - Container( - padding: const EdgeInsets.all(20), - width: 520, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'CODING', - style: TextStyle( - fontSize: 22, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/flutter.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "Flutter", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/dart.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "Dart", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/typescript.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "TypeScript", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/html.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "HTML", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ], - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/compose.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "Compose", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/kotlin.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "Kotlin", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/javascript.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "JavaScript", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/css.png', - width: 22, - height: 22, - ), - const SizedBox(width: 4), - Text( - "CSS", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ], - ), - ], - ), - ], - ), - ), - const SizedBox(height: 20), - Container( - padding: const EdgeInsets.all(20), - width: 520, - height: 280, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'SKILLS', - style: TextStyle( - fontSize: 22, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 120, - endIndent: 120, - color: Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 8), - Text( - "Attenzione ai dettagli", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Problem solving", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Precisione", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Propensione all'innovazione", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Capacià di lavorare in team", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Adattabilità", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ) - ], - ), - const SizedBox(height: 30), - ], - ), - ), - MyBottomBar(), - ], - ), - ), - ); - } -} diff --git a/lib/pages/home/home_small.dart b/lib/pages/home/home_small.dart deleted file mode 100644 index d31706c..0000000 --- a/lib/pages/home/home_small.dart +++ /dev/null @@ -1,697 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/providers/theme_notifier.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/drawer.dart'; -import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class HomePageSmall extends StatefulWidget { - const HomePageSmall({super.key}); - - @override - HomePageSmallState createState() => HomePageSmallState(); -} - -class HomePageSmallState extends State { - @override - Widget build(BuildContext context) { - final themeNotifier = Provider.of(context); - final isDarkMode = themeNotifier.currentTheme == ThemeNotifier.darkTheme; - final Uri uriPdf = Uri.parse( - 'https://drive.google.com/file/d/1XY10jnOqsJbNAeiPJV00Pw8LfErro5TI/view?usp=sharing'); - - return Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: Theme.of(context).colorScheme.secondary, - title: Text( - 'ndenicolais', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontSize: 20, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - drawer: MyDrawer(isDarkMode: isDarkMode, themeNotifier: themeNotifier), - body: PopScope( - canPop: false, - child: Material( - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'NICOLA\nDE NICOLAIS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 60, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - ' SOFTWARE DEVELOPER', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 15, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 20), - Divider( - thickness: 1, - indent: 60, - endIndent: 60, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 20), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 30), - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - 'assets/images/myPhoto.png', - width: 120, - height: 120, - ), - const SizedBox(width: 8), - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'ABOUT ME', - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - description, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ), - ), - const SizedBox(height: 20), - SizedBox( - width: 80, - height: 30, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriPdf); - }, - icon: Icon( - FontAwesomeIcons.download, - size: 14, - color: Theme.of(context).colorScheme.primary, - ), - label: Text( - 'CV', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 12, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - padding: const EdgeInsets.all(6), - ), - ), - ), - const SizedBox(height: 20), - Divider( - thickness: 1, - indent: 60, - endIndent: 60, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 20), - Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Container( - padding: const EdgeInsets.all(16), - width: 320, - height: 200, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'EDUCAZIONE', - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 50, - endIndent: 50, - color: - Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 4), - Text( - "Diploma scientifico", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "Liceo Scientifico Rummo di Benevento", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 8), - Text( - "Laurea triennale in\nIngegneria Informatica", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "Università Guglielmo Marconi di Roma", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - const SizedBox(height: 10), - Container( - padding: const EdgeInsets.all(16), - width: 320, - height: 200, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'LINGUE', - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 50, - endIndent: 50, - color: - Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 4), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/italian.png', - width: 20, - height: 20, - ), - const SizedBox(width: 4), - SizedBox( - width: 100, - height: 10, - child: LinearProgressIndicator( - value: 1, - backgroundColor: Theme.of(context) - .colorScheme - .onTertiary, - minHeight: 10, - valueColor: - AlwaysStoppedAnimation( - Theme.of(context) - .colorScheme - .tertiary), - borderRadius: - BorderRadius.circular(25), - ), - ), - ], - ), - const SizedBox(height: 4), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/english.png', - width: 20, - height: 20, - ), - const SizedBox(width: 4), - SizedBox( - width: 100, - height: 10, - child: LinearProgressIndicator( - value: 0.7, - backgroundColor: Theme.of(context) - .colorScheme - .onTertiary, - minHeight: 10, - valueColor: - AlwaysStoppedAnimation( - Theme.of(context) - .colorScheme - .tertiary), - borderRadius: - BorderRadius.circular(25), - ), - ), - ], - ), - Text( - "Certificazione di lingua inglese B2", - style: TextStyle( - fontSize: 16, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - "2008 | Trinity Hall College di Dublino", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "2007 | Goldsmiths College di Londra", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - const SizedBox(height: 10), - Container( - padding: const EdgeInsets.all(16), - width: 320, - height: 200, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'CODING', - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 50, - endIndent: 50, - color: - Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 4), - Row( - mainAxisAlignment: - MainAxisAlignment.spaceEvenly, - children: [ - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/flutter.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "Flutter", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/dart.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "Dart", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/typescript.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "TypeScript", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/html.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "HTML", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ], - ), - Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/compose.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "Compose", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/kotlin.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "Kotlin", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/javascript.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "JavaScript", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: - MainAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/css.png', - width: 18, - height: 18, - ), - const SizedBox(width: 4), - Text( - "CSS", - style: TextStyle( - fontSize: 14, - color: Theme.of(context) - .colorScheme - .primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ], - ), - ], - ), - ], - ), - ), - const SizedBox(height: 10), - Container( - padding: const EdgeInsets.all(16), - width: 320, - height: 200, - decoration: BoxDecoration( - color: Theme.of(context).colorScheme.secondary, - borderRadius: BorderRadius.circular(50), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'SKILLS', - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.primary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Divider( - thickness: 1, - indent: 50, - endIndent: 50, - color: - Theme.of(context).colorScheme.tertiary, - ), - const SizedBox(height: 4), - Text( - "Attenzione ai dettagli", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Problem solving", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Precisione", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Propensione all'innovazione", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Capacià di lavorare in team", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - Text( - "Adattabilità", - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ], - ) - ], - ), - const SizedBox(height: 20), - ], - ), - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart new file mode 100644 index 0000000..5cbea4b --- /dev/null +++ b/lib/pages/home_page.dart @@ -0,0 +1,70 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/pages/sections/my_bio.dart'; +import 'package:myportfolio/pages/sections/my_projects.dart'; +import 'package:myportfolio/pages/sections/my_skills.dart'; +import 'package:myportfolio/pages/sections/my_top.dart'; +import 'package:myportfolio/pages/sections/my_works.dart'; +import 'package:myportfolio/widgets/drawer.dart'; +import 'package:myportfolio/widgets/footer.dart'; +import 'package:myportfolio/widgets/top_bar.dart'; + +class HomePage extends StatefulWidget { + const HomePage({super.key}); + + @override + HomePageState createState() => HomePageState(); +} + +class HomePageState extends State { + void scrollToSection(GlobalKey key) { + final context = key.currentContext; + if (context != null) { + Scrollable.ensureVisible( + context, + duration: const Duration(seconds: 1), + curve: Curves.easeInOut, + ); + } + } + + @override + Widget build(BuildContext context) { + return PopScope( + canPop: false, + child: Stack( + children: [ + Scaffold( + backgroundColor: Theme.of(context).colorScheme.surface, + drawer: MyDrawer( + onScrollToSection: scrollToSection, + ), + body: CustomScrollView( + slivers: [ + MyTopBar( + onScrollToSection: scrollToSection, + ), + const SliverToBoxAdapter( + child: Column( + children: [ + MyTop(), + SizedBox(height: 40), + MyBio(), + SizedBox(height: 40), + MySkills(), + SizedBox(height: 40), + MyWorks(), + SizedBox(height: 40), + MyProjects(), + SizedBox(height: 40), + MyFooter(), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/intro/intro_large.dart b/lib/pages/intro/intro_large.dart deleted file mode 100644 index b29fccd..0000000 --- a/lib/pages/intro/intro_large.dart +++ /dev/null @@ -1,54 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:ndenicolais/routes.dart'; - -class IntroPageLarge extends StatefulWidget { - const IntroPageLarge({Key? key}) : super(key: key); - - @override - IntroPageLargeState createState() => IntroPageLargeState(); -} - -class IntroPageLargeState extends State { - @override - void initState() { - super.initState(); - navigateToHomePage(); - } - - navigateToHomePage() async { - await Future.delayed(const Duration(seconds: 4)); - - // Verifica se il widget è ancora montato prima di eseguire la navigazione - if (mounted) { - Navigator.of(context).pushNamed(Routes.home); - } - } - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.secondary, - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SpinKitFoldingCube( - color: Theme.of(context).colorScheme.primary, - size: 200.0, - ), - const SizedBox(height: 60), - Text( - 'ndenicolais', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 20, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/intro/intro_medium.dart b/lib/pages/intro/intro_medium.dart deleted file mode 100644 index b6ea8fd..0000000 --- a/lib/pages/intro/intro_medium.dart +++ /dev/null @@ -1,61 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:ndenicolais/routes.dart'; - -class IntroPageMedium extends StatefulWidget { - const IntroPageMedium({Key? key}) : super(key: key); - - @override - IntroPageMediumState createState() => IntroPageMediumState(); -} - -class IntroPageMediumState extends State { - @override - void initState() { - super.initState(); - navigateToHomePage(); - } - - navigateToHomePage() async { - await Future.delayed(const Duration(seconds: 4)); - - // Verifica se il widget è ancora montato prima di eseguire la navigazione - if (mounted) { - Navigator.of(context).pushNamed(Routes.home); - } - } - - @override - @override - Widget build(BuildContext context) { - navigateToHomePage() async { - await Future.delayed(const Duration(seconds: 4)); - Navigator.of(context).pushNamed(Routes.home); - } - - navigateToHomePage(); - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.secondary, - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SpinKitFoldingCube( - color: Theme.of(context).colorScheme.primary, - size: 150.0, - ), - const SizedBox(height: 45), - Text( - 'ndenicolais', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 20, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/intro/intro_small.dart b/lib/pages/intro/intro_small.dart deleted file mode 100644 index 8810865..0000000 --- a/lib/pages/intro/intro_small.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_spinkit/flutter_spinkit.dart'; -import 'package:ndenicolais/routes.dart'; - -class IntroPageSmall extends StatefulWidget { - const IntroPageSmall({Key? key}) : super(key: key); - - @override - IntroPageSmallState createState() => IntroPageSmallState(); -} - -class IntroPageSmallState extends State { - @override - void initState() { - super.initState(); - navigateToHomePage(); - } - - navigateToHomePage() async { - await Future.delayed(const Duration(seconds: 4)); - - // Verifica se il widget è ancora montato prima di eseguire la navigazione - if (mounted) { - Navigator.of(context).pushNamed(Routes.home); - } - } - - @override - Widget build(BuildContext context) { - navigateToHomePage() async { - await Future.delayed(const Duration(seconds: 4)); - Navigator.of(context).pushNamed(Routes.home); - } - - navigateToHomePage(); - return Scaffold( - backgroundColor: Theme.of(context).colorScheme.secondary, - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SpinKitFoldingCube( - color: Theme.of(context).colorScheme.primary, - size: 100.0, - ), - const SizedBox(height: 30), - Text( - 'ndenicolais', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 20, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/intro_page.dart b/lib/pages/intro_page.dart new file mode 100644 index 0000000..cad1263 --- /dev/null +++ b/lib/pages/intro_page.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/pages/home_page.dart'; +import 'package:myportfolio/widgets/intro_logo.dart'; + +class IntroPage extends StatefulWidget { + const IntroPage({Key? key}) : super(key: key); + + @override + IntroPageState createState() => IntroPageState(); +} + +class IntroPageState extends State { + @override + void initState() { + super.initState(); + navigateToHomePage(); + } + + navigateToHomePage() async { + await Future.delayed(const Duration(seconds: 2)); + if (mounted) { + Navigator.pushReplacement( + context, + MaterialPageRoute(builder: (context) => const HomePage()), + ); + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Theme.of(context).colorScheme.surface, + body: LayoutBuilder( + builder: (context, constraints) { + if (constraints.maxWidth < 600) { + return _buildSmallScreenLayout(); + } else if (constraints.maxWidth < 1200) { + return _buildMediumScreenLayout(); + } else { + return _buildLargeScreenLayout(); + } + }, + ), + ); + } + + Widget _buildSmallScreenLayout() { + return const Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + HeartbeatLogo( + width: 120, + height: 120, + ), + ], + ), + ); + } + + Widget _buildMediumScreenLayout() { + return const Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + HeartbeatLogo( + width: 140, + height: 140, + ), + ], + ), + ); + } + + Widget _buildLargeScreenLayout() { + return const Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + HeartbeatLogo( + width: 180, + height: 180, + ), + ], + ), + ); + } +} diff --git a/lib/pages/projects/projects_large.dart b/lib/pages/projects/projects_large.dart deleted file mode 100644 index fd8f4c4..0000000 --- a/lib/pages/projects/projects_large.dart +++ /dev/null @@ -1,359 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/bottom_bar.dart'; -import 'package:ndenicolais/widgets/cards/compose_card.dart'; -import 'package:ndenicolais/widgets/cards/flutter_card.dart'; -import 'package:ndenicolais/widgets/cards/react_card.dart'; -import 'package:ndenicolais/widgets/cards/xml_card.dart'; -import 'package:ndenicolais/widgets/top_bar.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -class ProjectsPageLarge extends StatelessWidget { - const ProjectsPageLarge({super.key}); - - @override - Widget build(BuildContext context) { - return Material( - child: ListView( - children: [ - const MyTopBar(), - Padding( - padding: const EdgeInsets.symmetric(vertical: 40), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'MY', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 140, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - 'PROJECTS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 140, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - ], - ), - const SizedBox(height: 40), - Divider( - thickness: 1, - indent: 250, - endIndent: 250, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 40), - Text( - 'My developer experience', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 24, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 40), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 320), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Languages & Tools', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontSize: 30, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/flutter.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/dart.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/compose.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/kotlin.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/javascript.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/typescript.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/html.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/css.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/react.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/java.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/mongodb.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/firebase.png', - width: 38, - height: 38, - ), - ], - ), - const SizedBox(height: 40), - Text( - 'GitHub', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 30, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - github, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - GestureDetector( - onTap: () { - launchUrlString( - 'https://github.com/ndenicolais'); - }, - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: Image.asset( - 'assets/images/github.png', - width: 38, - height: 38, - ), - ), - ), - const SizedBox(height: 20), - Text( - 'Applicazioni mobile', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - android, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 20), - Text( - 'Multi-platform', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - 'Flutter', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - flutter, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - Text( - 'PROJECTS ARE WORK IN PROGRESS', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - const FlutterCards(), - const SizedBox(height: 40), - Text( - 'Android', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - 'Jetpack Compose', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - compose, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const ComposeCards(), - const SizedBox(height: 40), - Text( - 'XML Layouts', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - xml, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const XmlCards(), - const SizedBox(height: 40), - Text( - 'Desktop', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - const SizedBox(height: 20), - Text( - 'React', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - react, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const ReactCards(), - ], - ), - ), - ], - ), - ), - ), - const SizedBox(height: 40), - ], - ), - ), - MyBottomBar(), - ], - ), - ); - } -} diff --git a/lib/pages/projects/projects_medium.dart b/lib/pages/projects/projects_medium.dart deleted file mode 100644 index cc19dc1..0000000 --- a/lib/pages/projects/projects_medium.dart +++ /dev/null @@ -1,359 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/bottom_bar.dart'; -import 'package:ndenicolais/widgets/cards/compose_card.dart'; -import 'package:ndenicolais/widgets/cards/flutter_card.dart'; -import 'package:ndenicolais/widgets/cards/react_card.dart'; -import 'package:ndenicolais/widgets/cards/xml_card.dart'; -import 'package:ndenicolais/widgets/top_bar.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -class ProjectsPageMedium extends StatelessWidget { - const ProjectsPageMedium({super.key}); - - @override - Widget build(BuildContext context) { - return Material( - child: ListView( - children: [ - const MyTopBar(), - Padding( - padding: const EdgeInsets.symmetric(vertical: 30), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'MY', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 100, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - 'PROJECTS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 100, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - ], - ), - const SizedBox(height: 30), - Divider( - thickness: 1, - indent: 180, - endIndent: 180, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 30), - Text( - 'My developer experience', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 24, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 180), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Languages & Tools', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontSize: 30, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/flutter.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/dart.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/compose.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/kotlin.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/javascript.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/typescript.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/html.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/css.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/react.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/java.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/mongodb.png', - width: 38, - height: 38, - ), - const SizedBox(width: 8), - Image.asset( - 'assets/images/development/firebase.png', - width: 38, - height: 38, - ), - ], - ), - const SizedBox(height: 40), - Text( - 'GitHub', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 30, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - github, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - GestureDetector( - onTap: () { - launchUrlString( - 'https://github.com/ndenicolais'); - }, - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: Image.asset( - 'assets/images/github.png', - width: 38, - height: 38, - ), - ), - ), - const SizedBox(height: 20), - Text( - 'Applicazioni mobile', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - android, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 20), - Text( - 'Multi-platform', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - 'Flutter', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - flutter, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - Text( - 'PROJECTS ARE WORK IN PROGRESS', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.secondary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - const FlutterCards(), - const SizedBox(height: 20), - Text( - 'Android', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - 'Jetpack Compose', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - compose, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const ComposeCards(), - const SizedBox(height: 40), - Text( - 'XML Layouts', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - xml, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const XmlCards(), - const SizedBox(height: 40), - Text( - 'Desktop', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - const SizedBox(height: 20), - Text( - 'React', - style: TextStyle( - fontSize: 24, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - react, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const ReactCards(), - ], - ), - ), - ], - ), - ), - ), - const SizedBox(height: 40), - ], - ), - ), - MyBottomBar(), - ], - ), - ); - } -} diff --git a/lib/pages/projects/projects_small.dart b/lib/pages/projects/projects_small.dart deleted file mode 100644 index 63ac189..0000000 --- a/lib/pages/projects/projects_small.dart +++ /dev/null @@ -1,392 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:ndenicolais/providers/theme_notifier.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/drawer.dart'; -import 'package:ndenicolais/widgets/cards/compose_card.dart'; -import 'package:ndenicolais/widgets/cards/flutter_card.dart'; -import 'package:ndenicolais/widgets/cards/react_card.dart'; -import 'package:ndenicolais/widgets/cards/xml_card.dart'; -import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher_string.dart'; - -class ProjectsPageSmall extends StatefulWidget { - const ProjectsPageSmall({super.key}); - - @override - ProjectsPageSmallState createState() => ProjectsPageSmallState(); -} - -class ProjectsPageSmallState extends State { - @override - Widget build(BuildContext context) { - final themeNotifier = Provider.of(context); - final isDarkMode = themeNotifier.currentTheme == ThemeNotifier.darkTheme; - - return Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: Theme.of(context).colorScheme.secondary, - title: Text( - 'ndenicolais', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontSize: 20, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - drawer: MyDrawer(isDarkMode: isDarkMode, themeNotifier: themeNotifier), - body: Material( - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'MY', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 60, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - 'PROJECTS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 60, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - ], - ), - const SizedBox(height: 30), - Divider( - thickness: 1, - indent: 35, - endIndent: 35, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 30), - Text( - 'My developer experience', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 18, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Text( - 'Languages & Tools', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontSize: 24, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ], - ), - const SizedBox(height: 20), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.asset( - 'assets/images/development/flutter.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/dart.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/compose.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/kotlin.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/javascript.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/typescript.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/html.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/css.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/react.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/java.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/mongodb.png', - width: 24, - height: 24, - ), - const SizedBox(width: 4), - Image.asset( - 'assets/images/development/firebase.png', - width: 24, - height: 24, - ), - ], - ), - const SizedBox(height: 40), - Text( - 'GitHub', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 24, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - github, - style: TextStyle( - fontSize: 12, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - GestureDetector( - onTap: () { - launchUrlString( - 'https://github.com/ndenicolais'); - }, - child: MouseRegion( - cursor: SystemMouseCursors.click, - child: Image.asset( - 'assets/images/github.png', - width: 24, - height: 24, - ), - ), - ), - const SizedBox(height: 20), - Text( - 'Applicazioni mobile', - style: TextStyle( - fontSize: 24, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - android, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 20), - Text( - 'Multi-platform', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - 'Flutter', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - flutter, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - Text( - 'PROJECTS ARE WORK IN PROGRESS', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .secondary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - const FlutterCards(), - const SizedBox(height: 20), - Text( - 'Android', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - 'Jetpack Compose', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - compose, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const ComposeCards(), - const SizedBox(height: 20), - Text( - 'XML Layouts', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - xml, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const XmlCards(), - const SizedBox(height: 20), - Text( - 'Desktop', - style: TextStyle( - fontSize: 24, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - const SizedBox(height: 20), - Text( - 'React', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - react, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - const ReactCards(), - const SizedBox(height: 20), - ], - ), - ), - ], - ), - ), - ), - const SizedBox(height: 30), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/pages/sections/my_bio.dart b/lib/pages/sections/my_bio.dart new file mode 100644 index 0000000..5d080e0 --- /dev/null +++ b/lib/pages/sections/my_bio.dart @@ -0,0 +1,235 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/utils/globals.dart'; +import 'package:myportfolio/utils/strings.dart'; + +class MyBio extends StatelessWidget { + const MyBio({Key? key}) : super(key: key); + + static final GlobalKey componentKey = GlobalKey(); + + @override + Key? get key => componentKey; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double titleFontSize = screenWidth > 800 ? 30 : 20; + double sectionTitleFontSize = screenWidth > 800 ? 24 : 18; + double sectionBodyFontSize = screenWidth > 800 ? 16 : 14; + double progressBarWidth = screenWidth > 800 ? 200 : 120; + double dividerIndent = screenWidth > 800 ? 240 : 80; + + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: Column( + children: [ + Text( + sAbout.toUpperCase(), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: titleFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Divider( + thickness: 1, + indent: dividerIndent, + endIndent: dividerIndent, + color: Theme.of(context).colorScheme.secondary, + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric( + horizontal: MediaQuery.of(context).size.width * 0.12), + child: Container( + key: GlobalKeys.aboutSectionKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tBio, + style: TextStyle( + fontSize: sectionTitleFontSize, + color: Theme.of(context) + .colorScheme + .secondary, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 8), + Text( + description, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context) + .colorScheme + .secondary, + fontFamily: 'CustomFont', + ), + ), + ], + ), + ), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tEducation, + style: TextStyle( + fontSize: sectionTitleFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 8), + Text( + eDiploma, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Text( + eLiceo, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 8), + Text( + eBachelor, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Text( + eUni, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + ], + ), + const SizedBox(height: 20), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tLanguages, + style: TextStyle( + fontSize: sectionTitleFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + 'assets/images/italian.png', + width: 30, + height: 30, + ), + const SizedBox(width: 4), + SizedBox( + width: progressBarWidth, + height: 10, + child: LinearProgressIndicator( + value: 1, + backgroundColor: + Theme.of(context).colorScheme.primary, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.tertiary), + borderRadius: BorderRadius.circular(25), + ), + ), + ], + ), + const SizedBox(height: 4), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Image.asset( + 'assets/images/english.png', + width: 30, + height: 30, + ), + const SizedBox(width: 4), + SizedBox( + width: progressBarWidth, + height: 10, + child: LinearProgressIndicator( + value: 0.7, + backgroundColor: + Theme.of(context).colorScheme.primary, + valueColor: AlwaysStoppedAnimation( + Theme.of(context).colorScheme.tertiary), + borderRadius: BorderRadius.circular(25), + ), + ), + ], + ), + const SizedBox(height: 12), + Text( + lCertification, + style: TextStyle( + fontSize: 20, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Text( + lTrinity, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + Text( + lGoldsmith, + style: TextStyle( + fontSize: sectionBodyFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/sections/my_projects.dart b/lib/pages/sections/my_projects.dart new file mode 100644 index 0000000..19d5952 --- /dev/null +++ b/lib/pages/sections/my_projects.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/utils/globals.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/cards/compose_card.dart'; +import 'package:myportfolio/widgets/cards/flutter_card.dart'; +import 'package:myportfolio/widgets/cards/react_card.dart'; +import 'package:myportfolio/widgets/cards/xml_card.dart'; + +class MyProjects extends StatelessWidget { + const MyProjects({Key? key}) : super(key: key); + + static final GlobalKey componentKey = GlobalKey(); + + @override + Key? get key => componentKey; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double titleFontSize = screenWidth > 800 ? 30 : 20; + double sectionTitleFontSize = screenWidth > 800 ? 24 : 18; + double sectionBodyFontSize = screenWidth > 800 ? 16 : 14; + double dividerIndent = screenWidth > 800 ? 240 : 80; + + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: Container( + key: GlobalKeys.projectsSectionKey, + child: Column( + children: [ + Text( + sProjects.toUpperCase(), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: titleFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Divider( + thickness: 1, + indent: dividerIndent, + endIndent: dividerIndent, + color: Theme.of(context).colorScheme.secondary, + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric( + horizontal: MediaQuery.of(context).size.width * 0.12, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tGithub, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: sectionTitleFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Text( + dGithub, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: sectionBodyFontSize, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 10), + Text( + pFlutter, + style: TextStyle( + fontSize: titleFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const FlutterCards(), + const SizedBox(height: 10), + Text( + pCompose, + style: TextStyle( + fontSize: titleFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const ComposeCards(), + const SizedBox(height: 10), + Text( + pXML, + style: TextStyle( + fontSize: titleFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const XmlCards(), + const SizedBox(height: 10), + Text( + pReact, + style: TextStyle( + fontSize: titleFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const ReactCards(), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/sections/my_skills.dart b/lib/pages/sections/my_skills.dart new file mode 100644 index 0000000..df2ff33 --- /dev/null +++ b/lib/pages/sections/my_skills.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/utils/globals.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/skill_item.dart'; + +class MySkills extends StatelessWidget { + const MySkills({Key? key}) : super(key: key); + + static final GlobalKey componentKey = GlobalKey(); + + @override + Key? get key => componentKey; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double titleFontSize = screenWidth > 800 ? 30 : 20; + double spacing = screenWidth > 800 ? 20 : 10; + double runSpacing = screenWidth > 800 ? 30 : 15; + double dividerIndent = screenWidth > 800 ? 240 : 80; + + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: Column( + children: [ + Text( + sSkills.toUpperCase(), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: titleFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Divider( + thickness: 1, + indent: dividerIndent, + endIndent: dividerIndent, + color: Theme.of(context).colorScheme.secondary, + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric( + horizontal: MediaQuery.of(context).size.width * 0.12), + child: Container( + key: GlobalKeys.skillsSectionKey, + child: Column( + children: [ + Wrap( + alignment: WrapAlignment.center, + spacing: spacing, + runSpacing: runSpacing, + children: [ + SkillItem( + title: sDart, + image: const AssetImage( + 'assets/images/development/dart.png'), + ), + SkillItem( + title: sFlutter, + image: const AssetImage( + 'assets/images/development/flutter.png'), + ), + SkillItem( + title: sFirebase, + image: const AssetImage( + 'assets/images/development/firebase.png'), + ), + SkillItem( + title: sAndroid, + image: const AssetImage( + 'assets/images/development/android.png'), + ), + SkillItem( + title: sKotlin, + image: const AssetImage( + 'assets/images/development/kotlin.png'), + ), + SkillItem( + title: sFigma, + image: const AssetImage( + 'assets/images/development/figma.png'), + ), + SkillItem( + title: sJavascript, + image: const AssetImage( + 'assets/images/development/javascript.png'), + ), + SkillItem( + title: sTypescript, + image: const AssetImage( + 'assets/images/development/typescript.png'), + ), + SkillItem( + title: sHTML, + image: const AssetImage( + 'assets/images/development/html.png'), + ), + SkillItem( + title: sCSS, + image: const AssetImage( + 'assets/images/development/css.png'), + ), + SkillItem( + title: sReact, + image: const AssetImage( + 'assets/images/development/react.png'), + ), + SkillItem( + title: sNode, + image: const AssetImage( + 'assets/images/development/nodejs.png'), + ), + ], + ), + ], + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/sections/my_top.dart b/lib/pages/sections/my_top.dart new file mode 100644 index 0000000..6bc8f0e --- /dev/null +++ b/lib/pages/sections/my_top.dart @@ -0,0 +1,123 @@ +import 'package:flutter/material.dart'; +import 'package:ming_cute_icons/ming_cute_icons.dart'; +import 'package:myportfolio/utils/constants.dart'; +import 'package:myportfolio/utils/globals.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class MyTop extends StatelessWidget { + const MyTop({Key? key}) : super(key: key); + + static final GlobalKey componentKey = GlobalKey(); + + @override + Key? get key => componentKey; + + @override + Widget build(BuildContext context) { + final Uri uriPdf = AppConstants.uriPdf; + + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double imageSize = screenWidth > 1200 + ? 220 + : screenWidth > 800 + ? 180 + : 150; + double nameFontSize = screenWidth > 800 ? 40 : 28; + double jobFontSize = screenWidth > 800 ? 24 : 18; + double buttonWidth = screenWidth > 800 ? 160 : 120; + double buttonHeight = screenWidth > 800 ? 50 : 40; + double buttonFontSize = screenWidth > 800 ? 12 : 10; + + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: Column( + children: [ + Container( + key: GlobalKeys.topSectionKey, + width: imageSize, + height: imageSize, + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Theme.of(context).colorScheme.secondary, + width: 2, + ), + ), + child: ClipOval( + child: Image.asset( + 'assets/images/myPhoto.png', + width: imageSize, + height: imageSize, + fit: BoxFit.cover, + ), + ), + ), + const SizedBox(height: 16), + Text( + me.toUpperCase(), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: nameFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + textAlign: TextAlign.start, + ), + Text( + job.toUpperCase(), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: jobFontSize, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 10), + SizedBox( + width: buttonWidth, + height: buttonHeight, + child: ElevatedButton( + onPressed: () async { + await launchUrl(uriPdf); + }, + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.primary, + backgroundColor: Theme.of(context).colorScheme.secondary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25), + ), + padding: const EdgeInsets.all(12), + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + download, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: buttonFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(width: 8), + Icon( + MingCuteIcons.mgc_arrow_to_down_fill, + size: 18, + color: Theme.of(context).colorScheme.primary, + ), + ], + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/sections/my_works.dart b/lib/pages/sections/my_works.dart new file mode 100644 index 0000000..de8e921 --- /dev/null +++ b/lib/pages/sections/my_works.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/utils/constants.dart'; +import 'package:myportfolio/utils/globals.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/work_container.dart'; + +class MyWorks extends StatelessWidget { + const MyWorks({Key? key}) : super(key: key); + + static final GlobalKey componentKey = GlobalKey(); + + @override + Key? get key => componentKey; + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double titleFontSize = screenWidth > 800 ? 30 : 20; + double sectionTitleFontSize = screenWidth > 800 ? 24 : 18; + double sectionBodyFontSize = screenWidth > 800 ? 16 : 14; + double dividerIndent = screenWidth > 800 ? 240 : 80; + + return Material( + color: Theme.of(context).colorScheme.surface, + child: Center( + child: Container( + key: GlobalKeys.worksSectionKey, + child: Column( + children: [ + Text( + sWorks.toUpperCase(), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: titleFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Divider( + thickness: 1, + indent: dividerIndent, + endIndent: dividerIndent, + color: Theme.of(context).colorScheme.secondary, + ), + const SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric( + horizontal: MediaQuery.of(context).size.width * 0.12, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + tArethusa, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: sectionTitleFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(width: 10), + Text( + dTime, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 12, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 10), + Text( + dArethusa, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: sectionBodyFontSize, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: WorkContainer( + title: tDiggerly, + description: dDiggerly, + url: AppConstants.uriDiggerly, + ), + ), + Expanded( + child: WorkContainer( + title: tReasset, + description: dReasset, + url: AppConstants.uriReasset, + ), + ), + Expanded( + child: WorkContainer( + title: tCADS, + description: dCADS, + url: AppConstants.uriCads, + ), + ), + ], + ), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/pages/works/works_large.dart b/lib/pages/works/works_large.dart deleted file mode 100644 index d8af0c4..0000000 --- a/lib/pages/works/works_large.dart +++ /dev/null @@ -1,457 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/bottom_bar.dart'; -import 'package:ndenicolais/widgets/top_bar.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class WorksPageLarge extends StatelessWidget { - const WorksPageLarge({super.key}); - - @override - Widget build(BuildContext context) { - final Uri uriDiggerly = Uri.parse('https://rsi-na.it/diggerly/'); - final Uri uriReasset = - Uri.parse('https://rsi-na.it/progetto-di-ricerca-reasset/'); - final Uri uriCads = Uri.parse('https://rsi-na.it/progetto-cads/'); - - return Material( - child: ListView( - children: [ - const MyTopBar(), - Padding( - padding: const EdgeInsets.symmetric(vertical: 40), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'MY', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 140, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - 'WORKS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 140, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - ], - ), - const SizedBox(height: 40), - Divider( - thickness: 1, - indent: 250, - endIndent: 250, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 40), - Text( - 'My works experience', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 24, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 40), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 320), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Arethusa Srl', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 30, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - 'Software Developer', - style: TextStyle( - fontSize: 24, - color: Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Container( - height: 40, - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), - border: Border.all( - color: - Theme.of(context).colorScheme.secondary, - width: 2, - ), - ), - child: Text( - '2022-2023', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 12, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - Text( - arethusa, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - Text( - 'DIGGERly', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - diggerly, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriDiggerly); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - const SizedBox(height: 20), - Text( - 'ReASSET', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - reasset, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriReasset); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - const SizedBox(height: 20), - Text( - 'CADS', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - cads, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriCads); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - // const SizedBox(height: 22), - // Text( - // 'Studio Fotografico Rosati Studio', - // style: TextStyle( - // color: - // Theme.of(context).colorScheme.secondary, - // fontSize: 30, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Assitente fotografo', - // style: TextStyle( - // fontSize: 24, - // color: - // Theme.of(context).colorScheme.tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 40, - // padding: const EdgeInsets.all(10), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: - // Theme.of(context).colorScheme.secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2015', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 12, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // rosati, - // style: TextStyle( - // fontSize: 16, - // color: - // Theme.of(context).colorScheme.secondary, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 8), - // Text( - // 'Okaidi', - // style: TextStyle( - // color: - // Theme.of(context).colorScheme.secondary, - // fontSize: 30, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Addetto inventario', - // style: TextStyle( - // fontSize: 24, - // color: - // Theme.of(context).colorScheme.tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 40, - // padding: const EdgeInsets.all(10), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: - // Theme.of(context).colorScheme.secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2010', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 12, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // okaidi, - // style: TextStyle( - // fontSize: 16, - // color: - // Theme.of(context).colorScheme.secondary, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 8), - // Text( - // 'Benevento Città Spettacolo', - // style: TextStyle( - // color: - // Theme.of(context).colorScheme.secondary, - // fontSize: 30, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Steward eventi', - // style: TextStyle( - // fontSize: 24, - // color: - // Theme.of(context).colorScheme.tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 40, - // padding: const EdgeInsets.all(10), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: - // Theme.of(context).colorScheme.secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2009, 2010, 2011', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 12, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // spettacolo, - // style: TextStyle( - // fontSize: 16, - // color: - // Theme.of(context).colorScheme.secondary, - // fontFamily: 'CustomFont'), - // ), - ], - ), - ), - ], - ), - ), - ), - const SizedBox(height: 40), - ], - ), - ), - MyBottomBar(), - ], - ), - ); - } -} diff --git a/lib/pages/works/works_medium.dart b/lib/pages/works/works_medium.dart deleted file mode 100644 index f6d9871..0000000 --- a/lib/pages/works/works_medium.dart +++ /dev/null @@ -1,457 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/bottom_bar.dart'; -import 'package:ndenicolais/widgets/top_bar.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class WorksPageMedium extends StatelessWidget { - const WorksPageMedium({super.key}); - - @override - Widget build(BuildContext context) { - final Uri uriDiggerly = Uri.parse('https://rsi-na.it/diggerly/'); - final Uri uriReasset = - Uri.parse('https://rsi-na.it/progetto-di-ricerca-reasset/'); - final Uri uriCads = Uri.parse('https://rsi-na.it/progetto-cads/'); - - return Material( - child: ListView( - children: [ - const MyTopBar(), - Padding( - padding: const EdgeInsets.symmetric(vertical: 30), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'MY', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 100, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - 'WORKS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 100, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - ], - ), - const SizedBox(height: 30), - Divider( - thickness: 1, - indent: 180, - endIndent: 180, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 30), - Text( - 'My works experience', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 24, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 180), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Arethusa Srl', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 30, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - 'Software Developer', - style: TextStyle( - fontSize: 24, - color: Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Container( - height: 40, - padding: const EdgeInsets.all(10), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), - border: Border.all( - color: - Theme.of(context).colorScheme.secondary, - width: 2, - ), - ), - child: Text( - '2022-2023', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 12, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - Text( - arethusa, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - Text( - 'DIGGERly', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - diggerly, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriDiggerly); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - const SizedBox(height: 20), - Text( - 'ReASSET', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - reasset, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriReasset); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - const SizedBox(height: 20), - Text( - 'CADS', - style: TextStyle( - fontSize: 30, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - cads, - style: TextStyle( - fontSize: 16, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 40, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriCads); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: - Theme.of(context).colorScheme.secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - // const SizedBox(height: 22), - // Text( - // 'Studio Fotografico Rosati Studio', - // style: TextStyle( - // color: - // Theme.of(context).colorScheme.secondary, - // fontSize: 30, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Assitente fotografo', - // style: TextStyle( - // fontSize: 24, - // color: - // Theme.of(context).colorScheme.tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 40, - // padding: const EdgeInsets.all(10), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: - // Theme.of(context).colorScheme.secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2015', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 12, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // rosati, - // style: TextStyle( - // fontSize: 16, - // color: - // Theme.of(context).colorScheme.secondary, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 8), - // Text( - // 'Okaidi', - // style: TextStyle( - // color: - // Theme.of(context).colorScheme.secondary, - // fontSize: 30, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Addetto inventario', - // style: TextStyle( - // fontSize: 24, - // color: - // Theme.of(context).colorScheme.tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 40, - // padding: const EdgeInsets.all(10), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: - // Theme.of(context).colorScheme.secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2010', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 12, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // okaidi, - // style: TextStyle( - // fontSize: 16, - // color: - // Theme.of(context).colorScheme.secondary, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 8), - // Text( - // 'Benevento Città Spettacolo', - // style: TextStyle( - // color: - // Theme.of(context).colorScheme.secondary, - // fontSize: 30, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Steward eventi', - // style: TextStyle( - // fontSize: 24, - // color: - // Theme.of(context).colorScheme.tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 40, - // padding: const EdgeInsets.all(10), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: - // Theme.of(context).colorScheme.secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2009, 2010, 2011', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 12, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // spettacolo, - // style: TextStyle( - // fontSize: 16, - // color: - // Theme.of(context).colorScheme.secondary, - // fontFamily: 'CustomFont'), - // ), - ], - ), - ), - ], - ), - ), - ), - const SizedBox(height: 30), - ], - ), - ), - MyBottomBar(), - ], - ), - ); - } -} diff --git a/lib/pages/works/works_small.dart b/lib/pages/works/works_small.dart deleted file mode 100644 index afe98b1..0000000 --- a/lib/pages/works/works_small.dart +++ /dev/null @@ -1,500 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/providers/theme_notifier.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:ndenicolais/widgets/drawer.dart'; -import 'package:provider/provider.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class WorksPageSmall extends StatefulWidget { - const WorksPageSmall({super.key}); - - @override - WorksPageSmallState createState() => WorksPageSmallState(); -} - -class WorksPageSmallState extends State { - @override - Widget build(BuildContext context) { - final themeNotifier = Provider.of(context); - final isDarkMode = themeNotifier.currentTheme == ThemeNotifier.darkTheme; - final Uri uriDiggerly = Uri.parse('https://rsi-na.it/diggerly/'); - final Uri uriReasset = - Uri.parse('https://rsi-na.it/progetto-di-ricerca-reasset/'); - final Uri uriCads = Uri.parse('https://rsi-na.it/progetto-cads/'); - - return Scaffold( - appBar: AppBar( - elevation: 0, - backgroundColor: Theme.of(context).colorScheme.secondary, - title: Text( - 'ndenicolais', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontSize: 20, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - drawer: MyDrawer(isDarkMode: isDarkMode, themeNotifier: themeNotifier), - body: Material( - child: ListView( - children: [ - Padding( - padding: const EdgeInsets.symmetric(vertical: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'MY', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 60, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - Text( - 'WORKS', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 60, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - textAlign: TextAlign.start, - ), - ], - ), - const SizedBox(height: 30), - Divider( - thickness: 1, - indent: 35, - endIndent: 35, - color: Theme.of(context).colorScheme.secondary, - ), - const SizedBox(height: 30), - Text( - 'My works experience', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 18, - fontFamily: 'CustomFont', - ), - ), - const SizedBox(height: 30), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: Center( - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Flexible( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - 'Arethusa Srl', - style: TextStyle( - color: - Theme.of(context).colorScheme.secondary, - fontSize: 24, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Text( - 'Software Developer', - style: TextStyle( - fontSize: 18, - color: - Theme.of(context).colorScheme.tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - Container( - height: 30, - padding: const EdgeInsets.all(6), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(25), - border: Border.all( - color: Theme.of(context) - .colorScheme - .secondary, - width: 2, - ), - ), - child: Text( - '2022-2023', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .secondary, - fontSize: 10, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - Text( - arethusa, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - Text( - 'DIGGERly', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - diggerly, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 30, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriDiggerly); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: Theme.of(context) - .colorScheme - .secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - const SizedBox(height: 20), - Text( - 'ReASSET', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - reasset, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 30, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriReasset); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: Theme.of(context) - .colorScheme - .secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - const SizedBox(height: 20), - Text( - 'CADS', - style: TextStyle( - fontSize: 18, - color: Theme.of(context) - .colorScheme - .tertiary, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Text( - cads, - style: TextStyle( - fontSize: 14, - color: - Theme.of(context).colorScheme.secondary, - fontFamily: 'CustomFont', - ), - ), - SizedBox( - width: 100, - height: 30, - child: ElevatedButton.icon( - onPressed: () async { - await launchUrl(uriCads); - }, - icon: Icon( - FontAwesomeIcons.link, - size: 14, - color: - Theme.of(context).colorScheme.primary, - ), - label: Text( - 'Link', - style: TextStyle( - color: Theme.of(context) - .colorScheme - .primary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - style: ElevatedButton.styleFrom( - foregroundColor: - Theme.of(context).colorScheme.primary, - backgroundColor: Theme.of(context) - .colorScheme - .secondary, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(25), - ), - ), - ), - ), - // const SizedBox(height: 22), - // Text( - // 'Studio Fotografico Rosati Studio', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 24, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Assitente fotografo', - // style: TextStyle( - // fontSize: 18, - // color: Theme.of(context) - // .colorScheme - // .tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 30, - // padding: const EdgeInsets.all(6), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2015', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 10, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // rosati, - // style: TextStyle( - // fontSize: 14, - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 8), - // Text( - // 'Okaidi', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 24, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Addetto inventario', - // style: TextStyle( - // fontSize: 18, - // color: Theme.of(context) - // .colorScheme - // .tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 30, - // padding: const EdgeInsets.all(6), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2010', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 10, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // okaidi, - // style: TextStyle( - // fontSize: 14, - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 8), - // Text( - // 'Benevento Città Spettacolo', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 24, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // Text( - // 'Steward eventi', - // style: TextStyle( - // fontSize: 18, - // color: Theme.of(context) - // .colorScheme - // .tertiary, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // const SizedBox(height: 6), - // Container( - // height: 30, - // padding: const EdgeInsets.all(6), - // decoration: BoxDecoration( - // borderRadius: BorderRadius.circular(25), - // border: Border.all( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // width: 2, - // ), - // ), - // child: Text( - // '2009, 2010, 2011', - // style: TextStyle( - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontSize: 10, - // fontWeight: FontWeight.bold, - // fontFamily: 'CustomFont'), - // ), - // ), - // const SizedBox(height: 8), - // Text( - // spettacolo, - // style: TextStyle( - // fontSize: 14, - // color: Theme.of(context) - // .colorScheme - // .secondary, - // fontFamily: 'CustomFont'), - // ), - ], - ), - ), - ], - ), - ), - ), - const SizedBox(height: 30), - ], - ), - ), - ], - ), - ), - ); - } -} diff --git a/lib/providers/theme_notifier.dart b/lib/providers/theme_notifier.dart deleted file mode 100644 index c3a86b8..0000000 --- a/lib/providers/theme_notifier.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:ndenicolais/theme/app_theme.dart'; -import 'package:shared_preferences/shared_preferences.dart'; - -// class ThemeNotifier extends ChangeNotifier { -// ThemeData _currentTheme = -// AppTheme.lightTheme(); // Imposta il tema predefinito - -// ThemeData get currentTheme => _currentTheme; - -// // Metodo per cambiare il tema -// void toggleTheme() { -// _currentTheme = (_currentTheme == AppTheme.lightTheme()) -// ? AppTheme.darkTheme() -// : AppTheme.lightTheme(); - -// // Notifica i widget interessati che il tema è cambiato -// notifyListeners(); -// } -// } - -class ThemeNotifier with ChangeNotifier { - ThemeData _currentTheme; - - ThemeNotifier(this._currentTheme); - - ThemeData get currentTheme => _currentTheme; - - ThemeData getTheme() { - return _currentTheme; - } - - ThemeData getDarkTheme() { - return darkTheme; - } - - ThemeMode getThemeMode() { - return _currentTheme == darkTheme ? ThemeMode.dark : ThemeMode.light; - } - - Future toggleTheme() async { - _currentTheme = _currentTheme == lightTheme ? darkTheme : lightTheme; - notifyListeners(); - - // Salva il tema utilizzando SharedPreferences - final prefs = await SharedPreferences.getInstance(); - await prefs.setBool('isDarkMode', _currentTheme == darkTheme); - } - - static final lightTheme = AppTheme.lightTheme(); - static final darkTheme = AppTheme.darkTheme(); -} diff --git a/lib/routes.dart b/lib/routes.dart deleted file mode 100644 index 353d6ea..0000000 --- a/lib/routes.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:ndenicolais/utils/responsive_layout.dart'; - -class Routes { - static const String intro = '/intro'; - static const String home = '/home'; - static const String works = '/works'; - static const String projects = '/projects'; - - static Map getRoutes() { - return { - intro: (context) => buildIntroBody(context), - home: (context) => buildHomeBody(context), - works: (context) => buildWorksBody(context), - projects: (context) => buildProjectsBody(context) - }; - } -} diff --git a/lib/theme/app_colors.dart b/lib/theme/app_colors.dart index ca15e0c..57b80ba 100644 --- a/lib/theme/app_colors.dart +++ b/lib/theme/app_colors.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; class AppColors { - static const Color lightYellow = Color(0xFFFFF3E0); - static const Color darkGrey = Color(0xFF3C3E4B); + static const Color lightYellow = Color(0xFFFFFDF9); + static const Color darkGrey = Color(0xFF3D3F4D); static const Color lightSand = Color(0xFF979468); - static const Color darkYellow = Color(0xFFFBCB7B); + static const Color darkYellow = Color(0xFFCCA775); static const Color error = Color(0xFFD23453); static const Color white = Colors.white; static const Color black = Colors.black; diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 1eca6e6..2ca9915 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -1,5 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:ndenicolais/theme/app_colors.dart'; +import 'package:myportfolio/theme/app_colors.dart'; class AppTheme { static ThemeData lightTheme() { @@ -11,10 +11,8 @@ class AppTheme { onSecondary: AppColors.lightYellow, tertiary: AppColors.lightSand, onTertiary: AppColors.darkYellow, - background: AppColors.lightYellow, - onBackground: AppColors.darkGrey, - surface: AppColors.darkGrey, - onSurface: AppColors.lightYellow, + surface: AppColors.lightYellow, + onSurface: AppColors.darkGrey, onError: AppColors.error, ), ); @@ -29,9 +27,7 @@ class AppTheme { onSecondary: AppColors.darkGrey, tertiary: AppColors.darkYellow, onTertiary: AppColors.lightSand, - background: AppColors.darkGrey, - onBackground: AppColors.lightYellow, - surface: AppColors.lightYellow, + surface: AppColors.darkGrey, onSurface: AppColors.darkGrey, onError: AppColors.error, ), diff --git a/lib/theme/theme_notifier.dart b/lib/theme/theme_notifier.dart new file mode 100644 index 0000000..8983a1d --- /dev/null +++ b/lib/theme/theme_notifier.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; +import 'package:myportfolio/theme/app_theme.dart'; + +class ThemeNotifier with ChangeNotifier { + ThemeData _currentTheme; + bool _isDarkMode; + bool _isManualTheme; + + ThemeNotifier(this._currentTheme, this._isDarkMode) : _isManualTheme = false; + + ThemeData get currentTheme => _currentTheme; + bool get isDarkMode => _isDarkMode; + + void switchTheme() { + _isManualTheme = true; + if (_isDarkMode) { + _currentTheme = AppTheme.lightTheme(); + _isDarkMode = false; + } else { + _currentTheme = AppTheme.darkTheme(); + _isDarkMode = true; + } + notifyListeners(); + } + + void setLightTheme() { + _isManualTheme = true; + _currentTheme = AppTheme.lightTheme(); + _isDarkMode = false; + notifyListeners(); + } + + void setDarkTheme() { + _isManualTheme = true; + _currentTheme = AppTheme.darkTheme(); + _isDarkMode = true; + notifyListeners(); + } + + void resetManualTheme() { + _isManualTheme = false; + } + + bool get isManualTheme => _isManualTheme; +} diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart new file mode 100644 index 0000000..5a7e4fd --- /dev/null +++ b/lib/utils/constants.dart @@ -0,0 +1,16 @@ +class AppConstants { + static final Uri uriMail = Uri( + scheme: 'mailto', + path: 'n.denicolais@outlook.it', + ); + static final Uri uriLinkedin = + Uri.parse('https://it.linkedin.com/in/nicoladenicolais'); + static final Uri uriGithub = Uri.parse('https://github.com/ndenicolais'); + static final Uri uriPdf = Uri.parse( + 'https://drive.google.com/file/d/1XY10jnOqsJbNAeiPJV00Pw8LfErro5TI/view', + ); + static const String uriDiggerly = 'https://rsi-na.it/diggerly/'; + static const String uriReasset = + 'https://rsi-na.it/progetto-di-ricerca-reasset/'; + static const String uriCads = 'https://rsi-na.it/progetto-cads/'; +} diff --git a/lib/utils/globals.dart b/lib/utils/globals.dart new file mode 100644 index 0000000..1cf27a1 --- /dev/null +++ b/lib/utils/globals.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; + +class GlobalKeys { + static final GlobalKey topSectionKey = GlobalKey(); + static final GlobalKey aboutSectionKey = GlobalKey(); + static final GlobalKey skillsSectionKey = GlobalKey(); + static final GlobalKey worksSectionKey = GlobalKey(); + static final GlobalKey projectsSectionKey = GlobalKey(); +} diff --git a/lib/utils/responsive_layout.dart b/lib/utils/responsive_layout.dart deleted file mode 100644 index 4f14943..0000000 --- a/lib/utils/responsive_layout.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:flutter/material.dart'; -// import 'package:logger/logger.dart'; -import 'package:ndenicolais/pages/home/home_large.dart'; -import 'package:ndenicolais/pages/home/home_medium.dart'; -import 'package:ndenicolais/pages/home/home_small.dart'; -import 'package:ndenicolais/pages/intro/intro_large.dart'; -import 'package:ndenicolais/pages/intro/intro_medium.dart'; -import 'package:ndenicolais/pages/intro/intro_small.dart'; -import 'package:ndenicolais/pages/projects/projects_large.dart'; -import 'package:ndenicolais/pages/projects/projects_medium.dart'; -import 'package:ndenicolais/pages/projects/projects_small.dart'; -import 'package:ndenicolais/pages/works/works_large.dart'; -import 'package:ndenicolais/pages/works/works_medium.dart'; -import 'package:ndenicolais/pages/works/works_small.dart'; - -// var logger = Logger(); - -class ResponsiveLayout { - static bool isLargeScreen(BuildContext context) { - return MediaQuery.of(context).size.width > 1200; - } - - static bool isMediumScreen(BuildContext context) { - return MediaQuery.of(context).size.width <= 1200 && - MediaQuery.of(context).size.width > 600; - } - - static bool isSmallScreen(BuildContext context) { - return MediaQuery.of(context).size.width <= 600; - } -} - -Widget buildIntroBody(BuildContext context) { - if (ResponsiveLayout.isLargeScreen(context)) { - // logger.d('Large Screen - Width: ${MediaQuery.of(context).size.width}'); - return const IntroPageLarge(); - } else if (ResponsiveLayout.isMediumScreen(context)) { - // logger.d('Medium Screen - Width: ${MediaQuery.of(context).size.width}'); - return const IntroPageMedium(); - } else { - // logger.d('Small Screen - Width: ${MediaQuery.of(context).size.width}'); - return const IntroPageSmall(); - } -} - -Widget buildHomeBody(BuildContext context) { - if (ResponsiveLayout.isLargeScreen(context)) { - // logger.d('Large Screen - Width: ${MediaQuery.of(context).size.width}'); - return const HomePageLarge(); - } else if (ResponsiveLayout.isMediumScreen(context)) { - // logger.d('Medium Screen - Width: ${MediaQuery.of(context).size.width}'); - return const HomePageMedium(); - } else { - // logger.d('Small Screen - Width: ${MediaQuery.of(context).size.width}'); - return const HomePageSmall(); - } -} - -Widget buildWorksBody(BuildContext context) { - if (ResponsiveLayout.isLargeScreen(context)) { - // logger.d('Large Screen - Width: ${MediaQuery.of(context).size.width}'); - return const WorksPageLarge(); - } else if (ResponsiveLayout.isMediumScreen(context)) { - // logger.d('Medium Screen - Width: ${MediaQuery.of(context).size.width}'); - return const WorksPageMedium(); - } else { - // logger.d('Small Screen - Width: ${MediaQuery.of(context).size.width}'); - return const WorksPageSmall(); - } -} - -Widget buildProjectsBody(BuildContext context) { - if (ResponsiveLayout.isLargeScreen(context)) { - // logger.d('Large Screen - Width: ${MediaQuery.of(context).size.width}'); - return const ProjectsPageLarge(); - } else if (ResponsiveLayout.isMediumScreen(context)) { - // logger.d('Medium Screen - Width: ${MediaQuery.of(context).size.width}'); - return const ProjectsPageMedium(); - } else { - // logger.d('Small Screen - Width: ${MediaQuery.of(context).size.width}'); - return const ProjectsPageSmall(); - } -} diff --git a/lib/utils/strings.dart b/lib/utils/strings.dart index e3c741c..fed6c64 100644 --- a/lib/utils/strings.dart +++ b/lib/utils/strings.dart @@ -1,145 +1,188 @@ -// HOME PAGE -String description = ''' -Sono uno sviluppatore software con esperienza sia nel campo delle applicazioni mobile Android nativo che cross-platform. Ho sviluppato app Android utilizzando Kotlin, sia con XML Layouts che con Jetpack Compose, oltre a creare app cross-platform con Flutter utilizzando il linguaggio Dart. -'''; -String arethusa = ''' -Ho lavorato nel reparto di Ricerca, Sviluppo & Innovazione (RSI) interno alla società Arethusa Srl. Ho partecipato alla realizzazione di tre Progetti di Ricerca finanziati dalla Regione Campania e dal MISE: ReASSET, DIGGERly e CADS. -Per questi progetti ho contribuito a: -• Sviluppo di software web, desktop e mobile utilizzando diversi linguaggi di programmazione / piattaforme / tecnologie; -• Collaborazione con team di sviluppo e di progettazione per garantire la qualità del prodotto; -• Analisi dei requisiti e progettazione di soluzioni; -• Redazione di doumentazione tecnica. -'''; -String diggerly = ''' -Progetto di scale-up di maturità tecnologica (da TRL 4 a TRL 7) di un prototipo di piattaforma innovativa finalizzata all' acquisizione digitale dello stato di consistenza (censimento), alla generazione dell' anagrafica tecnica ed al “tracciamento & confronto” periodico degli scenari di “cambiamento” (aggiornamento) degli asset oggetto di manutenzione mediante l'utilizzo di uno smartphone con l' acquisizione di media (foto, video, audio) e con l' ausilio dell' intelligenza artificiale (image recognition, text-recognition, etc.) -DIGGERly è una smart app, user friendly ed ecosostenibile, che consente di “catturare” con un semplice smartphone, componenti di asset edili e impiantistici, nello spazio di tempo necessario di una “passeggiata” per localizzare gli asset di interesse in un edificio. -'''; -String reasset = ''' -Piattaforma tecnologica MaaS (Maintenance as a Service) basata sull' utilizzo integrato di IoT-Blockchain, per la condivisione interoperativa e trasparente di informazioni autenticate e protette, riguardanti la valorizzazione e la gestione operativa in tempo Reale degli ASSET tecnico-impiantistici e delle transazioni tecnico-economiche relative alle interazioni tra i diversi soggetti coinvolti nell'intera filiera del Facility Management. -ReASSET è piattaforma tecnologica “as a Service” per la fornitura di servizi innovativi nell’ambito del Facility Management e della digitalizzazione degli asset immobiliari, secondo un nuovo modello organizzativo “win-win” che massimizza il valore e minimizza gli sprechi. -'''; -String cads = ''' -Progetto finalizzato allo sviluppo di procedure standardizzate di progettazione, sviluppo, monitoraggio e certificazione di elementi non strutturali intelligenti e tecnologicamente avanzati che siano in grado di rispondere a situazione estreme garantendo la sicurezza degli ambienti domestici mediante l' utilizzo della domotica e del building automation. -In CADS è stata sviluppata una smart app "DIGENS" in SaaS progettata e implementata con la finalità di realizzare uno strumento di rapida rilevazione, registrazione e valutazione quali-quantitativa dello stato di consistenza e di pericolosità degli elementi non strutturali (ENS), nel loro contesto (ubicazione), nel caso eventi sismici e di sollecitazioni importanti. -'''; +// GLOBALS +String me = 'Nicola De Nicolais'; +String copyright = '© 2024 Nicola De Nicolais'; -// // WORKS PAGE -// String rosati = ''' -// • Responsabile della gestione e trasporto dell'attrezzatura fotografica durante le riprese; -// • Assistenza al montaggio delle attrezzature e degli strumenti in luoghi mobili; -// • Aiuto nello sviluppo pellicole fotografiche; -// • Responsabile della gestione e pulizia regolare di tutte le attrezzature fotografiche; -// • Cura dell'esposizione merce. -// '''; -// String okaidi = ''' -// • Gestione dell'inventario; -// • Identificazione e rimozione prodotti in deposito; -// • Gestione e report dei prodotti presenti nel punto vendita; -// • Organizzazione e riordino dei prodotti presenti nel punto vendita. -// '''; -// String spettacolo = ''' -// • Allestimento dei locali per il congresso con predisposizione del materiale utile ai partecipanti; -// • Gestione degli aspetti logistici per il trasferimento dei partecipanti verso il luogo dove si svolge l' evento; -// • Accoglienza e assistenza clienti. -// '''; +// TOP BAR +String tTitle = 'My Portfolio'; +String tDrawer = 'NDN'; +String tTop = 'Top'; +String tAbout = 'About me'; +String tSkills = 'Skills'; +String tWorks = 'Work'; +String tProjects = 'Projects'; -// PROJECTS PAGE -String github = ''' -Su GitHub sono presenti tutti i progetti e le applicazioni che ho sviluppato sin dall'inizio della mia carriera da software developer. La mia esperienza ha avuto inizio con la creazione di PWA (Progressive Web Application) utilizzando i linguaggi JavaScript e TypeScript con framework React.js, con backend sviluppato in Node.js con Express.js. Successivamente ho ampliato il mio campo di competenza nel settore dello sviluppo Android utilizzando il suo linguaggio nativo Kotlin. All'inizio, ho creato applicazioni con una UI basata sugli XML Layouts e, in seguito, ho adottato il toolkit Jetpack Compose, che utilizzo per lo sviluppo delle mie applicazioni Android. Inoltre, al fine di coprire lo sviluppo mobile multi-piattaforma, ho esteso le mie competenze a Dart e Flutter per lo sviluppo di app mobile per Android e multi-platform. -'''; -String android = ''' -Applicazioni per dispositivi mobile Android e Multi-platform. -'''; -String flutter = ''' -Applicazioni sviluppate con linguaggio Dart e framework Flutter con Visual Studio Code -'''; +// DRAWER +String dTop = 'Top'; +String dAbout = 'About me'; +String dSkills = 'Skills'; +String dWorks = 'Work'; +String dProjects = 'Projects'; +String dTheme = 'Theme'; -// COMPOSE -String compose = ''' -Applicazioni sviluppate con linguaggio Kotlin e framework Jetpack Compose con Android Studio -'''; -String cRecorder = ''' -App che permette di registrare la voce di ingresso tramite la classe MediaRecorder e salva la registrazione in un file .mp3. -'''; -String cContact = ''' -App che mostra come eseguire le operazioni CRUD nel database della stanza utilizzando componenti di architettura Android e il modello di architettura MVVM. -'''; -String cScanner = ''' -App che consente di scansionare codici QR e codici a barre. Nell'app è possibile copiare il contenuto del codice e condividerlo con altre applicazioni. -'''; -String cSpeechAndText = ''' -App che mostra come utilizzare le funzioni di conversione Speech-to-Text e Text-to-Speech salvando i file convertiti. -'''; -String cPhotoPicker = ''' -App che consente di selezionare una foto o più foto dall'archivio dello smartphone. -'''; -String cOnboarding = ''' -App che mostra come creare un tutorial iniziale per visualizzare le funzionalità dell'app. -'''; -String cLanguageSelector = ''' -App che consente di selezionare la lingua del testo visualizzato utilizzando quelle localmente create nell'app. -'''; -String cStopwatch = ''' -App che consente di calcolare il tempo trascorso in una determinata attività. Il tempo può essere avviato, interrotto e ripreso. -'''; -String cCountdownTimer = ''' -App che permette di impostare un conto alla rovescia per un certo periodo di tempo. Il tempo può essere avviato, fermato e ripreso. -'''; -String cEggCounter = ''' -App che conta il numero di volte in cui fai clic sull'icona di un uovo che cambia il suo colore ogni volta viene cliccato. -'''; -String cDarkMode = ''' -App che consente di switchare il tema dell'app passando passando da una modalità chiara a scura e viceversa. -'''; +// MY TOP +String job = 'Software Developer'; +String download = 'Download CV'; -// XML -String xml = ''' -Applicazioni sviluppate con linguaggio Kotlin e framework XML Layouts con Android Studio -'''; -String xAnimations = ''' -Elenco di animazioni che possono essere applicate a Views, Surfaces, o altri oggetti. -'''; -String xToastMessage = ''' -Toast personalizzabile per inviare un messaggio popup all'interno dell'app. -'''; -String xOnBoarding = ''' -Schermata di onBoarding personalizzata per essere usata come intro di un app. -'''; -String xDarkMode = ''' -App che consente di switchare il tema dell'app passando passando da una modalità chiara a scura e viceversa. -'''; -String xFolderCreation = ''' -App che mostra come creare una cartella in External Storage con autorizzazioni per tutte le versioni di Android. -'''; -String xSQLite = ''' -App che mostra come utilizzare SQLite Database per inserire, selezionare, aggiornare, eliminare e visualizzare i dati nel RecyclerView. -'''; -String xSwitchLanguage = ''' -App che mostra come modificare la lingua dell'applicazione utilizzando un elenco e uno spinner. -'''; -String xRecorder = ''' -App che utilizza la classe MediaRecorder per registrare audio e riprodurlo sullo smartphone. -'''; -String xSpeechToText = ''' -App che consente di eseguire una registrazione audio e poi trascriverla in file di testo .txt. -'''; -String xSensors = ''' -App che contiene un elenco di funzioni per rilevare le misurazioni utilizzando i sensori dei dispositivi Android. -'''; +// MY BIO +String sAbout = 'About me'; +String tBio = 'Bio'; +String description = + 'I am a software developer with experience in research and development. During this experience I started developing Android applications. I developed both using the native language Kotlin with XML Layouts and Jetpack Compose and the language Dart with Flutter. Additionally, I use Figma to design app structures before converting them into code. In this period I am refining my skills developing with Flutter.'; +String tEducation = 'Education'; +String eDiploma = 'Scientific Diploma'; +String eLiceo = 'Liceo Scientifico G. Rummo di Benevento'; +String eBachelor = 'Computer Engineering Bachelor'; +String eUni = 'Università degli Studi Guglielmo Marconi di Roma'; +String tLanguages = 'Languages'; +String lCertification = 'B2 English Language Certification'; +String lTrinity = '2008 | Trinity Hall College of Dublin'; +String lGoldsmith = '2007 | Goldsmiths College of London'; -// REACT -String react = ''' -Applicazioni sviluppate con linguaggio TypeScript e framework React Native con Visual Studio Code -'''; -String rPWA = ''' -PWA creata con Vite.js basato su React con l'integrazione di React Router. -'''; -String rQR = ''' -Generatore di codice QR basato su React con l'integrazione di React Router. -'''; -String rPassword = ''' -Generatore di password basato su React con l'integrazione di React Router. -'''; -String rClock = ''' -Orologio digitale e calendario basato su React con l'integrazione di React Router. +// MY SKILLS +String sSkills = 'My Skills'; +String sDart = 'Dart'; +String sFlutter = 'Flutter'; +String sFirebase = 'Firebase'; +String sAndroid = 'Android'; +String sKotlin = 'Kotlin'; +String sFigma = 'Figma'; +String sJavascript = 'Javascript'; +String sTypescript = 'Typescript'; +String sHTML = 'HTML'; +String sCSS = 'CSS'; +String sReact = 'React'; +String sNode = 'Node.js'; + +// MY WORKS +String sWorks = 'My Works'; +String tArethusa = 'Arethusa'; +String dTime = '2022-2023'; +String dArethusa = ''' +I worked in the Research, Development & Innovation (RSI) department of Arethusa Srl. I participated in the implementation of three Research Projects financed by the Campania Region and MISE: ReASSET, DIGGERly and CADS. +In DIGGERly and CADS projects I participated in the creation of smart Android apps with both Kotlin and Dart languages. +For all these projects I contributed to: +• Development of web, desktop and mobile software using different programming languages/platforms/technologies; +• Collaboration with development and design teams to ensure product quality; +• Requirements analysis and solution design; +• Drafting of technical documentation. +'''; +String tDiggerly = 'DIGGERly'; +String dDiggerly = ''' +DIGERly is a smart app, user friendly and eco-friendly, that allows you to "capture" with a simple smartphone, building assets components and plants, in the time needed for a "walk" to locate the assets of interest in a building. +'''; +String tReasset = 'ReASSET'; +String dReasset = ''' +ReASSET is a technology platform for the provision of innovative services in the field of Facility Management and digitisation of real estate assets, according to a new organizational model "win-win" that maximizes value and minimises waste. +'''; +String tCADS = 'CADS'; +String dCADS = ''' +In CADS a smart app DIGENS was developed for the rapid identification, recording and qualitative-quantitative evaluation of the consistency and danger status of non-structural elements, in their context, in case of seismic events and major stresses. +'''; +String link = 'Link'; + +// MY PROJECTS +String sProjects = 'My Projects'; +String tGithub = 'Github'; +String dGithub = ''' +GitHub has all the projects and applications I've developed since the beginning of my career as a software developer. My experience started with the creation of PWA (Progressive Web Application) using JavaScript and TypeScript languages with framework React.js, with backend developed in Node.js with Express.js. Later I expanded my field of expertise in the area of Android development using its native language Kotlin. At first, I created applications with a UI based on the XML Layouts and then adopted the Jetpack Compose toolkit, which I use for my Android application development. In addition, in order to cover multi-platform mobile development, I have extended my skills to Dart and Flutter for the development of mobile apps for Android and multi-platform. '''; + +// Flutter +String pFlutter = 'Flutter'; +String ftitShox = 'Shox'; +String fdesShox = + 'This application allows you to create a digital wardrobe where you can save and view all your Shoes.'; +String ftitPortfolio = 'My Portfolio'; +String fdesPortfolio = 'This is my Flutter multi-platform Portfolio.'; + +// Jetpack Compose +String pCompose = 'Jetpack Compose'; +String composeTitRecorder = 'Recorder'; +String composeDesRecorder = + 'App that allows you to record the input voice through the MediaRecorder class and saves the recording in a file . mp3.'; +String composeTitScanner = 'Scanner Code'; +String composeDesScanner = + 'App that allows you to scan QR codes and barcodes. In the app you can copy the code content and share it with other applications.'; +String composeTitST = 'Speech And Text'; +String composeDesST = + 'App that shows how to use the Speech-to-Text and Text-to-Speech conversion functions by saving converted files.'; +String composeTitContact = 'Contact List'; +String composeDesContact = + 'App that shows how to perform CRUD operations in the room database using Android architecture components and the MVVM architecture model.'; +String composeTitPhoto = 'Photo Picker'; +String composeDesPhoto = + "App that allows you to select one or more photos from the smartphones archive."; +String composeTitOnboarding = 'Onboarding'; +String composeDesOnboarding = + 'App that shows how to create an initial tutorial to view the features of the app.'; +String composeTitLanguage = 'Language Selector'; +String composeDesLanguage = + 'App that lets you select the language of the displayed text using those created locally in the app.'; +String composeTitDarkmode = 'Dark Mode'; +String composeDesDarkmode = + 'App that allows you to switch the theme of the app by switching from a light mode to dark and reverse.'; +String composeTitStopwatch = 'Stopwatch'; +String composeDesStopwatch = + 'App that allows you to calculate the time spent on a certain activity. Time can be started, interrupted and resumed.'; +String composeTitCountdown = 'Countdown Timer'; +String composeDesCountdown = + 'App that allows you to set a countdown for a certain period of time. The time can be started, stopped and resumed.'; +String composeTitEgg = 'Egg Counter'; +String composeDesEgg = + 'App that counts the number of times you click on an egg icon that changes its color each time it is clicked.'; + +// XML Layouts +String pXML = 'XML Layouts'; +String xmlTitSensors = 'Sensors'; +String xmlDesSensors = + 'App that contains a list of functions to detect measurements using the sensors of Android devices.'; +String xmlTitSTT = 'Speech to Text'; +String xmlDesSTT = + 'App that allows you to record audio and then transcribe it into text files. txt.'; +String xmlTitRecorder = 'Recorder'; +String xmlDesRecorder = + 'App that uses the MediaRecorder class to record audio and play it on your smartphone.'; +String xmlTitLanguage = 'Switch Language'; +String xmlDesLanguage = + 'App that shows how to change the language of the application using a list and a spinner.'; +String xmlTitSQLite = 'SqLite'; +String xmlDesSQLite = + 'App that shows how to use various CRUD operations with SQLite Database in RecyclerView.'; +String xmlTitFolder = 'Folder Creation'; +String xmlDesFolder = + 'App that shows how to create a folder in External Storage with permissions for all versions of Android.'; +String xmlTitDarkmode = 'Dark Mode'; +String xmlDesDarkmode = + 'App that allows you to switch the theme of the app by switching from a light mode to dark and reverse.'; +String xmlTitOnboarding = 'Onboarding'; +String xmlDesOnboarding = + 'Custom onboarding home screen to be used as an app intro.'; +String xmlTitToast = 'Toast Message'; +String xmlDesToast = + 'Customizable Toast to send a popup message within the app.'; +String xmlTitAnimations = 'Animations'; +String xmlDesAnimations = + 'List of animations that can be applied to Views, Surfaces, or other objects.'; + +// React +String pReact = 'React'; +String reactTitPWA = 'PWA'; +String reactDesPWA = + 'PWA created with React-based Vite.js with integration of React Router.'; +String reactTitQR = 'qR Code Generator'; +String reactDesQR = + 'QR code generator based on React with integration of React Router.'; +String reactTitPassword = 'Password Generator'; +String reactDesPassword = + 'React-based password generator with integration of React Router.'; +String reactTitClock = 'Digital Clock'; +String reactDesClock = + 'React-based digital clock and calendar with integration of React Router.'; + +// FOOTER +String fHome = 'Benevento, IT'; +String fPhone = '+39 3888605458'; +String fMail = 'n.denicolais@outlook.it'; +String fEmail = 'Mail'; +String fGithub = 'GitHub'; +String fLinkedin = 'LinkedIn'; diff --git a/lib/widgets/bottom_bar.dart b/lib/widgets/bottom_bar.dart deleted file mode 100644 index 478ab53..0000000 --- a/lib/widgets/bottom_bar.dart +++ /dev/null @@ -1,144 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:url_launcher/url_launcher.dart'; - -class MyBottomBar extends StatelessWidget { - final Uri uriMail = Uri( - scheme: 'mailto', - path: 'n.denicolais@outlook.it', - ); - final Uri uriLinkedin = - Uri.parse('https://it.linkedin.com/in/nicoladenicolais'); - final Uri uriGithub = Uri.parse('https://github.com/ndenicolais'); - - MyBottomBar({super.key}); - - @override - Widget build(BuildContext context) { - return Container( - color: Theme.of(context).colorScheme.secondary, - padding: const EdgeInsets.symmetric(vertical: 20), - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Row( - children: [ - Icon( - FontAwesomeIcons.house, - size: 24, - color: Theme.of(context).colorScheme.primary, - ), - const SizedBox(width: 8), - Text( - 'Benevento, IT', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 16, - ), - ), - ], - ), - const SizedBox(width: 12), - Row( - children: [ - Icon( - FontAwesomeIcons.phone, - size: 24, - color: Theme.of(context).colorScheme.primary, - ), - const SizedBox(width: 8), - Text( - '+39 3888605458', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 16, - ), - ), - ], - ), - const SizedBox(width: 12), - Row( - children: [ - Icon( - FontAwesomeIcons.envelope, - size: 24, - color: Theme.of(context).colorScheme.primary, - ), - const SizedBox(width: 8), - Text( - 'n.denicolais@outlook.it', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 16, - ), - ), - ], - ), - ], - ), - const SizedBox(height: 8), - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Tooltip( - message: 'Email', - child: IconButton( - onPressed: () async { - await launchUrl(uriMail); - }, - icon: Icon( - size: 24, - FontAwesomeIcons.envelope, - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - const SizedBox(width: 6), - Tooltip( - message: 'GitHub', - child: IconButton( - onPressed: () async { - await launchUrl(uriGithub); - }, - icon: Icon( - size: 24, - FontAwesomeIcons.github, - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - const SizedBox(width: 6), - Tooltip( - message: 'LinkedIn', - child: IconButton( - onPressed: () async { - await launchUrl(uriLinkedin); - }, - icon: Icon( - size: 24, - FontAwesomeIcons.linkedinIn, - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - ], - ), - const SizedBox(height: 12), - Text( - '© 2023 Nicola De Nicolais. All rights reserved.', - style: TextStyle( - color: Theme.of(context).colorScheme.primary, - fontSize: 14, - fontFamily: 'CustomFont', - ), - ), - ], - ), - ); - } -} diff --git a/lib/widgets/card_item.dart b/lib/widgets/card_item.dart new file mode 100644 index 0000000..ac4eda4 --- /dev/null +++ b/lib/widgets/card_item.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; +import 'package:ming_cute_icons/ming_cute_icons.dart'; +import 'package:myportfolio/theme/app_colors.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +class CardItem extends StatelessWidget { + final String title; + final String imageUrl; + final String description; + final String linkUrl; + + const CardItem({ + super.key, + required this.title, + required this.imageUrl, + required this.description, + required this.linkUrl, + }); + + void _showDescriptionDialog(BuildContext context) { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + content: Text( + description, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 16, + fontFamily: 'CustomFont', + ), + ), + actions: [ + IconButton( + icon: const Icon( + MingCuteIcons.mgc_close_fill, + color: AppColors.error, + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + width: 260, + child: Card( + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + side: BorderSide( + color: Theme.of(context).colorScheme.tertiary, + width: 2, + ), + ), + child: Padding( + padding: const EdgeInsets.all(16), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: TextStyle( + fontSize: 20, + color: Theme.of(context).colorScheme.secondary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Image.asset( + imageUrl, + width: 120, + height: 120, + fit: BoxFit.contain, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + IconButton( + icon: Icon( + MingCuteIcons.mgc_information_fill, + color: Theme.of(context).colorScheme.secondary, + ), + iconSize: 32, + onPressed: () => _showDescriptionDialog(context), + ), + IconButton( + icon: Icon( + MingCuteIcons.mgc_github_2_fill, + color: Theme.of(context).colorScheme.secondary, + ), + iconSize: 32, + onPressed: () => launchUrlString(linkUrl), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/cards/compose_card.dart b/lib/widgets/cards/compose_card.dart index 58701eb..196b085 100644 --- a/lib/widgets/cards/compose_card.dart +++ b/lib/widgets/cards/compose_card.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:ndenicolais/models/card_model.dart'; -import 'package:ndenicolais/utils/responsive_layout.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:url_launcher/url_launcher_string.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/card_item.dart'; class ComposeCards extends StatefulWidget { const ComposeCards({super.key}); @@ -18,363 +16,106 @@ class ComposeCardsState extends State { @override Widget build(BuildContext context) { - return ResponsiveLayout.isSmallScreen(context) - ? SizedBox( - height: 180, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildComposeCard( - context, - CardModel( - title: 'Recorder', - description: cRecorder, - imagePath: - 'assets/images/projects/compose/compose_recorder.png', - githubLink: 'https://github.com/ndenicolais/Recorder', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Contact List', - description: cContact, - imagePath: - 'assets/images/projects/compose/compose_contact.png', - githubLink: - 'https://github.com/ndenicolais/ContactList', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Scanner Code', - description: cScanner, - imagePath: - 'assets/images/projects/compose/compose_scanner.png', - githubLink: - 'https://github.com/ndenicolais/ScannerCode', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Speech And Text', - description: cSpeechAndText, - imagePath: - 'assets/images/projects/compose/compose_speechtext.png', - githubLink: - 'https://github.com/ndenicolais/SpeechAndText', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Photo Picker', - description: cPhotoPicker, - imagePath: - 'assets/images/projects/compose/compose_photopicker.png', - githubLink: - 'https://github.com/ndenicolais/PhotoPicker', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Onboarding', - description: cOnboarding, - imagePath: - 'assets/images/projects/compose/compose_onboarding.png', - githubLink: 'https://github.com/ndenicolais/Onboarding', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Language Selector', - description: cLanguageSelector, - imagePath: - 'assets/images/projects/compose/compose_language.png', - githubLink: - 'https://github.com/ndenicolais/LanguageSelector', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Stopwatch', - description: cStopwatch, - imagePath: - 'assets/images/projects/compose/compose_stopwatch.png', - githubLink: 'https://github.com/ndenicolais/Stopwatch', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Countdown Timer', - description: cCountdownTimer, - imagePath: - 'assets/images/projects/compose/compose_countdown.png', - githubLink: - 'https://github.com/ndenicolais/CountdownTimer', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Egg Counter', - description: cEggCounter, - imagePath: - 'assets/images/projects/compose/compose_egg.png', - githubLink: 'https://github.com/ndenicolais/EggCounter', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'DarkMode', - description: cDarkMode, - imagePath: - 'assets/images/projects/compose/compose_darkmode.png', - githubLink: 'https://github.com/ndenicolais/DarkMode', - ), - ), - ], - ), - ), - ), - ) - : SizedBox( - height: 420, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildComposeCard( - context, - CardModel( - title: 'Recorder', - description: cRecorder, - imagePath: - 'assets/images/projects/compose/compose_recorder.png', - githubLink: 'https://github.com/ndenicolais/Recorder', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Contact List', - description: cContact, - imagePath: - 'assets/images/projects/compose/compose_contact.png', - githubLink: - 'https://github.com/ndenicolais/ContactList', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Scanner Code', - description: cScanner, - imagePath: - 'assets/images/projects/compose/compose_scanner.png', - githubLink: - 'https://github.com/ndenicolais/ScannerCode', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Speech And Text', - description: cSpeechAndText, - imagePath: - 'assets/images/projects/compose/compose_speechtext.png', - githubLink: - 'https://github.com/ndenicolais/SpeechAndText', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Photo Picker', - description: cPhotoPicker, - imagePath: - 'assets/images/projects/compose/compose_photopicker.png', - githubLink: - 'https://github.com/ndenicolais/PhotoPicker', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Onboarding', - description: cOnboarding, - imagePath: - 'assets/images/projects/compose/compose_onboarding.png', - githubLink: 'https://github.com/ndenicolais/Onboarding', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Language Selector', - description: cLanguageSelector, - imagePath: - 'assets/images/projects/compose/compose_language.png', - githubLink: - 'https://github.com/ndenicolais/LanguageSelector', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Stopwatch', - description: cStopwatch, - imagePath: - 'assets/images/projects/compose/compose_stopwatch.png', - githubLink: 'https://github.com/ndenicolais/Stopwatch', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Countdown Timer', - description: cCountdownTimer, - imagePath: - 'assets/images/projects/compose/compose_countdown.png', - githubLink: - 'https://github.com/ndenicolais/CountdownTimer', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'Egg Counter', - description: cEggCounter, - imagePath: - 'assets/images/projects/compose/compose_egg.png', - githubLink: 'https://github.com/ndenicolais/EggCounter', - ), - ), - buildComposeCard( - context, - CardModel( - title: 'DarkMode', - description: cDarkMode, - imagePath: - 'assets/images/projects/compose/compose_darkmode.png', - githubLink: 'https://github.com/ndenicolais/DarkMode', - ), - ), - ], - ), - ), - ), - ); - } - - Widget buildComposeCard(BuildContext context, CardModel card) { - return ResponsiveLayout.isSmallScreen(context) - ? Padding( - padding: const EdgeInsets.all(2), - child: InkWell( - onTap: () { - launchUrlString(card.githubLink); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(7), - ), - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(4), - width: 220, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 100), - child: ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), + return SizedBox( + height: 260, + child: RawScrollbar( + controller: scrollController, + thumbVisibility: true, + radius: const Radius.circular(50), + thickness: 5, + thumbColor: Theme.of(context).colorScheme.tertiary, + trackVisibility: true, + trackRadius: const Radius.circular(50), + trackColor: Theme.of(context).colorScheme.secondary, + child: SingleChildScrollView( + controller: scrollController, + scrollDirection: Axis.horizontal, + child: Column( + children: [ + Row( + children: [ + CardItem( + title: composeTitRecorder, + imageUrl: + 'assets/images/projects/compose/compose_recorder.png', + description: composeDesRecorder, + linkUrl: 'https://github.com/ndenicolais/Recorder', ), - ), - ), - ), - ) - : Padding( - padding: const EdgeInsets.all(8), - child: MouseRegion( - onEnter: (_) => - setState(() => cardHoverMap[card.imagePath] = true), - onExit: (_) => - setState(() => cardHoverMap[card.imagePath] = false), - child: InkWell( - onTap: () { - launchUrlString(card.githubLink); - }, - child: Card( - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(8), - width: 510, - height: 340, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 250), - transitionBuilder: - (Widget child, Animation animation) { - return FadeTransition( - opacity: animation, - child: child, - ); - }, - child: cardHoverMap[card.imagePath] ?? false - ? Padding( - padding: const EdgeInsets.all(16), - child: Text( - card.description, - style: TextStyle( - fontSize: 16, - color: Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ) - : ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), - ), + CardItem( + title: composeTitScanner, + imageUrl: + 'assets/images/projects/compose/compose_scanner.png', + description: composeDesScanner, + linkUrl: 'https://github.com/ndenicolais/ScannerCode', + ), + CardItem( + title: composeTitST, + imageUrl: 'assets/images/projects/compose/compose_st.png', + description: composeDesST, + linkUrl: 'https://github.com/ndenicolais/SpeechAndText', + ), + CardItem( + title: composeTitContact, + imageUrl: + 'assets/images/projects/compose/compose_contact.png', + description: composeDesContact, + linkUrl: 'https://github.com/ndenicolais/ContactList', + ), + CardItem( + title: composeTitPhoto, + imageUrl: + 'assets/images/projects/compose/compose_photo.png', + description: composeDesPhoto, + linkUrl: 'https://github.com/ndenicolais/PhotoPicker', + ), + CardItem( + title: composeTitOnboarding, + imageUrl: + 'assets/images/projects/compose/compose_onboarding.png', + description: composeDesOnboarding, + linkUrl: 'https://github.com/ndenicolais/Onboarding', + ), + CardItem( + title: composeTitLanguage, + imageUrl: + 'assets/images/projects/compose/compose_language.png', + description: composeDesLanguage, + linkUrl: 'https://github.com/ndenicolais/LanguageSelector', + ), + CardItem( + title: composeTitDarkmode, + imageUrl: + 'assets/images/projects/compose/compose_darkmode.png', + description: composeDesDarkmode, + linkUrl: 'https://github.com/ndenicolais/DarkMode', + ), + CardItem( + title: composeTitStopwatch, + imageUrl: + 'assets/images/projects/compose/compose_stopwatch.png', + description: composeDesStopwatch, + linkUrl: 'https://github.com/ndenicolais/Stopwatch', + ), + CardItem( + title: composeTitCountdown, + imageUrl: + 'assets/images/projects/compose/compose_countdown.png', + description: composeDesCountdown, + linkUrl: 'https://github.com/ndenicolais/CountdownTimer', + ), + CardItem( + title: composeTitEgg, + imageUrl: 'assets/images/projects/compose/compose_egg.png', + description: composeDesEgg, + linkUrl: 'https://github.com/ndenicolais/EggCounter', ), - ), + ], ), - ), - ); + const SizedBox(height: 8), + ], + ), + ), + ), + ); } } diff --git a/lib/widgets/cards/flutter_card.dart b/lib/widgets/cards/flutter_card.dart index f534eaf..134f453 100644 --- a/lib/widgets/cards/flutter_card.dart +++ b/lib/widgets/cards/flutter_card.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:ndenicolais/models/card_model.dart'; -import 'package:ndenicolais/utils/responsive_layout.dart'; -// import 'package:ndenicolais/utils/strings.dart'; -// import 'package:url_launcher/url_launcher_string.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/card_item.dart'; class FlutterCards extends StatefulWidget { const FlutterCards({super.key}); @@ -18,167 +16,44 @@ class FlutterCardsState extends State { @override Widget build(BuildContext context) { - return ResponsiveLayout.isSmallScreen(context) - ? SizedBox( - height: 180, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildFlutterCard( - context, - CardModel( - title: 'WIP', - description: 'WIP', - imagePath: - 'assets/images/projects/flutter/flutter_todo.png', - githubLink: 'https://github.com/ndenicolais'), - ), - buildFlutterCard( - context, - CardModel( - title: 'WIP', - description: 'WIP', - imagePath: - 'assets/images/projects/flutter/flutter_inventory.png', - githubLink: 'https://github.com/ndenicolais'), - ), - ], - ), - ), - ), - ) - : SizedBox( - height: 420, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildFlutterCard( - context, - CardModel( - title: 'WIP', - description: 'WIP', - imagePath: - 'assets/images/projects/flutter/flutter_todo.png', - githubLink: 'https://github.com/ndenicolais'), - ), - buildFlutterCard( - context, - CardModel( - title: 'WIP', - description: 'WIP', - imagePath: - 'assets/images/projects/flutter/flutter_inventory.png', - githubLink: 'https://github.com/ndenicolais'), - ), - ], - ), - ), - ), - ); - } - - Widget buildFlutterCard(BuildContext context, CardModel card) { - return ResponsiveLayout.isSmallScreen(context) - ? Padding( - padding: const EdgeInsets.all(2), - // child: InkWell( - // onTap: () { - // launchUrlString(link); - // }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(7), - ), - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(4), - width: 220, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 100), - child: ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), + return SizedBox( + height: 260, + child: RawScrollbar( + controller: scrollController, + thumbVisibility: true, + radius: const Radius.circular(50), + thickness: 5, + thumbColor: Theme.of(context).colorScheme.tertiary, + trackVisibility: true, + trackRadius: const Radius.circular(50), + trackColor: Theme.of(context).colorScheme.secondary, + child: SingleChildScrollView( + controller: scrollController, + scrollDirection: Axis.horizontal, + child: Column( + children: [ + Row( + children: [ + CardItem( + title: ftitShox, + imageUrl: 'assets/images/projects/flutter/logo_shox.png', + description: fdesShox, + linkUrl: 'https://github.com/ndenicolais/Shox', ), - ), - ), - ), - // ), - ) - : Padding( - padding: const EdgeInsets.all(8), - child: MouseRegion( - onEnter: (_) => - setState(() => cardHoverMap[card.imagePath] = true), - onExit: (_) => - setState(() => cardHoverMap[card.imagePath] = false), - // child: InkWell( - // onTap: () { - // launchUrlString(link); - // }, - child: Card( - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(8), - width: 510, - height: 340, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 250), - transitionBuilder: - (Widget child, Animation animation) { - return FadeTransition( - opacity: animation, - child: child, - ); - }, - child: cardHoverMap[card.imagePath] ?? false - ? Padding( - padding: const EdgeInsets.all(16), - child: Text( - card.description, - style: TextStyle( - fontSize: 16, - color: Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ) - : ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), + CardItem( + title: ftitPortfolio, + imageUrl: 'assets/images/logo.png', + description: fdesPortfolio, + linkUrl: + 'https://github.com/ndenicolais/ndenicolais.github.io', ), - ), + ], ), - ), - // ), - ); + const SizedBox(height: 8), + ], + ), + ), + ), + ); } } diff --git a/lib/widgets/cards/react_card.dart b/lib/widgets/cards/react_card.dart index b4ddccf..1935658 100644 --- a/lib/widgets/cards/react_card.dart +++ b/lib/widgets/cards/react_card.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:ndenicolais/models/card_model.dart'; -import 'package:ndenicolais/utils/responsive_layout.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:url_launcher/url_launcher_string.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/card_item.dart'; class ReactCards extends StatefulWidget { const ReactCards({super.key}); @@ -12,221 +10,63 @@ class ReactCards extends StatefulWidget { } class ReactCardsState extends State { - final ScrollController scrollController = ScrollController(); + final scrollController = ScrollController(); Map cardHoverMap = {}; @override Widget build(BuildContext context) { - return ResponsiveLayout.isSmallScreen(context) - ? SizedBox( - height: 190, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildReactCard( - context, - CardModel( - title: 'PWA', - description: rPWA, - imagePath: 'assets/images/projects/react/react_pwa.png', - githubLink: 'https://github.com/ndenicolais/pwa-app', - ), - ), - buildReactCard( - context, - CardModel( - title: 'QR Code Generator', - description: rQR, - imagePath: - 'assets/images/projects/react/react_qr_code_generator.png', - githubLink: - 'https://github.com/ndenicolais/qr-code-generator', - ), - ), - buildReactCard( - context, - CardModel( - title: 'Password Generator', - description: rPassword, - imagePath: - 'assets/images/projects/react/react_password_generator.png', - githubLink: - 'https://github.com/ndenicolais/react-password-generator', - ), - ), - buildReactCard( - context, - CardModel( - title: 'React Digital Clock', - description: rClock, - imagePath: - 'assets/images/projects/react/react_digital_clock.png', - githubLink: - 'https://github.com/ndenicolais/react-digital-clock', - ), - ), - ], - ), - ), - ), - ) - : SizedBox( - height: 280, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildReactCard( - context, - CardModel( - title: 'PWA', - description: rPWA, - imagePath: 'assets/images/projects/react/react_pwa.png', - githubLink: 'https://github.com/ndenicolais/pwa-app', - ), - ), - buildReactCard( - context, - CardModel( - title: 'QR Code Generator', - description: rQR, - imagePath: - 'assets/images/projects/react/react_qr_code_generator.png', - githubLink: - 'https://github.com/ndenicolais/qr-code-generator', - ), - ), - buildReactCard( - context, - CardModel( - title: 'Password Generator', - description: rPassword, - imagePath: - 'assets/images/projects/react/react_password_generator.png', - githubLink: - 'https://github.com/ndenicolais/react-password-generator', - ), - ), - buildReactCard( - context, - CardModel( - title: 'React Digital Clock', - description: rClock, - imagePath: - 'assets/images/projects/react/react_digital_clock.png', - githubLink: - 'https://github.com/ndenicolais/react-digital-clock', - ), - ), - ], - ), - ), - ), - ); - } - - Widget buildReactCard(BuildContext context, CardModel card) { - return ResponsiveLayout.isSmallScreen(context) - ? Padding( - padding: const EdgeInsets.all(2), - child: InkWell( - onTap: () { - launchUrlString(card.githubLink); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(7), - ), - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(4), - width: 120, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 100), - child: ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), + return SizedBox( + height: 260, + child: RawScrollbar( + controller: scrollController, + thumbVisibility: true, + radius: const Radius.circular(50), + thickness: 5, + thumbColor: Theme.of(context).colorScheme.tertiary, + trackVisibility: true, + trackRadius: const Radius.circular(50), + trackColor: Theme.of(context).colorScheme.secondary, + child: SingleChildScrollView( + controller: scrollController, + scrollDirection: Axis.horizontal, + child: Column( + children: [ + Row( + children: [ + CardItem( + title: reactTitPWA, + imageUrl: 'assets/images/projects/react/react_pwa.png', + description: reactDesPWA, + linkUrl: 'https://github.com/ndenicolais/pwa-app', ), - ), - ), - ), - ) - : Padding( - padding: const EdgeInsets.all(8), - child: MouseRegion( - onEnter: (_) => - setState(() => cardHoverMap[card.imagePath] = true), - onExit: (_) => - setState(() => cardHoverMap[card.imagePath] = false), - child: InkWell( - onTap: () { - launchUrlString(card.githubLink); - }, - child: Card( - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(8), - width: 200, - height: 260, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 250), - transitionBuilder: - (Widget child, Animation animation) { - return FadeTransition( - opacity: animation, - child: child, - ); - }, - child: cardHoverMap[card.imagePath] ?? false - ? Padding( - padding: const EdgeInsets.all(12), - child: Text( - card.description, - style: TextStyle( - fontSize: 14, - color: Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ) - : ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), - ), + CardItem( + title: reactTitQR, + imageUrl: 'assets/images/projects/react/react_qr.png', + description: reactDesQR, + linkUrl: 'https://github.com/ndenicolais/qr-code-generator', + ), + CardItem( + title: reactTitPassword, + imageUrl: 'assets/images/projects/react/react_password.png', + description: reactDesPassword, + linkUrl: + 'https://github.com/ndenicolais/react-password-generator', + ), + CardItem( + title: reactTitClock, + imageUrl: 'assets/images/projects/react/react_clock.png', + description: reactDesClock, + linkUrl: + 'https://github.com/ndenicolais/react-digital-clock', ), - ), + ], ), - ), - ); + const SizedBox(height: 8), + ], + ), + ), + ), + ); } } diff --git a/lib/widgets/cards/xml_card.dart b/lib/widgets/cards/xml_card.dart index 8436984..fa4e9cd 100644 --- a/lib/widgets/cards/xml_card.dart +++ b/lib/widgets/cards/xml_card.dart @@ -1,8 +1,6 @@ import 'package:flutter/material.dart'; -import 'package:ndenicolais/models/card_model.dart'; -import 'package:ndenicolais/utils/responsive_layout.dart'; -import 'package:ndenicolais/utils/strings.dart'; -import 'package:url_launcher/url_launcher_string.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:myportfolio/widgets/card_item.dart'; class XmlCards extends StatefulWidget { const XmlCards({super.key}); @@ -18,349 +16,95 @@ class XmlCardsState extends State { @override Widget build(BuildContext context) { - return ResponsiveLayout.isSmallScreen(context) - ? SizedBox( - height: 270, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildXmlCard( - context, - CardModel( - title: 'Sensors', - description: xSensors, - imagePath: 'assets/images/projects/xml/xml_sensors.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSensors', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Speech to Text', - description: xSpeechToText, - imagePath: - 'assets/images/projects/xml/xml_speech_to_text.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSpeechToText', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Recorder', - description: xRecorder, - imagePath: - 'assets/images/projects/xml/xml_recorder.png', - githubLink: - 'https://github.com/ndenicolais/AndroidRecorder', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Switch Language', - description: xSwitchLanguage, - imagePath: - 'assets/images/projects/xml/xml_switch_language.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSwitchLanguage', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'SQL Lite', - description: xSQLite, - imagePath: - 'assets/images/projects/xml/xml_sql_lite.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSQLite', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Folder Creation', - description: xFolderCreation, - imagePath: - 'assets/images/projects/xml/xml_folder_creation.png', - githubLink: - 'https://github.com/ndenicolais/AndroidFolderCreation', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'DarkMode', - description: xDarkMode, - imagePath: - 'assets/images/projects/xml/xml_dark_mode.png', - githubLink: - 'https://github.com/ndenicolais/AndroidDarkMode', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'OnBoarding', - description: xOnBoarding, - imagePath: - 'assets/images/projects/xml/xml_onboarding.png', - githubLink: - 'https://github.com/ndenicolais/AndroidOnBoarding', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'ToastMessage', - description: xToastMessage, - imagePath: - 'assets/images/projects/xml/xml_toast_message.png', - githubLink: - 'https://github.com/ndenicolais/AndroidToastMessage', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Aniamtions', - description: xAnimations, - imagePath: - 'assets/images/projects/xml/xml_animations.png', - githubLink: - 'https://github.com/ndenicolais/AndroidAnimations', - ), - ), - ], - ), - ), - ), - ) - : SizedBox( - height: 460, - child: RawScrollbar( - controller: scrollController, - thumbVisibility: true, - radius: const Radius.circular(50), - thickness: 5, - thumbColor: Theme.of(context).colorScheme.tertiary, - trackVisibility: true, - trackRadius: const Radius.circular(50), - trackColor: Theme.of(context).colorScheme.secondary, - child: SingleChildScrollView( - controller: scrollController, - scrollDirection: Axis.horizontal, - child: Row( - children: [ - buildXmlCard( - context, - CardModel( - title: 'Sensors', - description: xSensors, - imagePath: 'assets/images/projects/xml/xml_sensors.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSensors', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Speech to Text', - description: xSpeechToText, - imagePath: - 'assets/images/projects/xml/xml_speech_to_text.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSpeechToText', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Recorder', - description: xRecorder, - imagePath: - 'assets/images/projects/xml/xml_recorder.png', - githubLink: - 'https://github.com/ndenicolais/AndroidRecorder', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Switch Language', - description: xSwitchLanguage, - imagePath: - 'assets/images/projects/xml/xml_switch_language.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSwitchLanguage', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'SQL Lite', - description: xSQLite, - imagePath: - 'assets/images/projects/xml/xml_sql_lite.png', - githubLink: - 'https://github.com/ndenicolais/AndroidSQLite', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Folder Creation', - description: xFolderCreation, - imagePath: - 'assets/images/projects/xml/xml_folder_creation.png', - githubLink: - 'https://github.com/ndenicolais/AndroidFolderCreation', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'DarkMode', - description: xDarkMode, - imagePath: - 'assets/images/projects/xml/xml_dark_mode.png', - githubLink: - 'https://github.com/ndenicolais/AndroidDarkMode', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'OnBoarding', - description: xOnBoarding, - imagePath: - 'assets/images/projects/xml/xml_onboarding.png', - githubLink: - 'https://github.com/ndenicolais/AndroidOnBoarding', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'ToastMessage', - description: xToastMessage, - imagePath: - 'assets/images/projects/xml/xml_toast_message.png', - githubLink: - 'https://github.com/ndenicolais/AndroidToastMessage', - ), - ), - buildXmlCard( - context, - CardModel( - title: 'Aniamtions', - description: xAnimations, - imagePath: - 'assets/images/projects/xml/xml_animations.png', - githubLink: - 'https://github.com/ndenicolais/AndroidAnimations', - ), - ), - ], - ), - ), - ), - ); - } - - Widget buildXmlCard(BuildContext context, CardModel card) { - return ResponsiveLayout.isSmallScreen(context) - ? Padding( - padding: const EdgeInsets.all(2), - child: InkWell( - onTap: () { - launchUrlString(card.githubLink); - }, - child: Card( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(7), - ), - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(4), - width: 120, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 100), - child: ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), + return SizedBox( + height: 260, + child: RawScrollbar( + controller: scrollController, + thumbVisibility: true, + radius: const Radius.circular(50), + thickness: 5, + thumbColor: Theme.of(context).colorScheme.tertiary, + trackVisibility: true, + trackRadius: const Radius.circular(50), + trackColor: Theme.of(context).colorScheme.secondary, + child: SingleChildScrollView( + controller: scrollController, + scrollDirection: Axis.horizontal, + child: Column( + children: [ + Row( + children: [ + CardItem( + title: xmlTitSensors, + imageUrl: 'assets/images/projects/xml/xml_sensors.png', + description: xmlDesSensors, + linkUrl: 'https://github.com/ndenicolais/AndroidSensors', ), - ), - ), - ), - ) - : Padding( - padding: const EdgeInsets.all(8), - child: MouseRegion( - onEnter: (_) => - setState(() => cardHoverMap[card.imagePath] = true), - onExit: (_) => - setState(() => cardHoverMap[card.imagePath] = false), - child: InkWell( - onTap: () { - launchUrlString(card.githubLink); - }, - child: Card( - color: cardHoverMap[card.imagePath] ?? false - ? Theme.of(context).colorScheme.tertiary - : Theme.of(context).colorScheme.secondary, - elevation: 5.0, - child: Container( - padding: const EdgeInsets.all(8), - width: 210, - height: 400, - child: AnimatedSwitcher( - duration: const Duration(milliseconds: 250), - transitionBuilder: - (Widget child, Animation animation) { - return FadeTransition( - opacity: animation, - child: child, - ); - }, - child: cardHoverMap[card.imagePath] ?? false - ? Padding( - padding: const EdgeInsets.all(2), - child: Text( - card.description, - style: TextStyle( - fontSize: 14, - color: Theme.of(context).colorScheme.primary, - fontFamily: 'CustomFont', - ), - ), - ) - : ClipRRect( - borderRadius: BorderRadius.circular(5), - child: Image.asset(card.imagePath), - ), - ), + CardItem( + title: xmlTitSTT, + imageUrl: 'assets/images/projects/xml/xml_stt.png', + description: xmlDesSTT, + linkUrl: + 'https://github.com/ndenicolais/AndroidSpeechToText', + ), + CardItem( + title: xmlTitRecorder, + imageUrl: 'assets/images/projects/xml/xml_recorder.png', + description: xmlDesRecorder, + linkUrl: 'https://github.com/ndenicolais/AndroidRecorder', + ), + CardItem( + title: xmlTitLanguage, + imageUrl: 'assets/images/projects/xml/xml_language.png', + description: xmlDesLanguage, + linkUrl: + 'https://github.com/ndenicolais/AndroidSwitchLanguage', + ), + CardItem( + title: xmlTitFolder, + imageUrl: 'assets/images/projects/xml/xml_folder.png', + description: xmlDesFolder, + linkUrl: + 'https://github.com/ndenicolais/AndroidFolderCreation', + ), + CardItem( + title: xmlTitDarkmode, + imageUrl: 'assets/images/projects/xml/xml_darkmode.png', + description: xmlDesDarkmode, + linkUrl: 'https://github.com/ndenicolais/AndroidDarkMode', + ), + CardItem( + title: xmlTitSQLite, + imageUrl: 'assets/images/projects/xml/xml_sqlite.png', + description: xmlDesSQLite, + linkUrl: 'https://github.com/ndenicolais/AndroidSQLite', + ), + CardItem( + title: xmlTitOnboarding, + imageUrl: 'assets/images/projects/xml/xml_onboarding.png', + description: xmlDesOnboarding, + linkUrl: 'https://github.com/ndenicolais/AndroidOnboarding', + ), + CardItem( + title: xmlTitToast, + imageUrl: 'assets/images/projects/xml/xml_toast.png', + description: xmlDesToast, + linkUrl: + 'https://github.com/ndenicolais/AndroidToastMessage', + ), + CardItem( + title: xmlTitAnimations, + imageUrl: 'assets/images/projects/xml/xml_animations.png', + description: xmlDesAnimations, + linkUrl: 'https://github.com/ndenicolais/AndroidAnimations', ), - ), + ], ), - ), - ); + const SizedBox(height: 8), + ], + ), + ), + ), + ); } } diff --git a/lib/widgets/drawer.dart b/lib/widgets/drawer.dart index 1becf60..ed6cfde 100644 --- a/lib/widgets/drawer.dart +++ b/lib/widgets/drawer.dart @@ -1,21 +1,19 @@ import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/providers/theme_notifier.dart'; -import 'package:ndenicolais/routes.dart'; +import 'package:ming_cute_icons/ming_cute_icons.dart'; +import 'package:myportfolio/theme/theme_notifier.dart'; +import 'package:myportfolio/utils/constants.dart'; +import 'package:myportfolio/utils/globals.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:provider/provider.dart'; import 'package:url_launcher/url_launcher.dart'; class MyDrawer extends StatelessWidget { - final bool isDarkMode; - final ThemeNotifier themeNotifier; - final Uri uriMail = Uri( - scheme: 'mailto', - path: 'n.denicolais@outlook.it', - ); - final Uri uriLinkedin = - Uri.parse('https://it.linkedin.com/in/nicoladenicolais'); - final Uri uriGithub = Uri.parse('https://github.com/ndenicolais'); + final Function(GlobalKey) onScrollToSection; - MyDrawer({super.key, required this.isDarkMode, required this.themeNotifier}); + const MyDrawer({ + Key? key, + required this.onScrollToSection, + }) : super(key: key); @override Widget build(BuildContext context) { @@ -35,7 +33,7 @@ class MyDrawer extends StatelessWidget { decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all( - color: Theme.of(context).colorScheme.primary, + color: Theme.of(context).colorScheme.tertiary, width: 2.0, ), ), @@ -57,86 +55,113 @@ class MyDrawer extends StatelessWidget { const SizedBox(height: 10), ListTile( leading: Icon( - size: 14, - FontAwesomeIcons.house, + size: 24, + MingCuteIcons.mgc_arrows_up_fill, + color: Theme.of(context).colorScheme.primary), + title: Text( + dTop, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 14, + fontFamily: 'CustomFont', + ), + ), + onTap: () { + onScrollToSection(GlobalKeys.topSectionKey); + Navigator.of(context).pop(); + }, + ), + ListTile( + leading: Icon( + size: 24, + MingCuteIcons.mgc_user_4_fill, color: Theme.of(context).colorScheme.primary), title: Text( - 'Home', + dAbout, style: TextStyle( color: Theme.of(context).colorScheme.primary, fontSize: 14, - fontWeight: FontWeight.bold, fontFamily: 'CustomFont', ), ), onTap: () { - Navigator.of(context).pushNamed(Routes.home); + onScrollToSection(GlobalKeys.aboutSectionKey); + Navigator.of(context).pop(); }, ), ListTile( leading: Icon( - size: 14, - FontAwesomeIcons.briefcase, + size: 24, + MingCuteIcons.mgc_briefcase_fill, color: Theme.of(context).colorScheme.primary), title: Text( - 'Works', + dWorks, style: TextStyle( color: Theme.of(context).colorScheme.primary, fontSize: 14, - fontWeight: FontWeight.bold, fontFamily: 'CustomFont', ), ), onTap: () { - Navigator.of(context).pushNamed(Routes.works); + onScrollToSection(GlobalKeys.worksSectionKey); + Navigator.of(context).pop(); }, ), ListTile( leading: Icon( - size: 14, - FontAwesomeIcons.code, + size: 24, + MingCuteIcons.mgc_code_fill, color: Theme.of(context).colorScheme.primary), title: Text( - 'Projects', + dProjects, style: TextStyle( color: Theme.of(context).colorScheme.primary, fontSize: 14, - fontWeight: FontWeight.bold, fontFamily: 'CustomFont', ), ), onTap: () { - Navigator.of(context).pushNamed(Routes.projects); + onScrollToSection(GlobalKeys.projectsSectionKey); + Navigator.of(context).pop(); }, ), ListTile( leading: Icon( - size: 14, - FontAwesomeIcons.palette, + size: 24, + MingCuteIcons.mgc_palette_fill, color: Theme.of(context).colorScheme.primary), title: Text( - 'Theme', + dTheme, style: TextStyle( color: Theme.of(context).colorScheme.primary, fontSize: 14, - fontWeight: FontWeight.bold, fontFamily: 'CustomFont', ), ), trailing: GestureDetector( onTap: () { - themeNotifier.toggleTheme(); + Provider.of(context, listen: false) + .switchTheme(); }, - child: Switch.adaptive( - value: isDarkMode, + child: Switch( + value: Provider.of(context).isDarkMode, onChanged: (value) { - themeNotifier.toggleTheme(); + Provider.of(context, listen: false) + .switchTheme(); }, activeColor: Theme.of(context).colorScheme.primary, activeTrackColor: Theme.of(context).colorScheme.primary.withOpacity(0.5), inactiveThumbColor: Theme.of(context).colorScheme.secondary, inactiveTrackColor: Theme.of(context).colorScheme.primary, + trackOutlineColor: WidgetStateProperty.resolveWith( + (Set states) { + if (states.contains(WidgetState.selected)) { + return Theme.of(context).colorScheme.onTertiary; + } + return Theme.of(context).colorScheme.onTertiary; + }, + ), ), ), ), @@ -153,31 +178,31 @@ class MyDrawer extends StatelessWidget { children: [ IconButton( onPressed: () async { - await launchUrl(uriMail); + await launchUrl(AppConstants.uriMail); }, icon: Icon( - size: 14, - FontAwesomeIcons.envelope, + size: 24, + MingCuteIcons.mgc_mail_fill, color: Theme.of(context).colorScheme.primary, ), ), IconButton( onPressed: () async { - await launchUrl(uriGithub); + await launchUrl(AppConstants.uriGithub); }, icon: Icon( - size: 14, - FontAwesomeIcons.github, + size: 24, + MingCuteIcons.mgc_github_2_fill, color: Theme.of(context).colorScheme.primary, ), ), IconButton( onPressed: () async { - await launchUrl(uriLinkedin); + await launchUrl(AppConstants.uriLinkedin); }, icon: Icon( - size: 14, - FontAwesomeIcons.linkedinIn, + size: 24, + MingCuteIcons.mgc_linkedin_fill, color: Theme.of(context).colorScheme.primary, ), ), @@ -185,7 +210,7 @@ class MyDrawer extends StatelessWidget { ), const SizedBox(height: 8), Text( - '© 2023 Nicola De Nicolais', + copyright, style: TextStyle( color: Theme.of(context).colorScheme.primary, fontSize: 12, diff --git a/lib/widgets/footer.dart b/lib/widgets/footer.dart new file mode 100644 index 0000000..546998d --- /dev/null +++ b/lib/widgets/footer.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:ming_cute_icons/ming_cute_icons.dart'; +import 'package:myportfolio/utils/constants.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class MyFooter extends StatelessWidget { + const MyFooter({super.key}); + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double padding = screenWidth > 1200 + ? 420 // Web o tablet grandi + : screenWidth > 800 + ? 120 // Tablet + : 20; // Telefono + + double iconSize = screenWidth > 800 ? 30 : 24; + double textFontSize = screenWidth > 800 ? 18 : 14; + double smallTextFontSize = screenWidth > 800 ? 16 : 12; + double contactSpacing = screenWidth > 800 ? 12 : 6; + + if (screenWidth <= 800) { + return Container( + color: Theme.of(context).colorScheme.secondary, + padding: EdgeInsets.symmetric(vertical: 20, horizontal: padding), + child: Center( + child: Text( + copyright, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: smallTextFontSize, + fontFamily: 'CustomFont', + ), + ), + ), + ); + } + + return Container( + color: Theme.of(context).colorScheme.secondary, + padding: EdgeInsets.symmetric(vertical: 20, horizontal: padding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildInfoRow(context, MingCuteIcons.mgc_home_6_fill, fHome, + iconSize, textFontSize), + SizedBox(width: contactSpacing), + _buildInfoRow(context, MingCuteIcons.mgc_phone_fill, fPhone, + iconSize, textFontSize), + SizedBox(width: contactSpacing), + _buildInfoRow(context, MingCuteIcons.mgc_mail_fill, fMail, + iconSize, textFontSize), + ], + ), + const SizedBox(height: 8), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + _buildIconButton(context, AppConstants.uriMail, + MingCuteIcons.mgc_mail_send_fill, fEmail, iconSize), + SizedBox(width: contactSpacing), + _buildIconButton(context, AppConstants.uriGithub, + MingCuteIcons.mgc_github_2_fill, fGithub, iconSize), + SizedBox(width: contactSpacing), + _buildIconButton(context, AppConstants.uriLinkedin, + MingCuteIcons.mgc_linkedin_fill, fLinkedin, iconSize), + ], + ), + const SizedBox(height: 12), + Text( + copyright, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: smallTextFontSize, + fontFamily: 'CustomFont', + ), + ), + ], + ), + ); + }, + ); + } + + Widget _buildInfoRow(BuildContext context, IconData icon, String text, + double iconSize, double textFontSize) { + return Row( + children: [ + Icon( + icon, + size: iconSize, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 8), + Text( + text, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: textFontSize, + ), + ), + ], + ); + } + + Widget _buildIconButton(BuildContext context, Uri uri, IconData icon, + String tooltip, double iconSize) { + return Tooltip( + message: tooltip, + child: IconButton( + onPressed: () async { + await launchUrl(uri); + }, + icon: Icon( + icon, + size: iconSize, + color: Theme.of(context).colorScheme.primary, + ), + ), + ); + } +} diff --git a/lib/widgets/intro_logo.dart b/lib/widgets/intro_logo.dart new file mode 100644 index 0000000..7a33d93 --- /dev/null +++ b/lib/widgets/intro_logo.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; + +class HeartbeatLogo extends StatefulWidget { + final double width; + final double height; + + const HeartbeatLogo({ + Key? key, + required this.width, + required this.height, + }) : super(key: key); + + @override + HeartbeatLogoState createState() => HeartbeatLogoState(); +} + +class HeartbeatLogoState extends State + with SingleTickerProviderStateMixin { + late AnimationController _controller; + late Animation _animation; + + @override + void initState() { + super.initState(); + _controller = AnimationController( + vsync: this, + duration: const Duration(milliseconds: 1000), + )..repeat(reverse: true); + + _animation = Tween(begin: 1.0, end: 1.2).animate( + CurvedAnimation( + parent: _controller, + curve: Curves.easeInOut, + ), + ); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return AnimatedBuilder( + animation: _animation, + builder: (context, child) { + return Transform.scale( + scale: _animation.value, + child: child, + ); + }, + child: Container( + width: widget.width, + height: widget.height, + decoration: BoxDecoration( + border: Border.all( + color: Theme.of(context).colorScheme.tertiary, + width: 2, + ), + shape: BoxShape.circle, + ), + child: Image.asset( + 'assets/images/logo.png', + width: widget.width, + height: widget.height, + ), + ), + ); + } +} diff --git a/lib/widgets/skill_item.dart b/lib/widgets/skill_item.dart new file mode 100644 index 0000000..ca4d952 --- /dev/null +++ b/lib/widgets/skill_item.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; + +class SkillItem extends StatelessWidget { + const SkillItem({ + Key? key, + required this.title, + required this.image, + }) : super(key: key); + + final String title; + final ImageProvider image; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Image( + image: image, + width: 140, + height: 40, + fit: BoxFit.contain, + ), + SizedBox( + width: 140, + child: Text( + title, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + fontFamily: 'CustomFont', + ), + textAlign: TextAlign.center, + ), + ) + ], + ); + } +} diff --git a/lib/widgets/top_bar.dart b/lib/widgets/top_bar.dart index 48b30fc..d048ded 100644 --- a/lib/widgets/top_bar.dart +++ b/lib/widgets/top_bar.dart @@ -1,11 +1,14 @@ import 'package:flutter/material.dart'; -import 'package:font_awesome_flutter/font_awesome_flutter.dart'; -import 'package:ndenicolais/routes.dart'; -import 'package:ndenicolais/providers/theme_notifier.dart'; +import 'package:ming_cute_icons/ming_cute_icons.dart'; +import 'package:myportfolio/utils/strings.dart'; import 'package:provider/provider.dart'; +import 'package:myportfolio/theme/theme_notifier.dart'; +import 'package:myportfolio/utils/globals.dart'; class MyTopBar extends StatefulWidget { - const MyTopBar({super.key}); + final Function(GlobalKey) onScrollToSection; + + const MyTopBar({Key? key, required this.onScrollToSection}) : super(key: key); @override MyTopBarState createState() => MyTopBarState(); @@ -14,126 +17,230 @@ class MyTopBar extends StatefulWidget { class MyTopBarState extends State { bool isDarkMode = false; - @override - void initState() { - super.initState(); - } - @override Widget build(BuildContext context) { setState(() { isDarkMode = Theme.of(context).brightness == Brightness.dark; }); - return Container( - height: 70.0, - padding: const EdgeInsets.all(16), - color: Theme.of(context).colorScheme.secondary, - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - 'My Portfolio', - style: TextStyle( - color: Theme.of(context).colorScheme.onPrimary, - fontSize: 20, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont'), - ), - Row( - children: [ - ElevatedButton( - onPressed: () { - Navigator.of(context).pushNamed(Routes.home); - }, - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.onPrimary, - ), - child: Text( - 'Home', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', + return SliverAppBar( + automaticallyImplyLeading: false, + pinned: true, + flexibleSpace: FlexibleSpaceBar( + title: Builder( + builder: (context) { + final bool isMobile = MediaQuery.of(context).size.width < 800; + if (isMobile) { + return Row( + children: [ + IconButton( + icon: Icon( + MingCuteIcons.mgc_menu_fill, + color: Theme.of(context).colorScheme.secondary, + ), + onPressed: () { + Scaffold.of(context).openDrawer(); + }, ), - ), - ), - const SizedBox(width: 8), - ElevatedButton( - onPressed: () { - Navigator.of(context).pushNamed(Routes.works); - }, - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.onPrimary, - ), - child: Text( - 'Works', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', - ), - ), - ), - const SizedBox(width: 8), - ElevatedButton( - onPressed: () { - Navigator.of(context).pushNamed(Routes.projects); - }, - style: ElevatedButton.styleFrom( - backgroundColor: Theme.of(context).colorScheme.onPrimary, - ), - child: Text( - 'Projects', - style: TextStyle( - color: Theme.of(context).colorScheme.secondary, - fontSize: 14, - fontWeight: FontWeight.bold, - fontFamily: 'CustomFont', + Expanded( + child: Text( + tDrawer, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 18, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), ), + ], + ); + } else { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + tTitle, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + Row( + children: [ + ElevatedButton( + onPressed: () { + widget.onScrollToSection(GlobalKeys.topSectionKey); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.onPrimary, + side: BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: 1, + ), + ), + child: Text( + tTop, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + widget + .onScrollToSection(GlobalKeys.aboutSectionKey); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.onPrimary, + side: BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: 1, + ), + ), + child: Text( + tAbout, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + widget + .onScrollToSection(GlobalKeys.skillsSectionKey); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.onPrimary, + side: BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: 1, + ), + ), + child: Text( + tSkills, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + widget + .onScrollToSection(GlobalKeys.worksSectionKey); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.onPrimary, + side: BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: 1, + ), + ), + child: Text( + tWorks, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + ), + const SizedBox(width: 8), + ElevatedButton( + onPressed: () { + widget.onScrollToSection( + GlobalKeys.projectsSectionKey); + }, + style: ElevatedButton.styleFrom( + backgroundColor: + Theme.of(context).colorScheme.onPrimary, + side: BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: 1, + ), + ), + child: Text( + tProjects, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 14, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + ), + const SizedBox(width: 16), + Icon( + MingCuteIcons.mgc_sun_fill, + size: 24, + color: isDarkMode + ? Colors.grey + : Theme.of(context).colorScheme.secondary, + ), + Switch( + value: isDarkMode, + activeColor: Theme.of(context).colorScheme.secondary, + activeTrackColor: Theme.of(context) + .colorScheme + .secondary + .withOpacity(0.5), + inactiveTrackColor: + Theme.of(context).colorScheme.secondary, + thumbColor: WidgetStateColor.resolveWith( + (Set states) { + if (states.contains(WidgetState.selected)) { + return Theme.of(context).colorScheme.secondary; + } + return Theme.of(context).colorScheme.primary; + }, + ), + onChanged: (bool value) { + setState( + () { + isDarkMode = value; + Provider.of(context, + listen: false) + .switchTheme(); + }, + ); + }, + ), + Icon( + MingCuteIcons.mgc_moon_fill, + size: 24, + color: isDarkMode + ? Theme.of(context).colorScheme.secondary + : Colors.grey, + ), + ], + ), + ], ), - ), - const SizedBox(width: 16), - Icon( - FontAwesomeIcons.sun, - size: 24, - color: isDarkMode - ? Colors.grey - : Theme.of(context).colorScheme.primary, - ), - Switch( - value: isDarkMode, - activeColor: Theme.of(context).colorScheme.primary, - activeTrackColor: - Theme.of(context).colorScheme.primary.withOpacity(0.5), - inactiveTrackColor: Theme.of(context).colorScheme.primary, - thumbColor: - MaterialStateColor.resolveWith((Set states) { - if (states.contains(MaterialState.selected)) { - return Theme.of(context).colorScheme.primary; - } - return Theme.of(context).colorScheme.secondary; - }), - onChanged: (bool value) { - setState(() { - isDarkMode = value; - Provider.of(context, listen: false) - .toggleTheme(); - }); - }, - ), - Icon( - FontAwesomeIcons.moon, - size: 24, - color: isDarkMode - ? Theme.of(context).colorScheme.primary - : Colors.grey, - ), - ], - ), - ], + ); + } + }, + ), ), ); } diff --git a/lib/widgets/work_container.dart b/lib/widgets/work_container.dart new file mode 100644 index 0000000..1e993ba --- /dev/null +++ b/lib/widgets/work_container.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:ming_cute_icons/ming_cute_icons.dart'; +import 'package:myportfolio/utils/strings.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class WorkContainer extends StatelessWidget { + final String title; + final String description; + final String url; + + const WorkContainer({ + Key? key, + required this.title, + required this.description, + required this.url, + }) : super(key: key); + + Future _launchUrl(String url) async { + if (await canLaunchUrl(Uri.parse(url))) { + await launchUrl(Uri.parse(url)); + } else { + throw 'Could not launch $url'; + } + } + + @override + Widget build(BuildContext context) { + return LayoutBuilder( + builder: (context, constraints) { + double screenWidth = constraints.maxWidth; + double containerWidth = screenWidth > 800 ? 320 : screenWidth * 0.9; + double titleFontSize = screenWidth > 800 ? 24 : 18; + double descriptionFontSize = screenWidth > 800 ? 16 : 14; + double buttonFontSize = screenWidth > 800 ? 14 : 12; + + return Container( + padding: const EdgeInsets.all(8), + width: containerWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + title, + style: TextStyle( + fontSize: titleFontSize, + color: Theme.of(context).colorScheme.tertiary, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 8), + Text( + description, + style: TextStyle( + fontSize: descriptionFontSize, + color: Theme.of(context).colorScheme.secondary, + fontFamily: 'CustomFont', + ), + ), + const SizedBox(height: 8), + SizedBox( + width: 120, + height: 40, + child: ElevatedButton.icon( + onPressed: () async { + _launchUrl(url); + }, + icon: Icon( + MingCuteIcons.mgc_link_2_fill, + size: buttonFontSize, + color: Theme.of(context).colorScheme.primary, + ), + label: Text( + link, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: buttonFontSize, + fontWeight: FontWeight.bold, + fontFamily: 'CustomFont', + ), + ), + style: ElevatedButton.styleFrom( + foregroundColor: Theme.of(context).colorScheme.primary, + backgroundColor: Theme.of(context).colorScheme.secondary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(25), + ), + ), + ), + ), + ], + ), + ); + }, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 5d4847c..95de2a6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,22 +1,6 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - sha256: "7b875fd4a20b165a3084bd2d210439b22ebc653f21cea4842729c0c30c82596b" - url: "https://pub.dev" - source: hosted - version: "3.4.9" - args: - dependency: transitive - description: - name: args - sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 - url: "https://pub.dev" - source: hosted - version: "2.4.2" async: dependency: transitive description: @@ -37,10 +21,10 @@ packages: dependency: "direct main" description: name: change_app_package_name - sha256: f9ebaf68a4b5a68c581492579bb68273c523ef325fbf9ce2f1b57fb136ad023b + sha256: f734e127d334053873733fb61b1ecae73c09abb694b759a4afd26aa9c9547850 url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.3.0" characters: dependency: transitive description: @@ -49,22 +33,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" - checked_yaml: - dependency: transitive - description: - name: checked_yaml - sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" - source: hosted - version: "2.0.3" - cli_util: - dependency: transitive - description: - name: cli_util - sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7 - url: "https://pub.dev" - source: hosted - version: "0.4.0" clock: dependency: transitive description: @@ -81,30 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" - source: hosted - version: "3.1.1" crypto: dependency: transitive description: name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + sha256: ec30d999af904f33454ba22ed9a86162b35e52b44ac4807d1d93c288041d7d27 url: "https://pub.dev" source: hosted - version: "3.0.3" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d - url: "https://pub.dev" - source: hosted - version: "1.0.6" + version: "3.0.5" fake_async: dependency: transitive description: @@ -117,10 +69,10 @@ packages: dependency: transitive description: name: ffi - sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.3" file: dependency: transitive description: @@ -134,14 +86,6 @@ packages: description: flutter source: sdk version: "0.0.0" - flutter_launcher_icons: - dependency: "direct main" - description: - name: flutter_launcher_icons - sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" - url: "https://pub.dev" - source: hosted - version: "0.13.1" flutter_lints: dependency: "direct dev" description: @@ -150,14 +94,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" - flutter_spinkit: - dependency: "direct main" - description: - name: flutter_spinkit - sha256: b39c753e909d4796906c5696a14daf33639a76e017136c8d82bf3e620ce5bb8e - url: "https://pub.dev" - source: hosted - version: "5.2.0" flutter_test: dependency: "direct dev" description: flutter @@ -168,30 +104,22 @@ packages: description: flutter source: sdk version: "0.0.0" - font_awesome_flutter: - dependency: "direct main" - description: - name: font_awesome_flutter - sha256: "52671aea66da73b58d42ec6d0912b727a42248dd9a7c76d6c20f275783c48c08" - url: "https://pub.dev" - source: hosted - version: "10.6.0" google_fonts: dependency: "direct main" description: name: google_fonts - sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 + sha256: b1ac0fe2832c9cc95e5e88b57d627c5e68c223b9657f4b96e1487aa9098c7b82 url: "https://pub.dev" source: hosted - version: "6.1.0" + version: "6.2.1" http: dependency: transitive description: name: http - sha256: d4872660c46d929f6b8a9ef4e7a7eff7e49bbf0c4ec3f385ee32df5119175139 + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.2.2" http_parser: dependency: transitive description: @@ -200,14 +128,6 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" - image: - dependency: transitive - description: - name: image - sha256: "028f61960d56f26414eb616b48b04eb37d700cbe477b7fb09bf1d7ce57fd9271" - url: "https://pub.dev" - source: hosted - version: "4.1.3" intl: dependency: "direct main" description: @@ -216,22 +136,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.18.1" - js: + leak_tracker: dependency: transitive description: - name: js - sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" url: "https://pub.dev" source: hosted - version: "0.6.7" - json_annotation: + version: "10.0.5" + leak_tracker_flutter_testing: dependency: transitive description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" url: "https://pub.dev" source: hosted - version: "4.8.1" + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" lints: dependency: transitive description: @@ -244,34 +172,42 @@ packages: dependency: "direct main" description: name: logger - sha256: "6bbb9d6f7056729537a4309bda2e74e18e5d9f14302489cc1e93f33b3fe32cac" + sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" url: "https://pub.dev" source: hosted - version: "2.0.2+1" + version: "2.4.0" matcher: dependency: transitive description: name: matcher - sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.16" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec url: "https://pub.dev" source: hosted - version: "0.5.0" + version: "0.11.1" meta: dependency: transitive description: name: meta - sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.15.0" + ming_cute_icons: + dependency: "direct main" + description: + name: ming_cute_icons + sha256: "20c078b54d6c9f4a01427aa4dea24440710fdb265a88ec2f5673615ebc0411c8" + url: "https://pub.dev" + source: hosted + version: "0.0.6" nested: dependency: transitive description: @@ -284,34 +220,34 @@ packages: dependency: transitive description: name: path - sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.8.3" + version: "1.9.0" path_provider: dependency: "direct main" description: name: path_provider - sha256: a1aa8aaa2542a6bc57e381f132af822420216c80d4781f7aa085ca3229208aaa + sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.4" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: e595b98692943b4881b219f0a9e3945118d3c16bd7e2813f98ec6e532d905f72 + sha256: "6f01f8e37ec30b07bc424b4deabac37cacb1bc7e2e515ad74486039918a37eb7" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.2.10" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "19314d595120f82aca0ba62787d58dde2cc6b5df7d2f0daf72489e38d1b57f2d" + sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.0" path_provider_linux: dependency: transitive description: @@ -324,162 +260,146 @@ packages: dependency: transitive description: name: path_provider_platform_interface - sha256: "94b1e0dd80970c1ce43d5d4e050a9918fce4f4a775e6142424c30a29a363265c" + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.0" permission_handler: dependency: "direct main" description: name: permission_handler - sha256: "860c6b871c94c78e202dc69546d4d8fd84bd59faeb36f8fb9888668a53ff4f78" + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" url: "https://pub.dev" source: hosted - version: "11.1.0" + version: "11.3.1" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "2f1bec180ee2f5665c22faada971a8f024761f632e93ddc23310487df52dcfa6" + sha256: "76e4ab092c1b240d31177bb64d2b0bea43f43d0e23541ec866151b9f7b2490fa" url: "https://pub.dev" source: hosted - version: "12.0.1" + version: "12.0.12" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: "1a816084338ada8d574b1cb48390e6e8b19305d5120fe3a37c98825bacc78306" + sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 url: "https://pub.dev" source: hosted - version: "9.2.0" + version: "9.4.5" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: d96ff56a757b7f04fa825c469d296c5aebc55f743e87bd639fef91a466a24da8 + sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 url: "https://pub.dev" source: hosted - version: "0.1.0+1" + version: "0.1.3+2" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: d87349312f7eaf6ce0adaf668daf700ac5b06af84338bd8b8574dfbd93ffe1a1 + sha256: fe0ffe274d665be8e34f9c59705441a7d248edebbe5d9e3ec2665f88b79358ea url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.2.2" permission_handler_windows: dependency: transitive description: name: permission_handler_windows - sha256: "1e8640c1e39121128da6b816d236e714d2cf17fac5a105dd6acdd3403a628004" - url: "https://pub.dev" - source: hosted - version: "0.2.0" - petitparser: - dependency: transitive - description: - name: petitparser - sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" url: "https://pub.dev" source: hosted - version: "6.0.2" + version: "0.2.1" platform: dependency: transitive description: name: platform - sha256: "0a279f0707af40c890e80b1e9df8bb761694c074ba7e1d4ab1bc4b728e200b59" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: f4f88d4a900933e7267e2b353594774fc0d07fb072b47eedcd5b54e1ea3269f8 + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" url: "https://pub.dev" source: hosted - version: "2.1.7" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" - url: "https://pub.dev" - source: hosted - version: "3.7.3" + version: "2.1.8" provider: dependency: "direct main" description: name: provider - sha256: "9a96a0a19b594dbc5bf0f1f27d2bc67d5f95957359b461cd9feb44ed6ae75096" + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c url: "https://pub.dev" source: hosted - version: "6.1.1" + version: "6.1.2" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "81429e4481e1ccfb51ede496e916348668fd0921627779233bd24cc3ff6abd02" + sha256: "746e5369a43170c25816cc472ee016d3a66bc13fcf430c0bc41ad7b4b2922051" url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.3.2" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + sha256: "480ba4345773f56acda9abf5f50bd966f581dac5d514e5fc4a18c62976bbba7e" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "7bf53a9f2d007329ee6f3df7268fd498f8373602f943c975598bbb34649b62a7" + sha256: c4b35f6cb8f63c147312c054ce7c2254c8066745125264f0c88739c417fc9d9f url: "https://pub.dev" source: hosted - version: "2.3.4" + version: "2.5.2" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + sha256: "580abfd40f415611503cae30adf626e6656dfb2f0cee8f465ece7b6defb40f2f" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: d4ec5fc9ebb2f2e056c617112aa75dcf92fc2e4faaf2ae999caa297473f75d8a + sha256: "57cbf196c486bc2cf1f02b85784932c6094376284b3ad5779d1b1c6c6a816b80" url: "https://pub.dev" source: hosted - version: "2.3.1" + version: "2.4.1" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "7b15ffb9387ea3e237bb7a66b8a23d2147663d391cafc5c8f37b2e7b4bde5d21" + sha256: d2ca4132d3946fec2184261726b355836a82c33d7d5b67af32692aff18a4684e url: "https://pub.dev" source: hosted - version: "2.2.2" + version: "2.4.2" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + sha256: "94ef0f72b2d71bc3e700e025db3710911bd51a71cefb65cc609dd0d9a982e3c1" url: "https://pub.dev" source: hosted - version: "2.3.2" + version: "2.4.1" sky_engine: dependency: transitive description: flutter @@ -529,10 +449,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" url: "https://pub.dev" source: hosted - version: "0.6.1" + version: "0.7.2" typed_data: dependency: transitive description: @@ -545,66 +465,66 @@ packages: dependency: "direct main" description: name: url_launcher - sha256: b1c9e98774adf8820c96fbc7ae3601231d324a7d5ebd8babe27b6dfac91357ba + sha256: "21b704ce5fa560ea9f3b525b43601c678728ba46725bab9b01187b4831377ed3" url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.3.0" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: "31222ffb0063171b526d3e569079cf1f8b294075ba323443fdc690842bfd4def" + sha256: e35a698ac302dd68e41f73250bd9517fe3ab5fa4f18fe4647a0872db61bacbab url: "https://pub.dev" source: hosted - version: "6.2.0" + version: "6.3.10" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: bba3373219b7abb6b5e0d071b0fe66dfbe005d07517a68e38d4fc3638f35c6d3 + sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e url: "https://pub.dev" source: hosted - version: "6.2.1" + version: "6.3.1" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "9f2d390e096fdbe1e6e6256f97851e51afc2d9c423d3432f1d6a02a8a9a8b9fd" + sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.2.0" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "980e8d9af422f477be6948bdfb68df8433be71f5743a188968b0c1b887807e50" + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.3.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "138bd45b3a456dcfafc46d1a146787424f8d2edfbf2809c9324361e58f851cf7" + sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" url: "https://pub.dev" source: hosted - version: "2.2.1" + version: "2.3.3" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "7754a1ad30ee896b265f8d14078b0513a4dba28d358eabb9d5f339886f4a1adc" + sha256: "49c10f879746271804767cb45551ec5592cdab00ee105c06dddde1a98f73b185" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.2" vector_math: dependency: transitive description: @@ -613,46 +533,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" - web: + vm_service: dependency: transitive description: - name: web - sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" url: "https://pub.dev" source: hosted - version: "0.3.0" - win32: + version: "14.2.5" + web: dependency: transitive description: - name: win32 - sha256: b0f37db61ba2f2e9b7a78a1caece0052564d1bc70668156cf3a29d676fe4e574 + name: web + sha256: d43c1d6b787bf0afad444700ae7f4db8827f701bc61c255ac8d328c6f4d52062 url: "https://pub.dev" source: hosted - version: "5.1.1" + version: "1.0.0" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: "589ada45ba9e39405c198fe34eb0f607cddb2108527e658136120892beac46d2" - url: "https://pub.dev" - source: hosted - version: "1.0.3" - xml: - dependency: transitive - description: - name: xml - sha256: af5e77e9b83f2f4adc5d3f0a4ece1c7f45a2467b695c2540381bac793e34e556 + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d url: "https://pub.dev" source: hosted - version: "6.4.2" - yaml: - dependency: transitive - description: - name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" - url: "https://pub.dev" - source: hosted - version: "3.1.2" + version: "1.0.4" sdks: - dart: ">=3.2.2 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.5.0 <4.0.0" + flutter: ">=3.24.0" diff --git a/pubspec.yaml b/pubspec.yaml index 341393e..85740dd 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,24 +1,18 @@ -name: ndenicolais +name: myportfolio description: "Nicola De Nicolais Portfolio" # The following line prevents the package from being accidentally published to # pub.dev using `flutter pub publish`. This is preferred for private packages. -publish_to: 'none' # Remove this line if you wish to publish to pub.dev +publish_to: "none" # Remove this line if you wish to publish to pub.dev version: 1.0.0+1 environment: - sdk: '>=3.2.2 <4.0.0' + sdk: ">=3.2.2 <4.0.0" dependencies: flutter: sdk: flutter change_app_package_name: ^1.1.0 - - # Icons - flutter_launcher_icons: ^0.13.1 - cupertino_icons: ^1.0.2 - font_awesome_flutter: ^10.5.0 - provider: ^6.0.5 path_provider: ^2.1.1 permission_handler: ^11.0.1 @@ -26,9 +20,11 @@ dependencies: shared_preferences: ^2.2.2 google_fonts: ^6.1.0 url_launcher: ^6.2.1 - flutter_spinkit: ^5.2.0 logger: ^2.0.2+1 + # GRAPHICS + ming_cute_icons: ^0.0.5 + dev_dependencies: flutter_test: sdk: flutter @@ -47,7 +43,6 @@ flutter: - assets/images/projects/flutter/ - assets/images/projects/react/ - assets/images/projects/xml/ - - assets/pdf/ fonts: - family: CustomFont diff --git a/web/icon.ico b/web/icon.ico deleted file mode 100644 index 3e7b3e6..0000000 Binary files a/web/icon.ico and /dev/null differ diff --git a/web/icons/Icon-192.png b/web/icons/Icon-192.png deleted file mode 100644 index b749bfe..0000000 Binary files a/web/icons/Icon-192.png and /dev/null differ diff --git a/web/icons/Icon-512.png b/web/icons/Icon-512.png deleted file mode 100644 index 88cfd48..0000000 Binary files a/web/icons/Icon-512.png and /dev/null differ diff --git a/web/icons/Icon-maskable-192.png b/web/icons/Icon-maskable-192.png deleted file mode 100644 index eb9b4d7..0000000 Binary files a/web/icons/Icon-maskable-192.png and /dev/null differ diff --git a/web/icons/Icon-maskable-512.png b/web/icons/Icon-maskable-512.png deleted file mode 100644 index d69c566..0000000 Binary files a/web/icons/Icon-maskable-512.png and /dev/null differ diff --git a/web/icons/android-icon-144x144.png b/web/icons/android-icon-144x144.png new file mode 100644 index 0000000..e04b8a6 Binary files /dev/null and b/web/icons/android-icon-144x144.png differ diff --git a/web/icons/android-icon-192x192.png b/web/icons/android-icon-192x192.png new file mode 100644 index 0000000..a8c7033 Binary files /dev/null and b/web/icons/android-icon-192x192.png differ diff --git a/web/icons/android-icon-36x36.png b/web/icons/android-icon-36x36.png new file mode 100644 index 0000000..f01e8c6 Binary files /dev/null and b/web/icons/android-icon-36x36.png differ diff --git a/web/icons/android-icon-48x48.png b/web/icons/android-icon-48x48.png new file mode 100644 index 0000000..d169021 Binary files /dev/null and b/web/icons/android-icon-48x48.png differ diff --git a/web/icons/android-icon-72x72.png b/web/icons/android-icon-72x72.png new file mode 100644 index 0000000..9eee67a Binary files /dev/null and b/web/icons/android-icon-72x72.png differ diff --git a/web/icons/android-icon-96x96.png b/web/icons/android-icon-96x96.png new file mode 100644 index 0000000..e55c9ea Binary files /dev/null and b/web/icons/android-icon-96x96.png differ diff --git a/web/icons/apple-icon-114x114.png b/web/icons/apple-icon-114x114.png new file mode 100644 index 0000000..5de4050 Binary files /dev/null and b/web/icons/apple-icon-114x114.png differ diff --git a/web/icons/apple-icon-120x120.png b/web/icons/apple-icon-120x120.png new file mode 100644 index 0000000..28aa6a4 Binary files /dev/null and b/web/icons/apple-icon-120x120.png differ diff --git a/web/icons/apple-icon-144x144.png b/web/icons/apple-icon-144x144.png new file mode 100644 index 0000000..e04b8a6 Binary files /dev/null and b/web/icons/apple-icon-144x144.png differ diff --git a/web/icons/apple-icon-152x152.png b/web/icons/apple-icon-152x152.png new file mode 100644 index 0000000..2f3f38d Binary files /dev/null and b/web/icons/apple-icon-152x152.png differ diff --git a/web/icons/apple-icon-180x180.png b/web/icons/apple-icon-180x180.png new file mode 100644 index 0000000..221656a Binary files /dev/null and b/web/icons/apple-icon-180x180.png differ diff --git a/web/icons/apple-icon-57x57.png b/web/icons/apple-icon-57x57.png new file mode 100644 index 0000000..6ec03f6 Binary files /dev/null and b/web/icons/apple-icon-57x57.png differ diff --git a/web/icons/apple-icon-60x60.png b/web/icons/apple-icon-60x60.png new file mode 100644 index 0000000..85460d2 Binary files /dev/null and b/web/icons/apple-icon-60x60.png differ diff --git a/web/icons/apple-icon-72x72.png b/web/icons/apple-icon-72x72.png new file mode 100644 index 0000000..9eee67a Binary files /dev/null and b/web/icons/apple-icon-72x72.png differ diff --git a/web/icons/apple-icon-76x76.png b/web/icons/apple-icon-76x76.png new file mode 100644 index 0000000..dc5211c Binary files /dev/null and b/web/icons/apple-icon-76x76.png differ diff --git a/web/icons/apple-icon-precomposed.png b/web/icons/apple-icon-precomposed.png new file mode 100644 index 0000000..69e9630 Binary files /dev/null and b/web/icons/apple-icon-precomposed.png differ diff --git a/web/icons/apple-icon.png b/web/icons/apple-icon.png new file mode 100644 index 0000000..69e9630 Binary files /dev/null and b/web/icons/apple-icon.png differ diff --git a/web/icons/favicon-16x16.png b/web/icons/favicon-16x16.png new file mode 100644 index 0000000..5626349 Binary files /dev/null and b/web/icons/favicon-16x16.png differ diff --git a/web/icons/favicon-32x32.png b/web/icons/favicon-32x32.png new file mode 100644 index 0000000..21f2e6a Binary files /dev/null and b/web/icons/favicon-32x32.png differ diff --git a/web/icons/favicon-96x96.png b/web/icons/favicon-96x96.png new file mode 100644 index 0000000..725adbe Binary files /dev/null and b/web/icons/favicon-96x96.png differ diff --git a/web/icons/favicon.ico b/web/icons/favicon.ico new file mode 100644 index 0000000..3476c2c Binary files /dev/null and b/web/icons/favicon.ico differ diff --git a/web/icons/ms-icon-144x144.png b/web/icons/ms-icon-144x144.png new file mode 100644 index 0000000..e04b8a6 Binary files /dev/null and b/web/icons/ms-icon-144x144.png differ diff --git a/web/icons/ms-icon-150x150.png b/web/icons/ms-icon-150x150.png new file mode 100644 index 0000000..cd1f5f1 Binary files /dev/null and b/web/icons/ms-icon-150x150.png differ diff --git a/web/icons/ms-icon-310x310.png b/web/icons/ms-icon-310x310.png new file mode 100644 index 0000000..8f8ea50 Binary files /dev/null and b/web/icons/ms-icon-310x310.png differ diff --git a/web/icons/ms-icon-70x70.png b/web/icons/ms-icon-70x70.png new file mode 100644 index 0000000..fdcab0f Binary files /dev/null and b/web/icons/ms-icon-70x70.png differ diff --git a/web/index.html b/web/index.html index 2527120..40156cc 100644 --- a/web/index.html +++ b/web/index.html @@ -1,5 +1,6 @@ + - + - - - - - - + - - + + + + + + + + + + + + + + + + + + + - + Nicola De Nicolais + - - - - - - - + + + \ No newline at end of file diff --git a/web/manifest.json b/web/manifest.json index a5c6ff2..1451034 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -10,26 +10,40 @@ "prefer_related_applications": false, "icons": [ { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" + "src": "icons/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" }, { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" + "src": "icons/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" }, { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" + "src": "icons/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "icons/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" }, { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" + "src": "icons/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "icons/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" } ] -} +} \ No newline at end of file