diff --git a/.Connected_Version - TeaHub/lib/TeaDescriptionPage/main.dart b/.Connected_Version - TeaHub/lib/TeaDescriptionPage/main.dart new file mode 100644 index 0000000..3b44f5b --- /dev/null +++ b/.Connected_Version - TeaHub/lib/TeaDescriptionPage/main.dart @@ -0,0 +1,374 @@ +import 'package:TeaHub/TeaDescriptionPage/teaDetails.dart'; +import 'package:TeaHub/theme/theme.dart'; +import 'package:TeaHub/theme/theme_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; + +import 'package:provider/provider.dart'; + +// void main() { +// runApp(TeaProfile()); +// } + +class TeaProfile extends StatefulWidget { + @override + _TeaProfileState createState() => _TeaProfileState(); +} + +class _TeaProfileState extends State { + TextEditingController searchController = TextEditingController(); + late List allTeas; // List to hold all teas. + late List filteredTeas; // List to hold teas after a search is performed. + + @override + void initState() { + super.initState(); + allTeas = []; // Initialize to an empty list. + filteredTeas = []; // Initialize to an empty list. + fetchData(); // Fetch your tea data from the API. + searchController.addListener(() { + filterSearchResults(searchController.text); + }); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + Future> fetchData() async { + final response = + await http.get(Uri.parse('https://boonakitea.cyclic.app/api/all')); + if (response.statusCode == 200) { + final List jsonData = json.decode(response.body); + List teas = jsonData.map((json) => Tea.fromJson(json)).toList(); + return teas; + } else { + throw Exception('Failed to load tea data'); + } + } + + void filterSearchResults(String query) { + List dummySearchList = []; + if (query.isNotEmpty) { + dummySearchList.addAll(allTeas); + dummySearchList = dummySearchList.where((item) { + return item.name.toLowerCase().contains(query.toLowerCase()); + }).toList(); + } else { + dummySearchList = List.from(allTeas); + } + setState(() { + filteredTeas = dummySearchList; + }); + } + + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, provider, child) { + return MaterialApp( + debugShowCheckedModeBanner: false, + theme: lightMode, // Use light mode theme + darkTheme: darkMode, // Use dark mode theme + themeMode: provider.themeMode, + + home: Scaffold( + backgroundColor: Theme.of(context).colorScheme.background, + body: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: 35.0, left: 20.0, right: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: Image.asset('assets/teaPage/hamburger_menu.png'), + onPressed: () { + // Handle menu button press + }, + ), + Spacer(), // This will create space between the elements + IconButton( + icon: Image.asset('assets/teaPage/notification_icon.png'), + onPressed: () { + // Handle notifications button press + }, + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only( + left: 30.0, top: 8.0), // Adjust the padding as needed + child: Column( + crossAxisAlignment: + CrossAxisAlignment.start, // Align text to the left + children: [ + Text( + "Let's find your", + style: TextStyle( + color: Color(0xFF4ecb81), // The specified green color + fontWeight: FontWeight.w900, + fontSize: 36, // Increased font size + ), + ), + Text( + "plants", + style: TextStyle( + color: Color(0xFF4ecb81), // The specified green color + fontWeight: FontWeight.w900, + fontSize: 36, // Same font size for uniformity + ), + ), + ], + ), + ), + SizedBox(height: 24), // Spacing between title and search bar + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + decoration: InputDecoration( + hintText: 'Search', + hintStyle: TextStyle(color: Colors.black), + prefixIcon: Icon( + Icons.search, + color: Colors.black, + ), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(24), + borderSide: BorderSide.none, + ), + filled: true, + fillColor: Colors.greenAccent.shade100, + ), + onChanged: (value) { + filterSearchResults(value); + }, + ), + ), + SizedBox(height: 16), + Expanded( + child: searchController.text.isNotEmpty + ? GridView.builder( + itemCount: filteredTeas.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.0, + crossAxisSpacing: 10.0, + childAspectRatio: 160 / 242, + ), + itemBuilder: (BuildContext context, int index) { + return Frame1Widget(tea: filteredTeas[index]); + }, + ) + : FutureBuilder>( + future: + fetchData(), // Replace with your data fetching logic + builder: (BuildContext context, + AsyncSnapshot> snapshot) { + if (snapshot.connectionState == + ConnectionState.waiting) { + return Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center( + child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + allTeas = snapshot.data!; + filteredTeas = allTeas; + return GridView.builder( + itemCount: filteredTeas.length, + gridDelegate: + SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.0, + crossAxisSpacing: 10.0, + childAspectRatio: 160 / 242, + ), + itemBuilder: (BuildContext context, int index) { + return Frame1Widget(tea: filteredTeas[index]); + }, + ); + } else { + return Center(child: Text("No data found")); + } + }, + ), + ), + ], + ), + ), + ); + }); + } +} + +class Tea { + final String name; + final String imageUrl; + final String alternativeName; + final String origin; + final String type; + final String caffeine; + final String caffeineLevel; + final String mainIngredients; + final String description; + final String colourDescription; + + Tea( + {required this.name, + required this.imageUrl, + required this.alternativeName, + required this.origin, + required this.type, + required this.caffeine, + required this.caffeineLevel, + required this.mainIngredients, + required this.description, + required this.colourDescription}); + + factory Tea.fromJson(Map json) { + // A helper function to get value or return a default + String getOrDefault(String key, String defaultValue) { + var value = json[key]; + return (value == null || value.isEmpty) ? defaultValue : value; + } + + return Tea( + name: getOrDefault('name', 'None'), + imageUrl: getOrDefault('image', '.noimage.webp'), + alternativeName: getOrDefault('altnames', 'None'), + origin: getOrDefault('origin', 'None'), + type: getOrDefault('type', 'None'), + caffeine: getOrDefault('caffeine', 'None'), + caffeineLevel: getOrDefault('caffeineLevel', 'None'), + description: getOrDefault('description', 'None'), + colourDescription: getOrDefault('colorDescription', 'None'), + mainIngredients: getOrDefault('tasteDescription', 'None'), + ); + } +} + +class Frame1Widget extends StatelessWidget { + final Tea tea; + + Frame1Widget({required this.tea}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + // Navigate to TeaDetailsPage and pass the tea object + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => TeaDetailsPage(), + settings: RouteSettings(arguments: tea)), + ); + }, + child: Container( + width: 140, + height: 220, + margin: EdgeInsets.fromLTRB(10, 10, 10, 0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.15), + offset: Offset(0, 20), + blurRadius: 52, + ), + ], + color: Theme.of(context).colorScheme.surfaceTint, + ), + child: Stack( + children: [ + Positioned( + top: 220, + left: 25, + child: Text( + tea.name, + textAlign: TextAlign.left, + style: TextStyle( + //color: Color.fromRGBO(48, 64, 34, 1), + color: Theme.of(context).colorScheme.primary, + fontFamily: 'Lexend', + fontSize: 13, + fontWeight: FontWeight.normal, + height: 1, + ), + ), + ), + Positioned( + top: 211, + left: 115, + child: Container( + width: 28, + height: 27, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.15), + offset: Offset(0, 8), + blurRadius: 17, + ), + ], + gradient: LinearGradient( + begin: + Alignment(-2.9608793639113173e-8, 0.6136363744735718), + end: Alignment(-0.6136363744735718, -2.753164629609728e-8), + colors: [ + Color.fromRGBO(213, 235, 203, 1), + Color.fromRGBO(156, 237, 107, 1), + Color.fromRGBO(87, 145, 51, 1) + ], + ), + ), + ), + ), + Positioned( + top: -3, + left: 0, + right: 0, // Make the image take the same width as the grid cell + child: Container( + height: 200, // Half of the grid cell height + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(18), + topRight: Radius.circular(18), + ), + image: DecorationImage( + image: NetworkImage(tea.imageUrl), + fit: BoxFit.cover, + ), + ), + ), + ), + Positioned( + top: 212, + left: 118, + bottom: 120, + child: GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => TeaDetailsPage(), + settings: RouteSettings(arguments: tea)), + ); + }, + child: Icon( + Icons.arrow_forward, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/TeaDescriptionPage/teaDetails.dart b/.Connected_Version - TeaHub/lib/TeaDescriptionPage/teaDetails.dart new file mode 100644 index 0000000..a9885c3 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/TeaDescriptionPage/teaDetails.dart @@ -0,0 +1,167 @@ +import 'package:TeaHub/TeaDescriptionPage/main.dart'; +import 'package:TeaHub/theme/theme.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(TeaDetailsApp()); +} + +class TeaDetailsApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Tea Details', + + home: TeaDetailsPage(), + theme: lightMode, // Use light mode theme + darkTheme: darkMode, // Use dark mode theme + ); + } +} + +class TeaDetailsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + // Extracting the tea object passed from main.dart + final Tea tea = ModalRoute.of(context)!.settings.arguments as Tea; + + return Scaffold( + appBar: AppBar( + title: Text( + 'Tea Details', + style: TextStyle( + fontSize: 30, color: Theme.of(context).colorScheme.primary), + ), + ), + body: SingleChildScrollView( + child: Center( + child: TeaDetailsWidget( + tea: tea), // Pass the tea object to TeaDetailsWidget + ), + ), + ); + } +} + +class TeaDetailsWidget extends StatelessWidget { + final Tea tea; + + TeaDetailsWidget({required this.tea}); + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.only(top: 20, left: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only( + bottom: 23, + top: + 15), // Adding padding to the bottom of "Green Tea" text + child: Text( + tea.name, + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: Color(0xFF4ECB81), + ), + ), + ), + SizedBox(height: 10), + _buildInfoTag( + context, 'Alternative Name:', tea.alternativeName), + _buildInfoTag(context, 'Origin:', tea.origin), + _buildInfoTag(context, 'Type:', tea.type), + _buildInfoTag(context, 'Caffeine:', tea.caffeine), + _buildInfoTag(context, 'Caffeine Level:', tea.caffeineLevel), + _buildInfoTag( + context, 'Main Ingredients:', tea.mainIngredients), + _buildInfoTag(context, 'Description:', tea.description), + _buildInfoTag( + context, 'Color Description:', tea.colourDescription), + ], + ), + ), + ), + SizedBox(width: 10), + Container( + height: MediaQuery.of(context).size.height * + 0.5, // Half the height of the screen + width: MediaQuery.of(context).size.width * 0.4, + child: Stack( + children: [ + Positioned.fill( + top: 50, + right: 0, + bottom: 0, + left: 20, + child: Container( + height: MediaQuery.of(context).size.height * 0.5, + width: MediaQuery.of(context).size.width * 0.2, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular( + MediaQuery.of(context).size.height * 0.25), + bottomLeft: Radius.circular( + MediaQuery.of(context).size.height * 0.25), + ), + image: DecorationImage( + image: NetworkImage(tea.imageUrl), + fit: BoxFit.cover, + ), // You can change the color or use an image here + ), + ), + ), + ], + ), + ), + ], + ); + } + + Widget _buildInfoTag(BuildContext context, String title, String content) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + children: [ + TextSpan( + text: title[0], + style: TextStyle( + fontSize: 20, // Set the font size of the first letter to 20 + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + TextSpan( + text: title.substring(1), + style: TextStyle( + fontSize: + 18, // Set the font size of the rest of the label to 18 + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + SizedBox(height: 5), + Text( + content, + style: TextStyle( + fontSize: 18, + color: Color(0xFF4ECB81), + fontWeight: FontWeight.bold, + height: 1.5, // Line spacing + ), + ), + SizedBox(height: 10), + ], + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/chatbot_ui_updated/ChatScreen.dart b/.Connected_Version - TeaHub/lib/chatbot_ui_updated/ChatScreen.dart new file mode 100644 index 0000000..ee9d19c --- /dev/null +++ b/.Connected_Version - TeaHub/lib/chatbot_ui_updated/ChatScreen.dart @@ -0,0 +1,325 @@ +import 'dart:convert'; +import 'package:TeaHub/introduction_page/chatbotui_splash.dart'; +import 'package:chat_bubbles/bubbles/bubble_normal.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import './message.dart'; // Make sure this file exists and contains the Message class + +class ChatScreen extends StatefulWidget { + const ChatScreen({Key? key}) : super(key: key); + + @override + State createState() => _ChatScreenState(); +} + +class _ChatScreenState extends State { + final TextEditingController controller = TextEditingController(); + final ScrollController scrollController = ScrollController(); + List msgs = [null]; // Include a null at the start for the header + bool isTyping = false; + bool showScrollToTopButton = false; + + void sendMsg() async { + String text = controller.text.trim(); + if (text.isEmpty) { + return; + } + String apiKey = + "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"; // Replace with your actual API key + + // Add the user's message to the chat + + setState(() { + msgs.add(Message(sender: true, text: text)); + + isTyping = true; + }); + + // Clear input field and animate scroll + + controller.clear(); + scrollController.animateTo( + scrollController.position.maxScrollExtent + 100.0, + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + ); + + try { + var response = await http.post( + Uri.parse("https://api.openai.com/v1/chat/completions"), + headers: { + "Authorization": "Bearer $apiKey", + "Content-Type": "application/json", + }, + body: jsonEncode({ + "model": "gpt-3.5-turbo", // Replace with the model you are using + "messages": [ + {"role": "user", "content": text} + ], + }), + ); + + if (response.statusCode == 200) { + var data = jsonDecode(response.body); + var reply = + data["choices"][0]["message"]["content"].toString().trimLeft(); + setState(() { + isTyping = false; + msgs.add(Message(sender: false, text: reply)); + }); + } else { + throw Exception('Failed to load data'); + } + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("Some error occurred, please try again!")), + ); + } + } + + @override + void initState() { + super.initState(); + scrollController.addListener(() { + const scrollThreshold = 50; // Change this value as needed + if (scrollController.offset >= scrollThreshold && + !showScrollToTopButton) { + setState(() => showScrollToTopButton = true); + } else if (scrollController.offset < scrollThreshold && + showScrollToTopButton) { + setState(() => showScrollToTopButton = false); + } + }); + + // // Navigating to the Chat ui page automatically when this page is opened + // WidgetsBinding.instance.addPostFrameCallback((_) { + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (context) => ChatbotUI(), + // ), + // ); + // }); + } + + @override + void dispose() { + scrollController.dispose(); + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + // leading: IconButton( + // icon: Icon(Icons.arrow_back, color: Colors.black), + // onPressed: () => Navigator.of(context).pop(), + // ), + // backgroundColor: Colors.white, + // elevation: 0, + backgroundColor: Theme.of(context).colorScheme.background, + elevation: 0, + title: Row( + children: [ + Expanded( + child: Text( + 'ChatBot', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + fontSize: 30, + ), + ), + ), + ], + ), + ), + body: Stack( + children: [ + Column( + children: [ + Expanded( + child: ListView.builder( + padding: EdgeInsets.only( + bottom: 200), // Adjust for text field space + controller: scrollController, + itemCount: msgs.length, + itemBuilder: (context, index) { + if (index == 0) { + return buildHeader(); + } else { + Message message = msgs[index]!; + return Padding( + padding: + EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: buildMessage(message, message.sender), + ); + } + }, + ), + ), + buildInputField(), + ], + ), + if (showScrollToTopButton) // Conditionally display the 3D effect FAB + Positioned( + bottom: 170, // Adjusted to move the button a bit higher + right: 0, + left: 0, + child: Align( + alignment: Alignment.center, + child: GestureDetector( + onTap: () { + scrollController.animateTo( + 0.0, + duration: Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + ); + }, + child: Container( + width: 60, + height: 60, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.green[700]!, Colors.green[400]!], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow( + color: Colors.green.withOpacity(0.4), + offset: Offset(4, 4), + blurRadius: 10, + ), + ], + ), + child: Icon(Icons.arrow_upward, color: Colors.white), + ), + ), + ), + ), + ], + ), + ); + } + + Widget buildHeader() { + // Build your header widget here + return Column( + children: [ + SizedBox(height: 16), + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/teabot.png', width: 150), + SizedBox(width: 25), + Text( + "Hello!\nI'm TeaBot", + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 36, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + ], + ), + ), + SizedBox(height: 20), + ], + ); + } + + Widget buildMessage(Message message, bool isSender) { + // Build your message widget here + return Row( + mainAxisAlignment: + isSender ? MainAxisAlignment.end : MainAxisAlignment.start, + children: [ + if (!isSender) ...[ + Icon(Icons.chat, color: Color(0xFF4ECB81)), + SizedBox(width: 8), + ], + Expanded( + child: BubbleNormal( + text: message.text, + isSender: isSender, + color: isSender ? Colors.blue : Color(0xFF4ECB81), + tail: true, + textStyle: TextStyle( + fontSize: 16, + color: isSender ? Colors.white : Colors.black87, + ), + ), + ), + if (isSender) ...[ + SizedBox(width: 8), + Icon(Icons.account_circle, color: Colors.blue), + ], + ], + ); + } + + Widget buildInputField() { + // Build your input field widget here + return Container( + width: MediaQuery.of(context).size.width, + height: 150, + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + color: const Color.fromRGBO(78, 203, 113, 1), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + child: Row( + children: [ + Expanded( + child: TextField( + controller: controller, + textCapitalization: TextCapitalization.sentences, + decoration: InputDecoration( + hintText: "Enter text", + hintStyle: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + border: InputBorder.none, + filled: true, + fillColor: Theme.of(context).colorScheme.tertiary, + contentPadding: const EdgeInsets.symmetric(horizontal: 16), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(30), + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(30), + borderSide: BorderSide.none, + ), + ), + onSubmitted: (_) => sendMsg(), + ), + ), + const SizedBox(width: 8), + GestureDetector( + onTap: sendMsg, + child: Container( + padding: const EdgeInsets.all(8), + decoration: const BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + child: const Icon(Icons.send, color: Colors.white), + ), + ), + ], + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/chatbot_ui_updated/main.dart b/.Connected_Version - TeaHub/lib/chatbot_ui_updated/main.dart new file mode 100644 index 0000000..01899a8 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/chatbot_ui_updated/main.dart @@ -0,0 +1,22 @@ +import './ChatScreen.dart'; +import 'package:flutter/material.dart'; + +void main() async { + runApp(const ChatbotScreen()); +} + +class ChatbotScreen extends StatelessWidget { + const ChatbotScreen({super.key}); + + Widget build(BuildContext context) { + return MaterialApp( + title: 'TeaBot Chat UI', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + + home: ChatScreen(), + + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/chatbot_ui_updated/message.dart b/.Connected_Version - TeaHub/lib/chatbot_ui_updated/message.dart new file mode 100644 index 0000000..5315462 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/chatbot_ui_updated/message.dart @@ -0,0 +1,6 @@ +class Message { + final bool sender; + final String text; + + Message({required this.sender, required this.text}); +} \ No newline at end of file diff --git a/.Connected_Version - TeaHub/lib/components/login_button.dart b/.Connected_Version - TeaHub/lib/components/login_button.dart new file mode 100644 index 0000000..9cb730f --- /dev/null +++ b/.Connected_Version - TeaHub/lib/components/login_button.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +class LoginButton extends StatelessWidget { + final Function()? onTap; + + const LoginButton({super.key, required this.onTap}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(18), + margin: const EdgeInsets.symmetric(horizontal: 25), + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(5)), + child: const Center( + child: Text( + 'Login', + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/components/my_textfield.dart b/.Connected_Version - TeaHub/lib/components/my_textfield.dart new file mode 100644 index 0000000..04c801a --- /dev/null +++ b/.Connected_Version - TeaHub/lib/components/my_textfield.dart @@ -0,0 +1,42 @@ +import 'package:flutter/material.dart'; + +class MyTextField extends StatelessWidget { + final controller; + final String hintText; + final bool obscureText; + + const MyTextField({ + super.key, + required this.controller, + required this.hintText, + required this.obscureText, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 25.0), + child: TextField( + controller: controller, + obscureText: obscureText, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).colorScheme.secondary, + ), + ), + focusedBorder: OutlineInputBorder( + borderSide: + BorderSide(color: Theme.of(context).colorScheme.primary), + ), + fillColor: Theme.of(context).colorScheme.tertiary, + filled: true, + hintText: hintText, + hintStyle: TextStyle( + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/components/signin_button.dart b/.Connected_Version - TeaHub/lib/components/signin_button.dart new file mode 100644 index 0000000..63455f3 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/components/signin_button.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class MyButton extends StatelessWidget { + final Function()? onTap; + final String text; + + const MyButton({ + super.key, + required this.onTap, + required this.text, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(18), + margin: const EdgeInsets.symmetric(horizontal: 25), + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(5), + ), + child: Center( + child: Text( + text, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/components/square_tile.dart b/.Connected_Version - TeaHub/lib/components/square_tile.dart new file mode 100644 index 0000000..e35a975 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/components/square_tile.dart @@ -0,0 +1,33 @@ +import 'package:flutter/material.dart'; + +class SquareTile extends StatelessWidget { + final String imagePath; + final Function()? onTap; + const SquareTile({ + super.key, + required this.imagePath, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + //padding: EdgeInsets.all(20), + padding: const EdgeInsets.symmetric( + horizontal: 45.0, // Horizontal padding + vertical: 10.0, // Vertical padding + ), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.shade400), + borderRadius: BorderRadius.circular(5), + ), + child: Image.asset( + imagePath, + height: 40, + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/core/app_export.dart b/.Connected_Version - TeaHub/lib/core/app_export.dart new file mode 100644 index 0000000..b9f78bb --- /dev/null +++ b/.Connected_Version - TeaHub/lib/core/app_export.dart @@ -0,0 +1 @@ +// TODO Implement this library. \ No newline at end of file diff --git a/.Connected_Version - TeaHub/lib/disease_description/diseases.dart b/.Connected_Version - TeaHub/lib/disease_description/diseases.dart new file mode 100644 index 0000000..d510d32 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description/diseases.dart @@ -0,0 +1,335 @@ +import 'package:flutter/material.dart'; +import 'dart:ui'; +import 'package:google_fonts/google_fonts.dart'; + +class MyCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} + +class Disease extends StatelessWidget { + const Disease({Key? key}); + + @override + Widget build(BuildContext context) { + double baseWidth = 375; + double fem = MediaQuery.of(context).size.width / baseWidth; + double ffem = fem * 0.97; + return Container( + width: double.infinity, + child: Container( + // diseaseSYf (128:230) + padding: EdgeInsets.fromLTRB(0 * fem, 7 * fem, 0 * fem, 0 * fem), + width: double.infinity, + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/bgimag.png', + ), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // navvTq (128:231) + margin: EdgeInsets.fromLTRB(19 * fem, 0 * fem, 14 * fem, 284 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // pmePq (I128:231;1:11) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 222 * fem, 0 * fem), + child: Text( + '9:40PM', + style: GoogleFonts.poppins( + fontSize: 14 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + Container( + // autogroup1vq1W4f (9njwAy638d8DChbuKN1VQ1) + padding: EdgeInsets.fromLTRB(11 * fem, 38 * fem, 6 * fem, 0 * fem), + width: double.infinity, + decoration: BoxDecoration( + color: const Color(0xffffffff), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30 * fem), + topRight: Radius.circular(30 * fem), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // greyblightpestalotiopsisBwV (128:237) + margin: EdgeInsets.fromLTRB(7 * fem, 0 * fem, 0 * fem, 23 * fem), + constraints: BoxConstraints( + maxWidth: 136 * fem, + ), + child: RichText( + text: TextSpan( + style: GoogleFonts.poppins( + fontSize: 24 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + children: [ + const TextSpan( + text: 'Grey Blight\n', + ), + TextSpan( + text: 'Pestalotiopsis', + style: GoogleFonts.poppins( + fontSize: 16 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: const Color(0xff4ecb81), + ), + ), + ], + ), + ), + ), + Container( + // autogroupnverEYP (9njwT8HnBeUeJnzCQvNvER) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 8 * fem, 38 * fem), + padding: EdgeInsets.fromLTRB(13.5 * fem, 4.5 * fem, 37.5 * fem, 4.5 * fem), + width: double.infinity, + height: 47 * fem, + decoration: BoxDecoration( + color: const Color(0xffe5ffd6), + borderRadius: BorderRadius.circular(28 * fem), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // autogrouprqsbiTZ (9njwaCvKJemfjtLRtArqsB) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 9 * fem, 0 * fem), + width: 180 * fem, + height: double.infinity, + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/rectangle-8.png', + ), + ), + ), + child: Center( + child: Center( + child: Text( + 'Description', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 14 * ffem, + fontWeight: FontWeight.w600, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ), + ), + Center( + // treatmentplanZj5 (130:249) + child: Container( + margin: EdgeInsets.fromLTRB(0 * fem, 2 * fem, 0 * fem, 0 * fem), + child: Text( + 'Treatment Plan', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 14 * ffem, + fontWeight: FontWeight.w600, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ), + ], + ), + ), + Container( + // autogrouphapm4vj (9njwfnbMKPzQVYfnjdHapm) + margin: EdgeInsets.fromLTRB(13.49 * fem, 0 * fem, 12.49 * fem, 35 * fem), + padding: EdgeInsets.fromLTRB(24.51 * fem, 13.63 * fem, 24.51 * fem, 6 * fem), + width: double.infinity, + decoration: BoxDecoration( + color: const Color(0x33088a6a), + borderRadius: BorderRadius.circular(19.4736843109 * fem), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // autogroupghz5m4T (9njwpHMCGCk31f64u8GHz5) + margin: EdgeInsets.fromLTRB(1.63 * fem, 0 * fem, 96 * fem, 19.63 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // headsetsvgrepocomHHh (188:315) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 20.63 * fem, 0 * fem), + width: 21.75 * fem, + height: 21.75 * fem, + child: Image.asset( + 'assets/images/headsetsvgrepocom.png', + width: 21.75 * fem, + height: 21.75 * fem, + ), + ), + Container( + // listentothesymptomsBts (188:314) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 0 * fem), + child: Text( + 'Listen to the symptoms', + style: GoogleFonts.poppins( + fontSize: 12 * ffem, + fontWeight: FontWeight.w600, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + Container( + // autogroupyejqVef (9njwtwt69uCGEn2LbbYeJq) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 89 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // playbuttonsvgrepocomE6T (188:322) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 17.66 * fem, 0.66 * fem), + width: 26.34 * fem, + height: 26.34 * fem, + child: Image.asset( + 'assets/images/play-buttonsvgrepocom.png', + width: 26.34 * fem, + height: 26.34 * fem, + ), + ), + Container( + // usetheplaybuttontolistentothec (188:326) + constraints: BoxConstraints( + maxWidth: 150 * fem, + ), + child: Text( + 'Use the play button to \nlisten to the content', + style: GoogleFonts.poppins( + fontSize: 13 * ffem, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + ], + ), + ), + Container( + // autogroupfjbbRwd (9njx5C624LsEDZHy9XFjbB) + margin: EdgeInsets.fromLTRB(9 * fem, 0 * fem, 0 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // autogroupbg5kxwZ (9njxCBtMttYa4EhNhEBG5K) + margin: EdgeInsets.fromLTRB(0 * fem, 9 * fem, 14 * fem, 0 * fem), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // vectorh8T (188:329) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 32 * fem), + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-8MD.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + Container( + // vectorQoZ (188:330) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 37 * fem), + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-SuD.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + Container( + // vectorhXm (188:331) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 36 * fem), + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-pGX.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + Container( + // vectorBC3 (188:332) + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-UWj.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + ], + ), + ), + Container( + // smallovalpaleyellowgreenspotsf (188:327) + constraints: BoxConstraints( + maxWidth: 327 * fem, + ), + child: Text( + 'Small, oval, pale yellow-green spots first appear on young leaves.\n\nOften the spots are surrounded by a narrow, yellow zone.\n\nAs the spots grow and turn brown or gray, concentric rings with scattered, tiny black dots become visible and eventually the dried tissue falls, leading to defoliation\n\nLeaves of any age can be affected.\n\n\n\n\n', + style: GoogleFonts.roboto( + fontSize: 13 * ffem, + fontWeight: FontWeight.w100, + height: 1.1725 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_description/main.dart b/.Connected_Version - TeaHub/lib/disease_description/main.dart new file mode 100644 index 0000000..543f638 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description/main.dart @@ -0,0 +1,23 @@ +import 'package:TeaHub/disease_description/diseases.dart'; + +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); // Fixing the key parameter + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Disease Detection', + theme: ThemeData( + primarySwatch: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: const Disease(), // Using the Disease widget as the home screen + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/analyser.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/analyser.dart new file mode 100644 index 0000000..e1c7b64 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/analyser.dart @@ -0,0 +1,65 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; + +class Splash Screen extends StatefulWidget{ + const SplashScreen({super.key}); + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + super.initState(); + Timer(const Duration(seconds: 5), () { + Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => const MyHomePage())); + }); + } + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Make the .json animation smaller + Transform.scale( + scale: 0.65, // Adjust scale to make animation smaller + child: Lottie.asset("assets/Analyser2.json"), + ), + const SizedBox(height: 20), + TweenAnimationBuilder( + tween: Tween(begin: 0.0, end: 1.0), + duration: const Duration(seconds: 2), + builder: (context, double value, child) { + // Making the dots "..." animated + String dots = List.generate((value * 3).toInt(), (index) => ".").join(); + return ShaderMask( + shaderCallback: (Rect bounds) { + return LinearGradient( + colors: [Colors.blue, Colors.purple], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ).createShader(bounds); + }, + child: Text( + "Analysing$dots", + style: const TextStyle( + fontSize: 40, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + ); + }, + ), + ], + ), + ), + ); + } +} + + diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/colors.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/colors.dart new file mode 100644 index 0000000..8c47e8d --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/colors.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; + +class colors { + static final whiteClr = Color(0xFFFFFFFF); + static final grnClr = Color(0xFF55AA9C); + static final grn2Clr = Color(0xFFD1EAC0); + static final gryClr = Color(0xFFE8E8E8); + static final blClr = Color(0xFF0E0E0E); +} diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/diseasenotfound.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/diseasenotfound.dart new file mode 100644 index 0000000..1b0a51b --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/diseasenotfound.dart @@ -0,0 +1,91 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; + + + +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + super.initState(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 20), + const Text( + 'DISEASE NOT FOUND', + style: TextStyle( + fontSize: 36, + fontWeight: FontWeight.bold, + color: Colors.red, + ), + ), + const SizedBox(height: 20), + Transform.scale( + scale: 0.95, + child: Lottie.asset("assets/dieasenotfound/error.json"), + ), + const SizedBox(height: 100), + buildGlassButton( + context, + text: 'Redirect to Chatbot', + iconData: Icons.chat, + buttonColor: Color(0xFF4ECB81), + onPressed: () { + + }, + ), + const SizedBox(height: 40), + buildGlassButton( + context, + text: 'Scan Again', + iconData: Icons.scanner, + buttonColor: Colors.tealAccent[700]!, + onPressed: () { + + }, + ), + ], + ), + ), + ); + } + + Widget buildGlassButton(BuildContext context, {required String text, required IconData iconData, required Color buttonColor, required VoidCallback onPressed}) { + return SizedBox( + width: double.infinity, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 50), + child: ElevatedButton.icon( + icon: Icon(iconData, color: Colors.white), + label: Text(text), + onPressed: onPressed, + style: ElevatedButton.styleFrom( + foregroundColor: Colors.white, backgroundColor: buttonColor.withOpacity(0.7), padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 20), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + ), + shadowColor: buttonColor.withOpacity(0.4), + elevation: 10, + textStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.bold), + side: BorderSide(color: buttonColor, width: 1.5), + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/home_screen.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/home_screen.dart new file mode 100644 index 0000000..fcf6f73 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/home_screen.dart @@ -0,0 +1,374 @@ + +import 'package:TeaHub/disease_description_treatment/product_screen.dart'; +import 'package:TeaHub/disease_description_treatment/product_screen2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'colors.dart'; + +class HomeScreen extends StatelessWidget { + List catergories = []; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: colors.whiteClr, + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 20), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Find your\nfavorite plants", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + SizedBox(height: 30), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Stack( + children: [ + Container( + height: 110, + width: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: colors.grn2Clr, + ), + ), + Container( + height: 120, + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "30% OFF", + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + Text( + "02 - 23 July", + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.black54, + ), + ) + ], + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/plant.jpg", + ), + ], + ), + ) + ], + ), + ), + SizedBox( + height: 10, + ), + SizedBox( + height: 40, + child: ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: catergories.length, + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 15), + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + border: Border.all( + color: index == 1 ? Colors.black : Colors.black26, + ), + ), + child: Center( + child: Text( + catergories[index], + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: index == 1 ? Colors.black : Colors.black26, + ), + ), + ), + ); + }, + ), + ), + SizedBox( + height: 20, + ), + Padding( + padding: const EdgeInsets.only(left: 15), + child: SizedBox( + height: 350, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: 2, + itemBuilder: (context, index) { + if (index == 0) { + // First gray box + return Stack( + children: [ + Container( + margin: EdgeInsets.only( + right: 15, + top: 5, + left: 5, + bottom: 5, + ), + width: MediaQuery.of(context).size.width / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: colors.gryClr, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + spreadRadius: 1, + ), + ], + ), + child: Column( + children: [ + Container( + height: 280, + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen(), + ), + ); + }, + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(15), + child: Image.asset( + "assets/images/disease_description_and_treatment_imgs/plant${index + 1}.png", + ), + ), + Positioned( + left: 140, + top: 10, + child: Text( + "", + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: colors.blClr, + ), + ), + ), + ], + ), + ), + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen(), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(14), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(30), + color: Colors.white, + ), + child: Text( + "Description", + style: TextStyle( + fontSize: 16, + color: colors.blClr, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen(), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: colors.blClr, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ); + } else { + // Second gray box + return Stack( + children: [ + Container( + margin: EdgeInsets.only( + right: 15, + top: 5, + left: 5, + bottom: 5, + ), + width: MediaQuery.of(context).size.width / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: colors.gryClr, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + spreadRadius: 1, + ), + ], + ), + child: Column( + children: [ + Container( + height: 280, + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen2(), + ), + ); + }, + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(15), + child: Image.asset( + "assets/images/disease_description_and_treatment_imgs/plant${index + 1}.png", + ), + ), + Positioned( + left: 140, + top: 10, + child: Text( + "", + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: colors.blClr, + ), + ), + ), + ], + ), + ), + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen2(), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(14), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(30), + color: Colors.white, + ), + child: Text( + "Treatment", + style: TextStyle( + fontSize: 16, + color: colors.blClr, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen2(), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: colors.blClr, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ); + } + }, + ), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/main.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/main.dart new file mode 100644 index 0000000..e6cde47 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/main.dart @@ -0,0 +1,18 @@ +import 'package:TeaHub/disease_description_treatment/welcome_screen.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: WelcomeScreen(), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/product_screen.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/product_screen.dart new file mode 100644 index 0000000..0bd7d3f --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/product_screen.dart @@ -0,0 +1,170 @@ +import 'package:flutter/material.dart'; +import 'dart:ui' as ui; +import 'package:TeaHub/disease_description_treatment/product_screen2.dart'; + +class DiseaseInfoScreen extends StatefulWidget { + @override + _DiseaseInfoScreenState createState() => _DiseaseInfoScreenState(); +} + +class _DiseaseInfoScreenState extends State { + double _dragExtent = 0.0; + + @override + Widget build(BuildContext context) { + double screenHeight = MediaQuery.of(context).size.height; + double containerHeight = screenHeight / 2; + + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: Colors.transparent, + elevation: 0, + ), + extendBodyBehindAppBar: true, + body: Stack( + children: [ + Image.asset( + 'assets/teabot.png', + height: screenHeight, + fit: BoxFit.cover, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox(height: screenHeight * 0.25), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + 'Grey Blight', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + 'Pestalotiopsis', + style: TextStyle( + fontSize: 24, + fontWeight: FontWeight.bold, + color: Colors.red, + ), + ), + ), + Spacer(), + ClipRRect( + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + child: BackdropFilter( + filter: ui.ImageFilter.blur(sigmaX: 10, sigmaY: 10), + child: Container( + height: containerHeight, + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.7), + borderRadius: BorderRadius.vertical(top: Radius.circular(30)), + ), + padding: EdgeInsets.symmetric(horizontal: 24, vertical: 36), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.teal, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(30), + ), + padding: EdgeInsets.symmetric(horizontal: 32, vertical: 16), + ), + onPressed: () { + // TODO: Play audio + }, + icon: Icon(Icons.play_circle_fill, size: 30), + label: Text( + textAlign:TextAlign.left, + 'Listen to the symptoms\nUse the play button to listen to the content', + style: TextStyle( + fontSize: 16, + ), + ), + ), + SizedBox(height: 16), + + Text( + '• Small, oval, pale yellow-green spots first appear on young leaves.\n' + '• Often the spots are surrounded by a narrow, yellow zone.', + style: TextStyle( + fontSize: 18, + color: Color(0xFF000000), + ), + ), + SizedBox(height: 24), + Center( + child: GestureDetector( + onHorizontalDragUpdate: (details) { + setState(() { + _dragExtent += details.primaryDelta ?? 0; + _dragExtent = _dragExtent.clamp(0.0, MediaQuery.of(context).size.width - 240.0); + }); + }, + onHorizontalDragEnd: (details) { + if (_dragExtent >= MediaQuery.of(context).size.width - 240.0) { + + Navigator.push(context, MaterialPageRoute(builder: (context) => Treatment())); + } + setState(() { + _dragExtent = 0.0; + }); + }, + child: Container( + width: MediaQuery.of(context).size.width * 0.6, + height: 60, + decoration: BoxDecoration( + color: Color(0xFF4ECB81).withOpacity(0.7), + borderRadius: BorderRadius.circular(30), + ), + child: Stack( + alignment: Alignment.center, + children: [ + Text( + "View the Treatment Plan", + style: TextStyle(color: Colors.white, fontSize: 20), + ), + Positioned( + left: _dragExtent, + child: Container( + width: 40, + height: 40, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: Colors.white, + boxShadow: [ + BoxShadow(color: Colors.grey, offset: Offset(1, 1), blurRadius: 2), + ], + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + ), + ], + ), + ], + ), + ); + } +} + diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/product_screen2.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/product_screen2.dart new file mode 100644 index 0000000..7e08116 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/product_screen2.dart @@ -0,0 +1,79 @@ +// import 'package:description_page/colors.dart'; +import 'package:TeaHub/disease_description_treatment/colors.dart'; +import 'package:flutter/material.dart'; + +class ProductScreen2 extends StatelessWidget { + const ProductScreen2({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: colors.whiteClr, + body: SafeArea( + child: Column( + children: [ + SizedBox(height: 15), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black12, + ), + ), + ), + Text( + "Details", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black12, + ), + ), + ), + ], + ), + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/welcome.jpg", + height: MediaQuery.of(context).size.height / 2, + ), + SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Plant Name", + style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + ), + Row( + children: [], + ) + ], + ), + ), + SizedBox(height: 15), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Text( + "xwiefhw xfwx ywyfgwyef wyfwygefgweuf wefgwyefgw uyguywfw wefgwuef wefgwuef efuwguefy efwegf wuwfweuf wrfgwu fwuerw wfygwuerg w uweyrgwuegurw wergwufywu efw wygfweihfiw wiefiwjeniwrfhwi fihfirhfidncjsd ", + style: TextStyle(), + ), + ) + ], + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_description_treatment/welcome_screen.dart b/.Connected_Version - TeaHub/lib/disease_description_treatment/welcome_screen.dart new file mode 100644 index 0000000..ccaab2b --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_description_treatment/welcome_screen.dart @@ -0,0 +1,66 @@ +import 'package:TeaHub/disease_description_treatment/home_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:TeaHub/disease_description_treatment/colors.dart'; + +class WelcomeScreen extends StatelessWidget { + const WelcomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Material( + color: colors.whiteClr, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Brown Blight\nDisease", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 50, + fontWeight: FontWeight.bold, + letterSpacing: 1, + wordSpacing: 1, + ), + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/welcome.jpg", + fit: BoxFit.cover, + scale: 1.2, + ), + SizedBox(height: 50), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomeScreen(), + )); + }, + child: Container( + padding: EdgeInsets.all(14), + decoration: BoxDecoration( + color: colors.grnClr, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 6, + spreadRadius: 4, + ), + ], + ), + child: Text( + "GO", + style: TextStyle( + color: Colors.white, + fontSize: 17, + fontWeight: FontWeight.w500), + ), + ), + ) + ], + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_treatment/AppNavigationScreen.dart b/.Connected_Version - TeaHub/lib/disease_treatment/AppNavigationScreen.dart new file mode 100644 index 0000000..6f7e184 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_treatment/AppNavigationScreen.dart @@ -0,0 +1,199 @@ +import 'package:flutter/material.dart'; + +class AppNavigationScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Positioned.fill( + child: Image.asset( + 'images/treatment_imgs/your_image.jpg', + fit: BoxFit.cover, + ), + ), + Positioned( + top: 312, + left: 0, + right: 0, + child: Container( + width: 375, + height: 500, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + color: Colors.white, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 343, + height: 76, + margin: EdgeInsets.only(left: 18, top: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Heading', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 16, + fontWeight: FontWeight.w700, + letterSpacing: 0, + ), + ), + Text( + 'Subheading', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 24, + fontWeight: FontWeight.w700, + letterSpacing: 0, + color: Colors.lightGreen, + ), + ), + ], + ), + ), + ], + ), + ), + ), + Positioned( + top: 433, + left: 11, + child: Container( + width: 350, + height: 47, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(28), + color: Color(0xFFE6FFD6), // #E6FFD6 + ), + ), + ), + Positioned( + top: 450, + left: 36, + child: Container( + width: 134, + height: 17, + child: Text( + 'Description', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.w600, + letterSpacing: 0, + height: 1.5, // Line height equivalent to 21px + color: Colors.black, // Assuming text color is black + ), + textAlign: TextAlign.center, + ), + ), + ), + Positioned( + top: 447, + left: 198, + child: Container( + width: 141, + height: 21, + child: Text( + 'Treatment', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.w600, + letterSpacing: 0, + height: 1.5, // Line height equivalent to 21px + color: Colors.black, // Assuming text color is black + ), + textAlign: TextAlign.center, + ), + ), + ), + Positioned( + top: 512, + left: 18, + child: Container( + width: 273, + height: 34, + child: Text( + 'Treatment with Biological Agents', + style: TextStyle( + fontFamily: 'Inter', + fontSize: 16, + fontWeight: FontWeight.w700, + letterSpacing: 0, + height: 1.1875, // Line height equivalent to 19px + color: Color(0xFF4ECB81), // #4ECB81 + ), + textAlign: TextAlign.left, + ), + ), + ), + Positioned( + top: 572, + left: 25, + child: Container( + width: 117, + height: 115, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Color(0x40000000), + offset: Offset(4, 4), + blurRadius: 4, + spreadRadius: 3, + ), + ], + image: DecorationImage( + image: AssetImage( + 'images/treatment_imgs/med 1.png'), // Replace 'image.png' with your image path + fit: BoxFit.cover, + ), + ), + child: Container( + width: 118, + height: 1, + margin: EdgeInsets.only(top: 87), + decoration: BoxDecoration( + border: Border( + top: BorderSide( + width: 1, + color: Color(0xFFF0F0F0), // #F0F0F0 + ), + ), + ), + ), + ), + ), + Positioned( + top: 572, + left: 222, + child: Container( + width: 117, + height: 115, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Color(0x40000000), + offset: Offset(4, 4), + blurRadius: 4, + spreadRadius: 3, + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/disease_treatment/main.dart b/.Connected_Version - TeaHub/lib/disease_treatment/main.dart new file mode 100644 index 0000000..ac8ac8d --- /dev/null +++ b/.Connected_Version - TeaHub/lib/disease_treatment/main.dart @@ -0,0 +1,21 @@ +// main.dart + +import 'package:TeaHub/disease_treatment/AppNavigationScreen.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Your App Name', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: AppNavigationScreen(), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/core/app_export.dart b/.Connected_Version - TeaHub/lib/editor_page/core/app_export.dart new file mode 100644 index 0000000..53add88 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/core/app_export.dart @@ -0,0 +1,7 @@ +export '../core/utils/image_constant.dart'; +export '../routes/app_routes.dart'; +export '../theme/app_decoration.dart'; +export '../theme/theme_helper.dart'; +export '../widgets/custom_image_view.dart'; +export '../theme/custom_button_style.dart'; +export '../core/utils/date_time_utils.dart'; diff --git a/.Connected_Version - TeaHub/lib/editor_page/core/utils/date_time_utils.dart b/.Connected_Version - TeaHub/lib/editor_page/core/utils/date_time_utils.dart new file mode 100644 index 0000000..baead04 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/core/utils/date_time_utils.dart @@ -0,0 +1,17 @@ +import 'package:intl/date_symbol_data_local.dart'; +import 'package:intl/intl.dart'; + +const String dateTimeFormatPattern = 'dd/MM/yyyy'; + +extension DateTimeExtension on DateTime { + /// Return a string representing [date] formatted according to our locale + String format({ + String pattern = dateTimeFormatPattern, + String? locale, + }) { + if (locale != null && locale.isNotEmpty) { + initializeDateFormatting(locale); + } + return DateFormat(pattern, locale).format(this); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/core/utils/image_constant.dart b/.Connected_Version - TeaHub/lib/editor_page/core/utils/image_constant.dart new file mode 100644 index 0000000..5f0d89d --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/core/utils/image_constant.dart @@ -0,0 +1,27 @@ +class ImageConstant { + // Image folder path + static String imagePath = 'assets/images'; + + // Common images + static String imgArrowLeft = '$imagePath/img_arrow_left.svg'; + + static String imgSrilanka1 = '$imagePath/img_srilanka_1.png'; + + static String imgArrowdropdown = '$imagePath/img_arrowdropdown.svg'; + + static String imgGroup10 = '$imagePath/img_group_10.png'; + + static String imgHome1SvgrepoCom = '$imagePath/img_home_1_svgrepo_com.svg'; + + static String imgContrast = '$imagePath/img_contrast.svg'; + + static String imgScanSvgrepoCom = '$imagePath/img_scan_svgrepo_com.svg'; + + static String imgPlantPotSvgrepoCom = + '$imagePath/img_plant_pot_svgrepo_com.svg'; + + static String imgUserCircleSvgrepoCom = + '$imagePath/img_user_circle_svgrepo_com.svg'; + + static String imageNotFound = 'assets/images/image_not_found.png'; +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/presentation/app_navigation_screen/app_navigation_screen.dart b/.Connected_Version - TeaHub/lib/editor_page/presentation/app_navigation_screen/app_navigation_screen.dart new file mode 100644 index 0000000..c033650 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/presentation/app_navigation_screen/app_navigation_screen.dart @@ -0,0 +1,122 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; + + +class AppNavigationScreen extends StatelessWidget { + const AppNavigationScreen({Key? key}) + : super( + key: key, + ); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + backgroundColor: Color(0XFFFFFFFF), + body: SizedBox( + width: double.maxFinite, + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: Color(0XFFFFFFFF), + ), + child: Column( + children: [ + SizedBox(height: 10.v), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.h), + child: Text( + "App Navigation", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0XFF000000), + fontSize: 20.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + SizedBox(height: 10.v), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.only(left: 20.h), + child: Text( + "Check your app's UI from the below demo screens of your app.", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0XFF888888), + fontSize: 16.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + SizedBox(height: 5.v), + Divider( + height: 1.v, + thickness: 1.v, + color: Color(0XFF000000), + ), + ], + ), + ), + _buildGroupAP12(context), + ], + ), + ), + ), + ); + } + + /// Section Widget + Widget _buildGroupAP12(BuildContext context) { + return Expanded( + child: SingleChildScrollView( + child: Container( + decoration: BoxDecoration( + color: Color(0XFFFFFFFF), + ), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFFFFFFF), + ), + child: Column( + children: [ + SizedBox(height: 10.v), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.h), + child: Text( + "Edit Profile - Container", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0XFF000000), + fontSize: 20.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + SizedBox(height: 10.v), + SizedBox(height: 5.v), + Divider( + height: 1.v, + thickness: 1.v, + color: Color(0XFF888888), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/presentation/edit_profile_container_screen/edit_profile_container_screen.dart b/.Connected_Version - TeaHub/lib/editor_page/presentation/edit_profile_container_screen/edit_profile_container_screen.dart new file mode 100644 index 0000000..ea5c5ce --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/presentation/edit_profile_container_screen/edit_profile_container_screen.dart @@ -0,0 +1,62 @@ +import '../../presentation/edit_profile_page/edit_profile_page.dart'; +import '../../widgets/custom_bottom_bar.dart'; +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; + +// ignore_for_file: must_be_immutable +class EditProfileContainerScreen extends StatelessWidget { + EditProfileContainerScreen({Key? key}) : super(key: key); + + GlobalKey navigatorKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + body: Navigator( + key: navigatorKey, + initialRoute: AppRoutes.editProfilePage, + onGenerateRoute: (routeSetting) => PageRouteBuilder( + pageBuilder: (ctx, ani, ani1) => + getCurrentPage(routeSetting.name!), + transitionDuration: Duration(seconds: 0) + ) + ), + bottomNavigationBar: _buildBottomBar(context) + ) + ); + } + + /// Section Widget + Widget _buildBottomBar(BuildContext context) { + return CustomBottomBar(onChanged: (BottomBarEnum type) { + Navigator.pushNamed(navigatorKey.currentContext!, getCurrentRoute(type)); + }); + } + + ///Handling route based on bottom click actions + String getCurrentRoute(BottomBarEnum type) { + switch (type) { + case BottomBarEnum.Home1svgrepocom: + return "/"; + case BottomBarEnum.Contrast: + return "/"; + case BottomBarEnum.Plantpotsvgrepocom: + return AppRoutes.editProfilePage; + case BottomBarEnum.Usercirclesvgrepocom: + return "/"; + default: + return "/"; + } + } + + ///Handling page based on route + Widget getCurrentPage(String currentRoute) { + switch (currentRoute) { + case AppRoutes.editProfilePage: + return EditProfilePage(); + default: + return DefaultWidget(); + } + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/presentation/edit_profile_page/edit_profile_page.dart b/.Connected_Version - TeaHub/lib/editor_page/presentation/edit_profile_page/edit_profile_page.dart new file mode 100644 index 0000000..9727daf --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/presentation/edit_profile_page/edit_profile_page.dart @@ -0,0 +1,351 @@ +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class EditPage extends StatelessWidget { + const EditPage({Key? key}) : super(key: key); + + Future> onLoad() async { + final prefs = await SharedPreferences.getInstance(); + var uid = prefs.getString('uid'); + + final currentUser = await FirebaseFirestore.instance + .collection('Users') + .where('uid', isEqualTo: uid) + .get(); + + Map controllers = { + 'fullName': TextEditingController(), + 'nickName': TextEditingController(), + 'email': TextEditingController(), + 'phoneNumber': TextEditingController(), + 'country': TextEditingController(), + 'gender': TextEditingController(), + 'address': TextEditingController(), + }; + + currentUser.docs.forEach((doc) { + if (doc.data() != null) { + controllers['fullName'] = + TextEditingController(text: doc.data()['fullName'] ?? ''); + controllers['nickName'] = + TextEditingController(text: doc.data()['nickName'] ?? ''); + controllers['email'] = + TextEditingController(text: doc.data()['email'] ?? ''); + controllers['phoneNumber'] = + TextEditingController(text: doc.data()['phonenumber'] ?? ''); + controllers['country'] = + TextEditingController(text: doc.data()['country'] ?? ''); + controllers['gender'] = + TextEditingController(text: doc.data()['gender'] ?? ''); + controllers['address'] = + TextEditingController(text: doc.data()['address'] ?? ''); + } + }); + + return controllers; + } + + Future updateUser( + Map controllers) async { + try { + final prefs = await SharedPreferences.getInstance(); + var uid = prefs.getString('uid'); + + QuerySnapshot querySnapshot = await FirebaseFirestore.instance + .collection('Users') + .where('uid', isEqualTo: uid) + .get(); + + for (var doc in querySnapshot.docs) { + await FirebaseFirestore.instance + .collection('Users') + .doc(doc.id) + .update({ + 'fullName': controllers['fullName']!.text, + 'nickName': controllers['nickName']!.text, + 'email': controllers['email']!.text, + 'phonenumber': controllers['phoneNumber']!.text, + 'country': controllers['country']!.text, + 'gender': controllers['gender']!.text, + 'address': controllers['address']!.text, + }); + } + print('Users updated successfully'); + } catch (e) { + print('Failed to update user: $e'); + } + } + + @override + Widget build(BuildContext context) { + return FutureBuilder>( + future: onLoad(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error loading data')); + } else { + Map controllers = snapshot.data!; + return Scaffold( + appBar: AppBar( + title: const Text( + 'Edit Profile', + style: TextStyle(fontSize: 35, fontWeight: FontWeight.bold), + textAlign: TextAlign.center, + ), + centerTitle: true, + titleSpacing: NavigationToolbar.kMiddleSpacing, + ), + body: SingleChildScrollView( + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox(height: 30), + MyTextField( + controller: controllers['fullName']!, + obscureText: false, + labelText: 'Full Name', + filled: true, + ), + SizedBox(height: 15), + MyTextField( + controller: controllers['nickName']!, + obscureText: false, + labelText: 'Nick Name', + filled: true, + ), + SizedBox(height: 15), + MyTextField( + controller: controllers['email']!, + obscureText: false, + labelText: 'Email', + filled: true, + ), + SizedBox(height: 15), + // Padding( + // padding: const EdgeInsets.symmetric( + // horizontal: 25.0, vertical: 10.0), + // child: TextField( + // controller: controllers['phoneNumber']!, + // obscureText: false, + // decoration: InputDecoration( + // labelText: 'Phone Number', + // filled: true, + // fillColor: Colors.greenAccent.shade100, + // border: OutlineInputBorder(), + // ), + // ), + // ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 25.0, vertical: 10.0), + child: TextField( + controller: controllers['phoneNumber']!, + obscureText: false, + decoration: InputDecoration( + prefixIcon: Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: SizedBox( + width: 25.0, + height: 20.0, + child: + Image.asset('assets/editpage/srilanka.png'), + ), + ), + labelText: 'Phone Number', + filled: true, + fillColor: Colors.greenAccent.shade100, + border: OutlineInputBorder(), + ), + ), + ), + SizedBox(height: 15), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 25.0, vertical: 10.0), + child: Row( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 5.0), + child: TextField( + controller: controllers['country']!, + obscureText: false, + decoration: InputDecoration( + labelText: 'Country', + filled: true, + fillColor: Colors.greenAccent.shade100, + border: OutlineInputBorder(), + ), + ), + ), + ), + SizedBox(width: 10), + Expanded( + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 5.0), + child: TextField( + controller: controllers['gender']!, + obscureText: false, + decoration: InputDecoration( + labelText: 'Gender', + filled: true, + fillColor: Colors.greenAccent.shade100, + border: OutlineInputBorder(), + ), + ), + ), + ), + ], + ), + ), + SizedBox(height: 15), + MyTextField( + controller: controllers['address']!, + obscureText: false, + labelText: 'Address', + filled: true, + ), + SizedBox(height: 15), + GestureDetector( + onTap: () async { + await updateUser(controllers); + SendEmailMessage(context); + }, + child: Container( + padding: const EdgeInsets.all(18), + margin: const EdgeInsets.symmetric(horizontal: 25), + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(5)), + child: const Center( + child: Text( + 'SUBMIT', + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ) + ], + ), + ), + ), + ); + } + }, + ); + } +} + +void SendEmailMessage(BuildContext context) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + content: Container( + width: 300, // Adjust width as needed + height: 200, // Adjust height as needed + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Icon( + Icons.check_circle_sharp, // Replace with the appropriate icon + color: Color.fromARGB(255, 78, 203, 128), + size: 80, + ), + SizedBox(height: 10), + Text( + 'Success', + textAlign: TextAlign.center, // Align text to the center + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 27, + fontWeight: FontWeight.bold, + ), + ), + + SizedBox(height: 10), // Adjust the height for spacing + Text( + 'Profile updated successfully.', + textAlign: TextAlign.center, // Align text to the center + style: TextStyle( + fontSize: 17, + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + actions: [ + Center( + child: Container( + width: 200, // Adjust width as needed + height: 40, // Adjust height as needed + + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 5), // Adjust border radius for roundness + color: Colors.blue, // Set button background color + ), + child: TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.white, // Set text color + fontSize: 18, + ), + ), + ), + ), + ), + ], + ); + }, + ); +} + +class MyTextField extends StatelessWidget { + final TextEditingController controller; + final bool obscureText; + final String? labelText; + final bool filled; + + const MyTextField({ + Key? key, + required this.controller, + required this.obscureText, + this.labelText, + this.filled = false, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 25.0, vertical: 10.0), + child: TextField( + controller: controller, + obscureText: obscureText, + decoration: InputDecoration( + border: OutlineInputBorder(), + labelText: labelText, + filled: filled, + fillColor: Colors.greenAccent.shade100, + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/routes/app_routes.dart b/.Connected_Version - TeaHub/lib/editor_page/routes/app_routes.dart new file mode 100644 index 0000000..05089c7 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/routes/app_routes.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import '../presentation/edit_profile_container_screen/edit_profile_container_screen.dart'; + + +class AppRoutes { + static const String editProfileContainerScreen = + '/edit_profile_container_screen'; + + static const String editProfilePage = '/edit_profile_page'; + + static const String appNavigationScreen = '/app_navigation_screen'; + + static Map routes = { + editProfileContainerScreen: (context) => EditProfileContainerScreen(), + + }; +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/theme/app_decoration.dart b/.Connected_Version - TeaHub/lib/editor_page/theme/app_decoration.dart new file mode 100644 index 0000000..b0d46a5 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/theme/app_decoration.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import '../theme/theme_helper.dart'; + +class AppDecoration { + // Fill decorations + static BoxDecoration get fillWhiteA => BoxDecoration( + color: appTheme.whiteA700, + ); +} + +class BorderRadiusStyle {} + +// Comment/Uncomment the below code based on your Flutter SDK version. + +// For Flutter SDK Version 3.7.2 or greater. + +double get strokeAlignInside => BorderSide.strokeAlignInside; + +double get strokeAlignCenter => BorderSide.strokeAlignCenter; + +double get strokeAlignOutside => BorderSide.strokeAlignOutside; + +// For Flutter SDK Version 3.7.1 or less. + +// StrokeAlign get strokeAlignInside => StrokeAlign.inside; +// +// StrokeAlign get strokeAlignCenter => StrokeAlign.center; +// +// StrokeAlign get strokeAlignOutside => StrokeAlign.outside; diff --git a/.Connected_Version - TeaHub/lib/editor_page/theme/custom_button_style.dart b/.Connected_Version - TeaHub/lib/editor_page/theme/custom_button_style.dart new file mode 100644 index 0000000..b2f2fd8 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/theme/custom_button_style.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +/// A class that offers pre-defined button styles for customizing button appearance. +class CustomButtonStyles { + // text button style + static ButtonStyle get none => ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.transparent), + elevation: MaterialStateProperty.all(0), + ); +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/theme/theme_helper.dart b/.Connected_Version - TeaHub/lib/editor_page/theme/theme_helper.dart new file mode 100644 index 0000000..edb35fe --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/theme/theme_helper.dart @@ -0,0 +1,124 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; + +String _appTheme = "primary"; + +/// Helper class for managing themes and colors. +class ThemeHelper { + // A map of custom color themes supported by the app + Map _supportedCustomColor = { + 'primary': PrimaryColors() + }; + +// A map of color schemes supported by the app + Map _supportedColorScheme = { + 'primary': ColorSchemes.primaryColorScheme + }; + + /// Changes the app theme to [_newTheme]. + void changeTheme(String _newTheme) { + _appTheme = _newTheme; + } + + /// Returns the primary colors for the current theme. + PrimaryColors _getThemeColors() { + //throw exception to notify given theme is not found or not generated by the generator + if (!_supportedCustomColor.containsKey(_appTheme)) { + throw Exception( + "$_appTheme is not found.Make sure you have added this theme class in JSON Try running flutter pub run build_runner"); + } + //return theme from map + + return _supportedCustomColor[_appTheme] ?? PrimaryColors(); + } + + /// Returns the current theme data. + ThemeData _getThemeData() { + //throw exception to notify given theme is not found or not generated by the generator + if (!_supportedColorScheme.containsKey(_appTheme)) { + throw Exception( + "$_appTheme is not found.Make sure you have added this theme class in JSON Try running flutter pub run build_runner"); + } + //return theme from map + + var colorScheme = + _supportedColorScheme[_appTheme] ?? ColorSchemes.primaryColorScheme; + return ThemeData( + visualDensity: VisualDensity.standard, + colorScheme: colorScheme, + textTheme: TextThemes.textTheme(colorScheme), + scaffoldBackgroundColor: appTheme.whiteA700, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.primary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.h), + ), + visualDensity: const VisualDensity( + vertical: -4, + horizontal: -4, + ), + padding: EdgeInsets.zero, + ), + ), + ); + } + + /// Returns the primary colors for the current theme. + PrimaryColors themeColor() => _getThemeColors(); + + /// Returns the current theme data. + ThemeData themeData() => _getThemeData(); +} + +/// Class containing the supported text theme styles. +class TextThemes { + static TextTheme textTheme(ColorScheme colorScheme) => TextTheme( + bodySmall: TextStyle( + color: colorScheme.secondaryContainer, + fontSize: 10.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + titleLarge: TextStyle( + color: appTheme.black900, + fontSize: 22.fSize, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + ), + titleMedium: TextStyle( + color: appTheme.whiteA700, + fontSize: 16.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w500, + ), + ); +} + +/// Class containing the supported color schemes. +class ColorSchemes { + static final primaryColorScheme = ColorScheme.light( + // Primary colors + primary: Color(0XFF4ECB81), + secondaryContainer: Color(0XFF757575), + + // On colors(text colors) + onPrimary: Color(0XFF1E1E1E), + onPrimaryContainer: Color(0X334ECB81), + ); +} + +/// Class containing custom colors for a primary theme. +class PrimaryColors { + // Black + Color get black900 => Color(0XFF000000); + + // Gray + Color get gray500 => Color(0XFF9E9E9E); + + // White + Color get whiteA700 => Color(0XFFFFFFFF); +} + +PrimaryColors get appTheme => ThemeHelper().themeColor(); +ThemeData get theme => ThemeHelper().themeData(); diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/appbar_leading_image.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/appbar_leading_image.dart new file mode 100644 index 0000000..3354af3 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/appbar_leading_image.dart @@ -0,0 +1,39 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; + +// ignore: must_be_immutable +class AppbarLeadingImage extends StatelessWidget { + AppbarLeadingImage({ + Key? key, + this.imagePath, + this.margin, + this.onTap, + }) : super( + key: key, + ); + + String? imagePath; + + EdgeInsetsGeometry? margin; + + Function? onTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + onTap!.call(); + }, + child: Padding( + padding: margin ?? EdgeInsets.zero, + child: CustomImageView( + imagePath: imagePath, + height: 24.adaptSize, + width: 24.adaptSize, + fit: BoxFit.contain, + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/appbar_title.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/appbar_title.dart new file mode 100644 index 0000000..f3b5a53 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/appbar_title.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; + +// ignore: must_be_immutable +class AppbarTitle extends StatelessWidget { + AppbarTitle({ + Key? key, + required this.text, + this.margin, + this.onTap, + }) : super( + key: key, + ); + + String text; + + EdgeInsetsGeometry? margin; + + Function? onTap; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + onTap!.call(); + }, + child: Padding( + padding: margin ?? EdgeInsets.zero, + child: Text( + text, + style: theme.textTheme.titleLarge!.copyWith( + color: appTheme.black900, + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/custom_app_bar.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/custom_app_bar.dart new file mode 100644 index 0000000..b84706c --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/app_bar/custom_app_bar.dart @@ -0,0 +1,50 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +// ignore: must_be_immutable +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + CustomAppBar({ + Key? key, + this.height, + this.leadingWidth, + this.leading, + this.title, + this.centerTitle, + this.actions, + }) : super( + key: key, + ); + + final double? height; + + final double? leadingWidth; + + final Widget? leading; + + final Widget? title; + + final bool? centerTitle; + + final List? actions; + + @override + Widget build(BuildContext context) { + return AppBar( + elevation: 0, + toolbarHeight: height ?? 56.v, + automaticallyImplyLeading: false, + backgroundColor: Colors.transparent, + leadingWidth: leadingWidth ?? 0, + leading: leading, + title: title, + titleSpacing: 0, + centerTitle: centerTitle ?? false, + actions: actions, + ); + } + + @override + Size get preferredSize => Size( + SizeUtils.width, + height ?? 56.v, + ); +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/base_button.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/base_button.dart new file mode 100644 index 0000000..0a57200 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/base_button.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class BaseButton extends StatelessWidget { + BaseButton({ + Key? key, + required this.text, + this.onPressed, + this.buttonStyle, + this.buttonTextStyle, + this.isDisabled, + this.height, + this.width, + this.margin, + this.alignment, + }) : super( + key: key, + ); + + final String text; + + final VoidCallback? onPressed; + + final ButtonStyle? buttonStyle; + + final TextStyle? buttonTextStyle; + + final bool? isDisabled; + + final double? height; + + final double? width; + + final EdgeInsets? margin; + + final Alignment? alignment; + + @override + Widget build(BuildContext context) { + return const SizedBox.shrink(); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_bottom_bar.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_bottom_bar.dart new file mode 100644 index 0000000..e3684a0 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_bottom_bar.dart @@ -0,0 +1,130 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; + +class CustomBottomBar extends StatefulWidget { + CustomBottomBar({this.onChanged}); + + Function(BottomBarEnum)? onChanged; + + @override + CustomBottomBarState createState() => CustomBottomBarState(); +} + +class CustomBottomBarState extends State { + int selectedIndex = 0; + + List bottomMenuList = [ + BottomMenuModel( + icon: ImageConstant.imgHome1SvgrepoCom, + activeIcon: ImageConstant.imgHome1SvgrepoCom, + type: BottomBarEnum.Home1svgrepocom, + ), + BottomMenuModel( + icon: ImageConstant.imgContrast, + activeIcon: ImageConstant.imgContrast, + type: BottomBarEnum.Contrast, + ), + BottomMenuModel( + icon: ImageConstant.imgPlantPotSvgrepoCom, + activeIcon: ImageConstant.imgPlantPotSvgrepoCom, + type: BottomBarEnum.Plantpotsvgrepocom, + ), + BottomMenuModel( + icon: ImageConstant.imgUserCircleSvgrepoCom, + activeIcon: ImageConstant.imgUserCircleSvgrepoCom, + type: BottomBarEnum.Usercirclesvgrepocom, + ) + ]; + + @override + Widget build(BuildContext context) { + return Container( + height: 115.v, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + ImageConstant.imgGroup10, + ), + fit: BoxFit.cover, + ), + ), + child: BottomNavigationBar( + backgroundColor: Colors.transparent, + showSelectedLabels: false, + showUnselectedLabels: false, + selectedFontSize: 0, + elevation: 0, + currentIndex: selectedIndex, + type: BottomNavigationBarType.fixed, + items: List.generate(bottomMenuList.length, (index) { + return BottomNavigationBarItem( + icon: CustomImageView( + imagePath: bottomMenuList[index].icon, + height: 40.adaptSize, + width: 40.adaptSize, + color: appTheme.whiteA700, + ), + activeIcon: CustomImageView( + imagePath: bottomMenuList[index].activeIcon, + height: 40.adaptSize, + width: 40.adaptSize, + color: theme.colorScheme.onPrimary, + ), + label: '', + ); + }), + onTap: (index) { + selectedIndex = index; + widget.onChanged?.call(bottomMenuList[index].type); + setState(() {}); + }, + ), + ); + } +} + +enum BottomBarEnum { + Home1svgrepocom, + Contrast, + Plantpotsvgrepocom, + Usercirclesvgrepocom, +} + +class BottomMenuModel { + BottomMenuModel({ + required this.icon, + required this.activeIcon, + required this.type, + }); + + String icon; + + String activeIcon; + + BottomBarEnum type; +} + +class DefaultWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + color: Color(0xffffffff), + padding: EdgeInsets.all(10), + child: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Please replace the respective Widget here', + style: TextStyle( + fontSize: 18, + ), + ), + ], + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_drop_down.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_drop_down.dart new file mode 100644 index 0000000..9f5e327 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_drop_down.dart @@ -0,0 +1,144 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; + +class CustomDropDown extends StatelessWidget { + CustomDropDown({ + Key? key, + this.alignment, + this.width, + this.focusNode, + this.icon, + this.autofocus = true, + this.textStyle, + this.items, + this.hintText, + this.hintStyle, + this.prefix, + this.prefixConstraints, + this.suffix, + this.suffixConstraints, + this.contentPadding, + this.borderDecoration, + this.fillColor, + this.filled = true, + this.validator, + this.onChanged, String? value, + }) : super( + key: key, + ); + + final Alignment? alignment; + + final double? width; + + final FocusNode? focusNode; + + final Widget? icon; + + final bool? autofocus; + + final TextStyle? textStyle; + + final List? items; + + final String? hintText; + + final TextStyle? hintStyle; + + final Widget? prefix; + + final BoxConstraints? prefixConstraints; + + final Widget? suffix; + + final BoxConstraints? suffixConstraints; + + final EdgeInsets? contentPadding; + + final InputBorder? borderDecoration; + + final Color? fillColor; + + final bool? filled; + + final FormFieldValidator? validator; + + final Function(String)? onChanged; + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment ?? Alignment.center, + child: dropDownWidget, + ) + : dropDownWidget; + } + + Widget get dropDownWidget => SizedBox( + width: width ?? double.maxFinite, + child: DropdownButtonFormField( + focusNode: focusNode ?? FocusNode(), + icon: icon, + autofocus: autofocus!, + style: textStyle ?? theme.textTheme.bodySmall, + items: items?.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text( + value, + overflow: TextOverflow.ellipsis, + style: hintStyle ?? theme.textTheme.bodySmall, + ), + ); + }).toList(), + decoration: decoration, + validator: validator, + onChanged: (value) { + onChanged!(value.toString()); + }, + ), + ); + InputDecoration get decoration => InputDecoration( + hintText: hintText ?? "", + hintStyle: hintStyle ?? theme.textTheme.bodySmall, + prefixIcon: prefix, + prefixIconConstraints: prefixConstraints, + suffixIcon: suffix, + suffixIconConstraints: suffixConstraints, + isDense: true, + contentPadding: contentPadding ?? + EdgeInsets.only( + left: 16.h, + top: 19.v, + bottom: 19.v, + ), + fillColor: fillColor ?? theme.colorScheme.onPrimaryContainer, + filled: filled, + border: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + enabledBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + focusedBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + ); +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_elevated_button.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_elevated_button.dart new file mode 100644 index 0000000..cdb9030 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_elevated_button.dart @@ -0,0 +1,71 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; +import 'base_button.dart'; + +class CustomElevatedButton extends BaseButton { + CustomElevatedButton({ + Key? key, + this.decoration, + this.leftIcon, + this.rightIcon, + EdgeInsets? margin, + VoidCallback? onPressed, + ButtonStyle? buttonStyle, + Alignment? alignment, + TextStyle? buttonTextStyle, + bool? isDisabled, + double? height, + double? width, + required String text, + }) : super( + text: text, + onPressed: onPressed, + buttonStyle: buttonStyle, + isDisabled: isDisabled, + buttonTextStyle: buttonTextStyle, + height: height, + width: width, + alignment: alignment, + margin: margin, + ); + + final BoxDecoration? decoration; + + final Widget? leftIcon; + + final Widget? rightIcon; + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment ?? Alignment.center, + child: buildElevatedButtonWidget, + ) + : buildElevatedButtonWidget; + } + + Widget get buildElevatedButtonWidget => Container( + height: this.height ?? 44.v, + width: this.width ?? double.maxFinite, + margin: margin, + decoration: decoration, + child: ElevatedButton( + style: buttonStyle, + onPressed: isDisabled ?? false ? null : onPressed ?? () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + leftIcon ?? const SizedBox.shrink(), + Text( + text, + style: buttonTextStyle ?? theme.textTheme.titleMedium, + ), + rightIcon ?? const SizedBox.shrink(), + ], + ), + ), + ); +} diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_image_view.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_image_view.dart new file mode 100644 index 0000000..5d3b9d5 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_image_view.dart @@ -0,0 +1,164 @@ +// ignore_for_file: must_be_immutable + +import 'dart:io'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class CustomImageView extends StatelessWidget { + ///[imagePath] is required parameter for showing image + String? imagePath; + + double? height; + double? width; + Color? color; + BoxFit? fit; + final String placeHolder; + Alignment? alignment; + VoidCallback? onTap; + EdgeInsetsGeometry? margin; + BorderRadius? radius; + BoxBorder? border; + + ///a [CustomImageView] it can be used for showing any type of images + /// it will shows the placeholder image if image is not found on network image + CustomImageView({ + this.imagePath, + this.height, + this.width, + this.color, + this.fit, + this.alignment, + this.onTap, + this.radius, + this.margin, + this.border, + this.placeHolder = 'assets/images/image_not_found.png', + }); + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment!, + child: _buildWidget(), + ) + : _buildWidget(); + } + + Widget _buildWidget() { + return Padding( + padding: margin ?? EdgeInsets.zero, + child: InkWell( + onTap: onTap, + child: _buildCircleImage(), + ), + ); + } + + ///build the image with border radius + _buildCircleImage() { + if (radius != null) { + return ClipRRect( + borderRadius: radius ?? BorderRadius.zero, + child: _buildImageWithBorder(), + ); + } else { + return _buildImageWithBorder(); + } + } + + ///build the image with border and border radius style + _buildImageWithBorder() { + if (border != null) { + return Container( + decoration: BoxDecoration( + border: border, + borderRadius: radius, + ), + child: _buildImageView(), + ); + } else { + return _buildImageView(); + } + } + + Widget _buildImageView() { + if (imagePath != null) { + switch (imagePath!.imageType) { + case ImageType.svg: + return Container( + height: height, + width: width, + child: SvgPicture.asset( + imagePath!, + height: height, + width: width, + fit: fit ?? BoxFit.contain, + colorFilter: color != null + ? ColorFilter.mode( + this.color ?? Colors.transparent, BlendMode.srcIn) + : null, + ), + ); + case ImageType.file: + return Image.file( + File(imagePath!), + height: height, + width: width, + fit: fit ?? BoxFit.cover, + color: color, + ); + case ImageType.network: + return CachedNetworkImage( + height: height, + width: width, + fit: fit, + imageUrl: imagePath!, + color: color, + placeholder: (context, url) => Container( + height: 30, + width: 30, + child: LinearProgressIndicator( + color: Colors.grey.shade200, + backgroundColor: Colors.grey.shade100, + ), + ), + errorWidget: (context, url, error) => Image.asset( + placeHolder, + height: height, + width: width, + fit: fit ?? BoxFit.cover, + ), + ); + case ImageType.png: + default: + return Image.asset( + imagePath!, + height: height, + width: width, + fit: fit ?? BoxFit.cover, + color: color, + ); + } + } + return SizedBox(); + } +} + +extension ImageTypeExtension on String { + ImageType get imageType { + if (this.startsWith('http') || this.startsWith('https')) { + return ImageType.network; + } else if (this.endsWith('.svg')) { + return ImageType.svg; + } else if (this.startsWith('file://')) { + return ImageType.file; + } else { + return ImageType.png; + } + } +} + +enum ImageType { svg, png, network, file, unknown } diff --git a/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_text_form_field.dart b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_text_form_field.dart new file mode 100644 index 0000000..db25e50 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/editor_page/widgets/custom_text_form_field.dart @@ -0,0 +1,145 @@ +import 'package:TeaHub/chatbot_ui/core/utils/size_utils.dart'; +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; + +class CustomTextFormField extends StatelessWidget { + CustomTextFormField({ + Key? key, + this.alignment, + this.width, + this.scrollPadding, + this.controller, + this.focusNode, + this.autofocus = true, + this.textStyle, + this.obscureText = false, + this.textInputAction = TextInputAction.next, + this.textInputType = TextInputType.text, + this.maxLines, + this.hintText, + this.hintStyle, + this.prefix, + this.prefixConstraints, + this.suffix, + this.suffixConstraints, + this.contentPadding, + this.borderDecoration, + this.fillColor, + this.filled = true, + this.validator, + }) : super( + key: key, + ); + + final Alignment? alignment; + + final double? width; + + final TextEditingController? scrollPadding; + + final TextEditingController? controller; + + final FocusNode? focusNode; + + final bool? autofocus; + + final TextStyle? textStyle; + + final bool? obscureText; + + final TextInputAction? textInputAction; + + final TextInputType? textInputType; + + final int? maxLines; + + final String? hintText; + + final TextStyle? hintStyle; + + final Widget? prefix; + + final BoxConstraints? prefixConstraints; + + final Widget? suffix; + + final BoxConstraints? suffixConstraints; + + final EdgeInsets? contentPadding; + + final InputBorder? borderDecoration; + + final Color? fillColor; + + final bool? filled; + + final FormFieldValidator? validator; + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment ?? Alignment.center, + child: textFormFieldWidget(context), + ) + : textFormFieldWidget(context); + } + + Widget textFormFieldWidget(BuildContext context) => SizedBox( + width: width ?? double.maxFinite, + child: TextFormField( + scrollPadding: + EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + controller: controller, + focusNode: focusNode ?? FocusNode(), + autofocus: autofocus!, + style: textStyle ?? theme.textTheme.bodySmall, + obscureText: obscureText!, + textInputAction: textInputAction, + keyboardType: textInputType, + maxLines: maxLines ?? 1, + decoration: decoration, + validator: validator, + ), + ); + InputDecoration get decoration => InputDecoration( + hintText: hintText ?? "", + hintStyle: hintStyle ?? theme.textTheme.bodySmall, + prefixIcon: prefix, + prefixIconConstraints: prefixConstraints, + suffixIcon: suffix, + suffixIconConstraints: suffixConstraints, + isDense: true, + contentPadding: contentPadding ?? + EdgeInsets.symmetric( + horizontal: 16.h, + vertical: 19.v, + ), + fillColor: fillColor ?? theme.colorScheme.onPrimaryContainer, + filled: filled, + border: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + enabledBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + focusedBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + ); +} diff --git a/.Connected_Version - TeaHub/lib/firebase_options.dart b/.Connected_Version - TeaHub/lib/firebase_options.dart new file mode 100644 index 0000000..8df957d --- /dev/null +++ b/.Connected_Version - TeaHub/lib/firebase_options.dart @@ -0,0 +1,82 @@ +// File generated by FlutterFire CLI. +// ignore_for_file: lines_longer_than_80_chars, avoid_classes_with_only_static_members +import 'package:firebase_core/firebase_core.dart' show FirebaseOptions; +import 'package:flutter/foundation.dart' + show defaultTargetPlatform, kIsWeb, TargetPlatform; + +/// Default [FirebaseOptions] for use with your Firebase apps. +/// +/// Example: +/// ```dart +/// import 'firebase_options.dart'; +/// // ... +/// await Firebase.initializeApp( +/// options: DefaultFirebaseOptions.currentPlatform, +/// ); +/// ``` +class DefaultFirebaseOptions { + static FirebaseOptions get currentPlatform { + if (kIsWeb) { + return web; + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android; + case TargetPlatform.iOS: + return ios; + case TargetPlatform.macOS: + return macos; + case TargetPlatform.windows: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for windows - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + case TargetPlatform.linux: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for linux - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } + } + + static const FirebaseOptions web = FirebaseOptions( + apiKey: 'AIzaSyCRQt0-LRU434YbofXgRRnLwz3M5r0jOko', + appId: '1:1015273066077:web:a04102770cd8c1892c07b4', + messagingSenderId: '1015273066077', + projectId: 'teahub-user-authentication', + authDomain: 'teahub-user-authentication.firebaseapp.com', + storageBucket: 'teahub-user-authentication.appspot.com', + ); + + static const FirebaseOptions android = FirebaseOptions( + apiKey: 'AIzaSyApGuilr0-2FnbAMW4H9Kjwa8gLa9biSlg', + appId: '1:1015273066077:android:1f483103884e65f22c07b4', + messagingSenderId: '1015273066077', + projectId: 'teahub-user-authentication', + storageBucket: 'teahub-user-authentication.appspot.com', + ); + + static const FirebaseOptions ios = FirebaseOptions( + apiKey: 'AIzaSyCmP5dJK4sd_DuCHWJshFSjD4qu2cTh3UU', + appId: '1:1015273066077:ios:43ddf369307437d42c07b4', + messagingSenderId: '1015273066077', + projectId: 'teahub-user-authentication', + storageBucket: 'teahub-user-authentication.appspot.com', + iosClientId: '1015273066077-7cfcp445csabf493lmmp5u37cjscn0g9.apps.googleusercontent.com', + iosBundleId: 'com.example.teahub', + ); + + static const FirebaseOptions macos = FirebaseOptions( + apiKey: 'AIzaSyCmP5dJK4sd_DuCHWJshFSjD4qu2cTh3UU', + appId: '1:1015273066077:ios:a05e55eb540973902c07b4', + messagingSenderId: '1015273066077', + projectId: 'teahub-user-authentication', + storageBucket: 'teahub-user-authentication.appspot.com', + iosClientId: '1015273066077-h0rfk9mu0sdd1u57flkm16lr3fjjje6h.apps.googleusercontent.com', + iosBundleId: 'com.example.teahub.RunnerTests', + ); +} diff --git a/.Connected_Version - TeaHub/lib/home_page/constants.dart b/.Connected_Version - TeaHub/lib/home_page/constants.dart new file mode 100644 index 0000000..37269ea --- /dev/null +++ b/.Connected_Version - TeaHub/lib/home_page/constants.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; + +class Constants { + //Primary color + + //static var primaryColor = Color.fromARGB(255, 87, 141, 111); + static var primaryColor = Color.fromARGB(255, 78, 203, 128); + static var blackColor = Colors.black54; +} diff --git a/.Connected_Version - TeaHub/lib/home_page/main_interface.dart b/.Connected_Version - TeaHub/lib/home_page/main_interface.dart new file mode 100644 index 0000000..5853b56 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/home_page/main_interface.dart @@ -0,0 +1,528 @@ +import 'package:TeaHub/TeaDescriptionPage/main.dart'; +import 'package:TeaHub/chatbot_ui_updated/ChatScreen.dart'; +import 'package:TeaHub/home_page/scanPage.dart'; +import 'package:flutter/material.dart'; +import 'utils.dart'; + +class Scene extends StatelessWidget { + @override + Widget build(BuildContext context) { + double baseWidth = 375; + double fem = MediaQuery.of(context).size.width / baseWidth; + double ffem = fem * 0.97; + return Scaffold( + appBar: AppBar( + title: Text('Main Page'), + ), + body: Container( + width: double.infinity, + child: Container( + // maininterfaceQL4 (12:51) + width: double.infinity, + height: 792 * fem, + decoration: const BoxDecoration( + color: Color(0xffffffff), + ), + child: Stack( + children: [ + Positioned( + // navDB2 (12:52) + left: 19 * fem, + top: 7 * fem, + child: Container( + width: 342 * fem, + height: 21 * fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // pmfYp (I12:52;1:11) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 222 * fem, 0 * fem), + child: Text( + '9:40PM', + style: SafeGoogleFont( + 'Poppins', + fontSize: 14 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: Color(0xff000000), + ), + ), + ), + Container( + // vector7fi (I12:52;1:10) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 9.04 * fem, 1.48 * fem), + width: 12.96 * fem, + height: 11.52 * fem, + child: Image.asset( + 'assets/page-1/images/vector-AHS.png', + width: 12.96 * fem, + height: 11.52 * fem, + ), + ), + Container( + // vectoro2k (I12:52;1:6) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 9 * fem, 0.4 * fem), + width: 18 * fem, + height: 12.6 * fem, + child: Image.asset( + 'assets/page-1/images/vector-8vg.png', + width: 18 * fem, + height: 12.6 * fem, + ), + ), + Container( + // vectorVgG (I12:52;1:8) + width: 18 * fem, + height: 9 * fem, + child: Image.asset( + 'assets/page-1/images/vector-ax4.png', + width: 18 * fem, + height: 9 * fem, + ), + ), + ], + ), + ), + ), + Positioned( + // scansvgrepocomE84 (12:54) + left: 168 * fem, + top: 711 * fem, + child: Align( + child: SizedBox( + width: 40 * fem, + height: 40 * fem, + child: Image.asset( + 'assets/page-1/images/scansvgrepocom.png', + width: 40 * fem, + height: 40 * fem, + ), + ), + ), + ), + Positioned( + // autogroupqeegHs2 (23pzynm8Ewa3Ug27APqeeG) + left: 21.0000991821 * fem, + top: 65 * fem, + child: Container( + width: 295 * fem, + height: 56 * fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // peperomiaobtusfoliaZJk (12:80) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 227.23 * fem, 0 * fem), + width: 43.77 * fem, + height: 56 * fem, + child: Image.asset( + 'assets/page-1/images/peperomia-obtusfolia.png', + fit: BoxFit.cover, + ), + ), + Container( + // stylelineareqz (12:86) + margin: EdgeInsets.fromLTRB( + 0 * fem, 14 * fem, 0 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/page-1/images/stylelinear.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + ], + ), + ), + ), + Positioned( + // welcometoteahub924 (12:81) + left: 20 * fem, + top: 173 * fem, + child: Align( + child: SizedBox( + width: 180 * fem, + height: 23 * fem, + child: Text( + 'Welcome to TeaHub', + textAlign: TextAlign.center, + style: SafeGoogleFont( + 'Lexend', + fontSize: 18 * ffem, + fontWeight: FontWeight.w600, + height: 1.25 * ffem / fem, + color: Color(0xff394929), + ), + ), + ), + ), + ), + Positioned( + // settingzoN (12:82) + left: 343 * fem, + top: 88 * fem, + child: Align( + child: SizedBox( + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/page-1/images/setting.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + ), + ), + Positioned( + // hivihangaH1n (12:85) + left: 22 * fem, + top: 136 * fem, + child: Align( + child: SizedBox( + width: 107 * fem, + height: 23 * fem, + child: Text( + 'Hi Vihanga,', + textAlign: TextAlign.center, + style: SafeGoogleFont( + 'Lexend', + fontSize: 18 * ffem, + fontWeight: FontWeight.w600, + height: 1.25 * ffem / fem, + color: Color(0xff000000), + ), + ), + ), + ), + ), + // Navigation Buttons Section + Positioned( + // autogrouphs1eKjA (23q1HN6B7mP5fnUSxChs1E) + left: 25 * fem, + top: 248 * fem, + child: Container( + width: 327 * fem, + height: 94 * fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + //Scan page button + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ScanPage()), + ); + }, + child: Text('Scan'), + ), + SizedBox(width: 20 * fem), + Container( + // autogrouprgjnciG (23q1a2H5sYRcLMXhb2RgjN) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 20 * fem, 0 * fem), + padding: EdgeInsets.fromLTRB( + 17 * fem, 26 * fem, 16 * fem, 11 * fem), + width: 95 * fem, + height: double.infinity, + decoration: BoxDecoration( + color: Color(0xff4ecb81), + borderRadius: BorderRadius.circular(4 * fem), + boxShadow: [ + BoxShadow( + color: Color(0x3f4ecb81), + offset: Offset(4 * fem, 4 * fem), + blurRadius: 2 * fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // autogroupucn8Q8L (23q1h6uczYidmSsw4GucN8) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 1.5 * fem, 10.89 * fem), + width: 30.5 * fem, + height: 27.11 * fem, + child: Image.asset( + 'assets/page-1/images/auto-group-ucn8.png', + width: 30.5 * fem, + height: 27.11 * fem, + ), + ), + Text( + // identifyKec (12:95) + 'Identify', + textAlign: TextAlign.center, + style: SafeGoogleFont( + 'Lexend', + fontSize: 15 * ffem, + fontWeight: FontWeight.w600, + height: 1.25 * ffem / fem, + color: Color(0xffffffff), + ), + ), + ], + ), + ), + //Chatbot Button + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChatScreen()), + ); + }, + child: Text('Chatbot'), + ), + SizedBox(width: 20 * fem), // Adjust spacing as needed + Container( + // autogroupd8bnegt (23q1pWrwFPUPaC1UDhd8bN) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 22 * fem, 0 * fem), + padding: EdgeInsets.fromLTRB( + 25.5 * fem, 20 * fem, 26.5 * fem, 12 * fem), + width: 95 * fem, + height: double.infinity, + decoration: BoxDecoration( + color: Color(0xffffffff), + boxShadow: [ + BoxShadow( + color: Color(0x3f000000), + offset: Offset(4 * fem, 4 * fem), + blurRadius: 2 * fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // assistanthv4 (12:98) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 0 * fem, 9 * fem), + width: 34 * fem, + height: 34 * fem, + child: Image.asset( + 'assets/page-1/images/assistant.png', + width: 34 * fem, + height: 34 * fem, + ), + ), + Text( + // assistQJg (12:96) + 'Assist', + textAlign: TextAlign.center, + style: SafeGoogleFont( + 'Lexend', + fontSize: 15 * ffem, + fontWeight: FontWeight.w600, + height: 1.25 * ffem / fem, + color: Color(0xff4ecb81), + ), + ), + ], + ), + ), + //Educate button + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => TeaProfile()), + ); + }, + child: Text('Educate'), + ), + Container( + // autogroupk4v28Va (23q1wBLVx6h13Dda5EK4V2) + padding: EdgeInsets.fromLTRB( + 20 * fem, 23 * fem, 13 * fem, 13 * fem), + width: 95 * fem, + height: double.infinity, + decoration: BoxDecoration( + color: Color(0xffffffff), + boxShadow: [ + BoxShadow( + color: Color(0x3f000000), + offset: Offset(4 * fem, 4 * fem), + blurRadius: 2 * fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // bookalbumsvgrepocomBik (12:140) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 2 * fem, 5 * fem), + width: 34 * fem, + height: 34 * fem, + child: Image.asset( + 'assets/page-1/images/book-albumsvgrepocom.png', + width: 34 * fem, + height: 34 * fem, + ), + ), + Text( + // educatesba (12:97) + 'Educate', + textAlign: TextAlign.center, + style: SafeGoogleFont( + 'Lexend', + fontSize: 15 * ffem, + fontWeight: FontWeight.w600, + height: 1.25 * ffem / fem, + color: Color(0xff4ecb81), + ), + ), + ], + ), + ), + ], + ), + ), + ), + Positioned( + // autogroupqssuzw6 (23q2F5zKxkxmbysDZDQsSU) + left: 43 * fem, + top: 385 * fem, + child: Container( + width: 150.33 * fem, + height: 30 * fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // teaHvC (12:108) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 96.17 * fem, 0 * fem), + child: Text( + 'Tea', + textAlign: TextAlign.center, + style: SafeGoogleFont( + 'Lexend', + fontSize: 24 * ffem, + fontWeight: FontWeight.w700, + height: 1.25 * ffem / fem, + color: Color(0xffffffff), + ), + ), + ), + Container( + // vectoraPW (12:144) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 0 * fem, 7.5 * fem), + width: 10.17 * fem, + height: 10.17 * fem, + child: Image.asset( + 'assets/page-1/images/vector.png', + width: 10.17 * fem, + height: 10.17 * fem, + ), + ), + ], + ), + ), + ), + Positioned( + // SRi (12:117) + left: 218 * fem, + top: 609 * fem, + child: Align( + child: SizedBox( + width: 62 * fem, + height: 44 * fem, + child: Text( + '22°', + style: SafeGoogleFont( + 'Inter', + fontSize: 36 * ffem, + fontWeight: FontWeight.w700, + height: 1.2125 * ffem / fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + Positioned( + // f6mA (12:118) + left: 218 * fem, + top: 657 * fem, + child: Align( + child: SizedBox( + width: 45 * fem, + height: 20 * fem, + child: Text( + '71.6 F', + style: SafeGoogleFont( + 'Inter', + fontSize: 16 * ffem, + fontWeight: FontWeight.w700, + height: 1.2125 * ffem / fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + Positioned( + // colomboslbC8 (12:119) + left: 218 * fem, + top: 560 * fem, + child: Align( + child: SizedBox( + width: 99 * fem, + height: 20 * fem, + child: Text( + 'Colombo, SL', + style: SafeGoogleFont( + 'Inter', + fontSize: 16 * ffem, + fontWeight: FontWeight.w700, + height: 1.2125 * ffem / fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + Positioned( + // mondayfBz (12:120) + left: 218 * fem, + top: 583 * fem, + child: Align( + child: SizedBox( + width: 54 * fem, + height: 17 * fem, + child: Text( + 'Monday', + style: SafeGoogleFont( + 'Inter', + fontSize: 14 * ffem, + fontWeight: FontWeight.w500, + height: 1.2125 * ffem / fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + ], + ), + ), + )); + } +} diff --git a/.Connected_Version - TeaHub/lib/home_page/navigation.dart b/.Connected_Version - TeaHub/lib/home_page/navigation.dart new file mode 100644 index 0000000..7c11662 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/home_page/navigation.dart @@ -0,0 +1,113 @@ +import 'package:TeaHub/chatbot_ui/presentation/chatbot_screen/chatbot_screen.dart'; +import 'package:TeaHub/chatbot_ui_updated/ChatScreen.dart'; +import 'package:animated_bottom_navigation_bar/animated_bottom_navigation_bar.dart'; +import 'package:TeaHub/TeaDescriptionPage/main.dart'; + +import 'package:TeaHub/home_page/constants.dart'; +import 'package:TeaHub/home_page/scanPage.dart'; +import 'package:TeaHub/pages/home_page.dart'; +import 'package:TeaHub/user_profile/user_profile.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:page_transition/page_transition.dart'; + +class navigationPage extends StatefulWidget { + const navigationPage({Key? key}) : super(key: key); + + @override + State createState() => _TeaProfilePageState(); +} + +class _TeaProfilePageState extends State { + int _bottomNavIndex = 0; + + //List of the pages + List pages = [ + HomePage(), + const ChatScreen(), + TeaProfile(), + const UserProfile(), + ]; + + List iconList = [ + FontAwesomeIcons.home, // Font Awesome home icon + FontAwesomeIcons.comment, // Chatbot icon + FontAwesomeIcons.seedling, // Plant icon + FontAwesomeIcons.user, // Font Awesome user icon + ]; + + //List of the pages titles + List titleList = [ + 'Home', + 'Chatbot', + 'Tea profile', + 'Profile', + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + // appBar: AppBar( + // title: Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Text( + // titleList[_bottomNavIndex], + // style: TextStyle( + // color: Theme.of(context).colorScheme.secondary, + // fontWeight: FontWeight.w500, + // fontSize: 24, + // ), + // ), + // FaIcon( + // FontAwesomeIcons.bell, + // color: Theme.of(context).colorScheme.secondary, + // size: 30.0, + // ) + // ], + // ), + // backgroundColor: Theme.of(context).scaffoldBackgroundColor, + // elevation: 0.0, + // ), + body: IndexedStack( + index: _bottomNavIndex, + children: pages, + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + Navigator.push( + context, + PageTransition( + child: const ScanPage(), + type: PageTransitionType.bottomToTop, + ), + ); + }, + backgroundColor: Constants.primaryColor, + shape: RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(30.0), // Adjust the radius as needed + ), + child: Image.asset( + 'assets/images/qr-code-scan.png', + height: 30.0, + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + bottomNavigationBar: AnimatedBottomNavigationBar( + backgroundColor: Colors.black, + splashColor: Constants.primaryColor, + activeColor: Constants.primaryColor, + inactiveColor: Colors.grey, + icons: iconList, + activeIndex: _bottomNavIndex, + gapLocation: GapLocation.center, + notchSmoothness: NotchSmoothness.softEdge, + onTap: (index) { + setState(() { + _bottomNavIndex = index; + }); + }), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/home_page/scanPage.dart b/.Connected_Version - TeaHub/lib/home_page/scanPage.dart new file mode 100644 index 0000000..bc2e782 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/home_page/scanPage.dart @@ -0,0 +1,638 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:animated_bottom_navigation_bar/animated_bottom_navigation_bar.dart'; +import 'package:TeaHub/home_page/constants.dart'; +import 'package:TeaHub/snap_tips/SnapTips.dart'; +import 'package:TeaHub/introduction_page/scanui_splash.dart'; +import 'package:TeaHub/disease_description_treatment/welcome_screen.dart'; + +class ScanPage extends StatefulWidget { + const ScanPage({Key? key}) : super(key: key); + + @override + _ScanPageState createState() => _ScanPageState(); +} + +class _ScanPageState extends State { + int _bottomNavIndex = 0; + File? imageFile; + + @override + void initState() { + super.initState(); + WidgetsBinding.instance!.addPostFrameCallback((_) { + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => ScanUI(), + ), + ); + }); + } + + @override + Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; + + return Scaffold( + body: Stack( + children: [ + Positioned( + top: 50, + left: 20, + right: 20, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: SizedBox( + height: 40, + width: 40, + child: FaIcon( + FontAwesomeIcons.times, + color: Constants.primaryColor, + ), + ), + ), + GestureDetector( + onTap: () { + debugPrint('favorite'); + }, + child: SizedBox( + height: 40, + width: 40, + child: IconButton( + onPressed: () {}, + icon: FaIcon( + FontAwesomeIcons.syncAlt, + color: Constants.primaryColor, + ), + ), + ), + ), + ], + ), + ), + Positioned( + top: 100, + right: 20, + left: 20, + child: Container( + width: size.width * .8, + height: size.height * .8, + padding: const EdgeInsets.all(20), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + imageFile == null + ? Image.asset( + 'assets/images/qr-code-scan.png', + height: 500.0, + ) + : ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.file( + imageFile!, + height: 500.0, + fit: BoxFit.fill, + ), + ), + const SizedBox( + height: 20, + ), + Text( + '', + style: TextStyle( + color: Constants.primaryColor.withOpacity(.80), + fontWeight: FontWeight.w500, + fontSize: 20, + ), + ), + ], + ), + ), + ), + ), + ], + ), + floatingActionButton: ClipRRect( + borderRadius: BorderRadius.circular(30.0), + child: FloatingActionButton( + onPressed: () { + _showImagePicker(context); + }, + backgroundColor: Constants.primaryColor, + child: const FaIcon( + FontAwesomeIcons.camera, + color: Colors.white, + ), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + bottomNavigationBar: AnimatedBottomNavigationBar( + backgroundColor: Colors.black, + splashColor: Constants.primaryColor, + activeColor: Constants.primaryColor, + inactiveColor: Colors.white, + icons: const [ + FontAwesomeIcons.image, + FontAwesomeIcons.question, + ], + activeIndex: _bottomNavIndex, + gapLocation: GapLocation.center, + notchSmoothness: NotchSmoothness.softEdge, + onTap: (index) { + setState(() { + _bottomNavIndex = index; + if (index == 1) { + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => SnapTips(), + )); + } + }); + }, + ), + ); + } + + void _showImagePicker(BuildContext context) { + showModalBottomSheet( + context: context, + builder: (builder) { + return Card( + child: Container( + color: Theme.of(context).colorScheme.tertiary, + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height / 5.2, + margin: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.all(12), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: InkWell( + child: Column( + children: [ + FaIcon( + FontAwesomeIcons.images, + size: 60.0, + ), + SizedBox(height: 12.0), + Text( + "Gallery", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ) + ], + ), + onTap: () { + _imgFromGallery(); + Navigator.pop(context); + }, + ), + ), + Expanded( + child: InkWell( + child: SizedBox( + child: Column( + children: [ + FaIcon(FontAwesomeIcons.camera, size: 60.0), + SizedBox(height: 12.0), + Text( + "Camera", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ) + ], + ), + ), + onTap: () { + _imgFromCamera(); + Navigator.pop(context); + }, + ), + ) + ], + ), + ), + ); + }, + ); + } + + final picker = ImagePicker(); + + _imgFromGallery() async { + await picker + .pickImage(source: ImageSource.gallery, imageQuality: 50) + .then((value) { + if (value != null) { + _cropImage(File(value.path)); + } + }); + } + + _imgFromCamera() async { + await picker + .pickImage(source: ImageSource.camera, imageQuality: 50) + .then((value) { + if (value != null) { + _cropImage(File(value.path)); + } + }); + } + + _cropImage(File imgFile) async { + final croppedFile = await ImageCropper().cropImage( + sourcePath: imgFile.path, + aspectRatioPresets: Platform.isAndroid + ? [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.ratio3x2, + CropAspectRatioPreset.original, + CropAspectRatioPreset.ratio4x3, + CropAspectRatioPreset.ratio16x9 + ] + : [ + CropAspectRatioPreset.original, + CropAspectRatioPreset.square, + CropAspectRatioPreset.ratio3x2, + CropAspectRatioPreset.ratio4x3, + CropAspectRatioPreset.ratio5x3, + CropAspectRatioPreset.ratio5x4, + CropAspectRatioPreset.ratio7x5, + ], + uiSettings: [ + AndroidUiSettings( + toolbarTitle: "Image Cropper", + toolbarColor: Color.fromARGB(255, 78, 203, 128), + //toolbarColor: Colors.deepOrange, + toolbarWidgetColor: Colors.white, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + title: "Image Cropper", + ) + ], + ); + if (croppedFile != null) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => WelcomeScreen()), + ); + ; + // imageCache.clear(); + // setState(() { + // imageFile = File(croppedFile.path); + // }); + } + } +} + + + + + +// import 'dart:io'; +// import 'dart:js'; + +// import 'package:TeaHub/disease_description_treatment/home_screen.dart'; +// import 'package:TeaHub/disease_description_treatment/welcome_screen.dart'; +// import 'package:TeaHub/introduction_page/scanui_splash.dart'; +// import 'package:animated_bottom_navigation_bar/animated_bottom_navigation_bar.dart'; +// import 'package:TeaHub/home_page/constants.dart'; +// import 'package:TeaHub/snap_tips/SnapTips.dart'; +// import 'package:flutter/material.dart'; +// import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +// import 'package:image_cropper/image_cropper.dart'; +// import 'package:image_picker/image_picker.dart'; + +// class ScanPage extends StatefulWidget { +// const ScanPage({Key? key}) : super(key: key); + + + +// @override +// State createState() => _ScanPageState(); +// } + +// @override +// void initState() { + +// // Navigating to the ScanUI page automatically when this page is opened +// // Navigating to the Chat ui page automatically when this page is opened +// WidgetsBinding.instance.addPostFrameCallback((_) { +// Navigator.of(context).push( +// MaterialPageRoute( +// builder: (context) => ScanUI(), +// ), +// ); +// }); +// } + +// class _ScanPageState extends State { +// int _bottomNavIndex = 0; +// File? imageFile; + +// @override +// Widget build(BuildContext context) { +// Size size = MediaQuery.of(context).size; + +// return Scaffold( +// body: Stack( +// children: [ +// Positioned( +// top: 50, +// left: 20, +// right: 20, +// child: Row( +// mainAxisAlignment: MainAxisAlignment.spaceBetween, +// children: [ +// GestureDetector( +// onTap: () { +// Navigator.pop(context); +// }, +// child: SizedBox( +// height: 40, +// width: 40, +// child: FaIcon( +// FontAwesomeIcons.times, +// color: Constants.primaryColor, +// ), +// ), +// ), +// GestureDetector( +// onTap: () { +// debugPrint('favorite'); +// }, +// child: SizedBox( +// height: 40, +// width: 40, +// child: IconButton( +// onPressed: () {}, +// icon: FaIcon( +// FontAwesomeIcons.syncAlt, +// color: Constants.primaryColor, +// ), +// ), +// ), +// ), +// ], +// ), +// ), +// Positioned( +// top: 100, +// right: 20, +// left: 20, +// child: Container( +// width: size.width * .8, +// height: size.height * .8, +// padding: const EdgeInsets.all(20), +// child: Center( +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// imageFile == null +// ? Image.asset( +// 'assets/images/qr-code-scan.png', +// height: 500.0, +// ) +// : ClipRRect( +// borderRadius: BorderRadius.circular(8.0), +// child: Image.file( +// imageFile!, +// height: 500.0, +// fit: BoxFit.fill, +// ), +// ), +// const SizedBox( +// height: 20, +// ), +// Text( +// '', +// style: TextStyle( +// color: Constants.primaryColor.withOpacity(.80), +// fontWeight: FontWeight.w500, +// fontSize: 20, +// ), +// ), +// ], +// ), +// ), +// ), +// ), +// ], +// ), +// //----- Code - 1 ------// + +// // floatingActionButton: FloatingActionButton( +// // onPressed: () { +// // _showImagePicker(context); +// // }, +// // backgroundColor: Constants.primaryColor, +// // child: const FaIcon( +// // FontAwesomeIcons.camera, +// // color: Colors.white, +// // ), +// // ), +// floatingActionButton: ClipRRect( +// borderRadius: +// BorderRadius.circular(30.0), // Adjust the value to your preference +// child: FloatingActionButton( +// onPressed: () { +// _showImagePicker(context); +// }, +// backgroundColor: Constants.primaryColor, +// child: const FaIcon( +// FontAwesomeIcons.camera, +// color: Colors.white, +// ), +// ), +// ), +// floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, +// bottomNavigationBar: AnimatedBottomNavigationBar( +// backgroundColor: Colors.black, +// splashColor: Constants.primaryColor, +// activeColor: Constants.primaryColor, +// inactiveColor: Colors.white, +// icons: const [ +// FontAwesomeIcons.image, +// FontAwesomeIcons.question, +// ], +// activeIndex: _bottomNavIndex, +// gapLocation: GapLocation.center, +// notchSmoothness: NotchSmoothness.softEdge, +// onTap: (index) { +// setState(() { +// _bottomNavIndex = index; +// if (index == 1) { +// // Navigate to the page you want +// Navigator.of(context).push(MaterialPageRoute( +// builder: (context) => SnapTips(), +// )); +// } +// }); +// // { +// // _bottomNavIndex = index; +// // }); +// }, +// ), +// ); +// } + +// void _showImagePicker(BuildContext context) { +// showModalBottomSheet( +// context: context, +// builder: (builder) { +// return Card( +// child: Container( +// color: Theme.of(context).colorScheme.tertiary, +// width: MediaQuery.of(context).size.width, +// height: MediaQuery.of(context).size.height / 5.2, +// margin: const EdgeInsets.only(top: 8.0), +// padding: const EdgeInsets.all(12), +// child: Row( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// Expanded( +// child: InkWell( +// child: Column( +// children: [ +// FaIcon( +// FontAwesomeIcons.images, +// size: 60.0, +// ), +// SizedBox(height: 12.0), +// Text( +// "Gallery", +// textAlign: TextAlign.center, +// style: TextStyle( +// fontSize: 16, +// color: Theme.of(context).colorScheme.primary, +// ), +// ) +// ], +// ), +// onTap: () { +// _imgFromGallery(); +// Navigator.pop(context); +// }, +// ), +// ), +// Expanded( +// child: InkWell( +// child: SizedBox( +// child: Column( +// children: [ +// FaIcon(FontAwesomeIcons.camera, size: 60.0), +// SizedBox(height: 12.0), +// Text( +// "Camera", +// textAlign: TextAlign.center, +// style: TextStyle( +// fontSize: 16, +// color: Theme.of(context).colorScheme.primary, +// ), +// ) +// ], +// ), +// ), +// onTap: () { +// _imgFromCamera(); +// Navigator.pop(context); +// }, +// ), +// ) +// ], +// ), +// ), +// ); +// }, +// ); +// } + +// final picker = ImagePicker(); + +// _imgFromGallery() async { +// await picker +// .pickImage(source: ImageSource.gallery, imageQuality: 50) +// .then((value) { +// if (value != null) { +// _cropImage(File(value.path)); +// } +// }); +// } + +// _imgFromCamera() async { +// await picker +// .pickImage(source: ImageSource.camera, imageQuality: 50) +// .then((value) { +// if (value != null) { +// _cropImage(File(value.path)); +// } +// }); +// } + +// _cropImage(File imgFile) async { +// final croppedFile = await ImageCropper().cropImage( +// sourcePath: imgFile.path, +// aspectRatioPresets: Platform.isAndroid +// ? [ +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio16x9 +// ] +// : [ +// CropAspectRatioPreset.original, +// CropAspectRatioPreset.square, +// CropAspectRatioPreset.ratio3x2, +// CropAspectRatioPreset.ratio4x3, +// CropAspectRatioPreset.ratio5x3, +// CropAspectRatioPreset.ratio5x4, +// CropAspectRatioPreset.ratio7x5, +// CropAspectRatioPreset.ratio16x9 +// ], +// uiSettings: [ +// AndroidUiSettings( +// toolbarTitle: "Image Cropper", +// toolbarColor: Color.fromARGB(255, 78, 203, 128), +// //toolbarColor: Colors.deepOrange, +// toolbarWidgetColor: Colors.white, +// initAspectRatio: CropAspectRatioPreset.original, +// lockAspectRatio: false, +// ), +// IOSUiSettings( +// title: "Image Cropper", +// ) +// ], +// ); +// if (croppedFile != null) { +// Navigator.push( +// context, +// MaterialPageRoute(builder: (context) => WelcomeScreen()), +// ); +// ; +// // imageCache.clear(); +// // setState(() { +// // imageFile = File(croppedFile.path); +// // }); +// } +// } +// } diff --git a/.Connected_Version - TeaHub/lib/home_page/utils.dart b/.Connected_Version - TeaHub/lib/home_page/utils.dart new file mode 100644 index 0000000..3fd58fc --- /dev/null +++ b/.Connected_Version - TeaHub/lib/home_page/utils.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'dart:ui'; +import 'package:google_fonts/google_fonts.dart'; + +class MyCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} + +TextStyle SafeGoogleFont( + String fontFamily, { + TextStyle? textStyle, + Color? color, + Color? backgroundColor, + double? fontSize, + FontWeight? fontWeight, + FontStyle? fontStyle, + double? letterSpacing, + double? wordSpacing, + TextBaseline? textBaseline, + double? height, + Locale? locale, + Paint? foreground, + Paint? background, + List? shadows, + List? fontFeatures, + TextDecoration? decoration, + Color? decorationColor, + TextDecorationStyle? decorationStyle, + double? decorationThickness, +}) { + try { + return GoogleFonts.getFont( + fontFamily, + textStyle: textStyle, + color: color, + backgroundColor: backgroundColor, + fontSize: fontSize, + fontWeight: fontWeight, + fontStyle: fontStyle, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + textBaseline: textBaseline, + height: height, + locale: locale, + foreground: foreground, + background: background, + shadows: shadows, + fontFeatures: fontFeatures, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + ); + } catch (ex) { + return GoogleFonts.getFont( + "Source Sans Pro", + textStyle: textStyle, + color: color, + backgroundColor: backgroundColor, + fontSize: fontSize, + fontWeight: fontWeight, + fontStyle: fontStyle, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + textBaseline: textBaseline, + height: height, + locale: locale, + foreground: foreground, + background: background, + shadows: shadows, + fontFeatures: fontFeatures, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/images/Apple_icon.png b/.Connected_Version - TeaHub/lib/images/Apple_icon.png new file mode 100644 index 0000000..833fcc9 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/Apple_icon.png differ diff --git a/.Connected_Version - TeaHub/lib/images/Facebook_icon.png b/.Connected_Version - TeaHub/lib/images/Facebook_icon.png new file mode 100644 index 0000000..6cdc3b5 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/Facebook_icon.png differ diff --git a/.Connected_Version - TeaHub/lib/images/Google_icon.png b/.Connected_Version - TeaHub/lib/images/Google_icon.png new file mode 100644 index 0000000..6056cd9 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/Google_icon.png differ diff --git a/.Connected_Version - TeaHub/lib/images/TeaHub_Logo.png b/.Connected_Version - TeaHub/lib/images/TeaHub_Logo.png new file mode 100644 index 0000000..e50939a Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/TeaHub_Logo.png differ diff --git a/.Connected_Version - TeaHub/lib/images/TeaHub_app_icon.png b/.Connected_Version - TeaHub/lib/images/TeaHub_app_icon.png new file mode 100644 index 0000000..f7604b4 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/TeaHub_app_icon.png differ diff --git a/.Connected_Version - TeaHub/lib/images/email_icon.png b/.Connected_Version - TeaHub/lib/images/email_icon.png new file mode 100644 index 0000000..1793c60 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/email_icon.png differ diff --git a/.Connected_Version - TeaHub/lib/images/screen_1.png b/.Connected_Version - TeaHub/lib/images/screen_1.png new file mode 100644 index 0000000..3d51ca4 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/screen_1.png differ diff --git a/.Connected_Version - TeaHub/lib/images/screen_2.png b/.Connected_Version - TeaHub/lib/images/screen_2.png new file mode 100644 index 0000000..d4a6798 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/screen_2.png differ diff --git a/.Connected_Version - TeaHub/lib/images/screen_3.png b/.Connected_Version - TeaHub/lib/images/screen_3.png new file mode 100644 index 0000000..a26ab6d Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/screen_3.png differ diff --git a/.Connected_Version - TeaHub/lib/images/screen_4.png b/.Connected_Version - TeaHub/lib/images/screen_4.png new file mode 100644 index 0000000..738b917 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/screen_4.png differ diff --git a/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 1.jpg b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 1.jpg new file mode 100644 index 0000000..6a46ca4 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 1.jpg differ diff --git a/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 2.jpg b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 2.jpg new file mode 100644 index 0000000..de7f4d0 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 2.jpg differ diff --git a/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 3.jpg b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 3.jpg new file mode 100644 index 0000000..2133f18 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 3.jpg differ diff --git a/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 4.jpg b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 4.jpg new file mode 100644 index 0000000..848b70d Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/snap_tips imgs/image 4.jpg differ diff --git a/.Connected_Version - TeaHub/lib/images/treatment_imgs/med 1.png b/.Connected_Version - TeaHub/lib/images/treatment_imgs/med 1.png new file mode 100644 index 0000000..8028818 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/treatment_imgs/med 1.png differ diff --git a/.Connected_Version - TeaHub/lib/images/treatment_imgs/your_image.jpg b/.Connected_Version - TeaHub/lib/images/treatment_imgs/your_image.jpg new file mode 100644 index 0000000..c3897a7 Binary files /dev/null and b/.Connected_Version - TeaHub/lib/images/treatment_imgs/your_image.jpg differ diff --git a/.Connected_Version - TeaHub/lib/introduction_page/chatbotui_splash.dart b/.Connected_Version - TeaHub/lib/introduction_page/chatbotui_splash.dart new file mode 100644 index 0000000..0c0bf7c --- /dev/null +++ b/.Connected_Version - TeaHub/lib/introduction_page/chatbotui_splash.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; + +// void main() { +// runApp(MyApp()); +// } + +// class MyApp extends StatelessWidget { +// @override +// Widget build(BuildContext context) { +// return MaterialApp( +// home: ChatbotUI(), +// ); +// } +// } + +class ChatbotUI extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Padding( + padding: EdgeInsets.only( + top: 20.0), // Top padding for 'Join The Community' + child: Column( + children: [ + // 'Join The Community' text with proper alignment and padding + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'TeaHub', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + Text( + 'Application', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: + EdgeInsets.only(bottom: 16.0), // Shift the image up + child: Image.asset( + 'assets/introsplash/chatbot.png', + width: 200, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + 'TeaBot\nCultivation Success Easily', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + // Container for bottom text and button with even padding + Container( + padding: EdgeInsets.fromLTRB(30.0, 8.0, 30.0, + 100.0), // Even horizontal padding and spacing at the bottom + child: IntrinsicHeight( + child: Row( + children: [ + Expanded( + child: Text( + "Discover the secrets of tea growing with our Chatbot - your personal guide to a perfect harvest.", + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[500], + ), + ), + ), + Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Container( + width: 80, + height: 80, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.1), + offset: Offset(0, 18), + blurRadius: 23, + ), + ], + color: Color.fromRGBO(181, 234, 125, 1), + ), + child: Text( + 'Chat', + style: TextStyle( + fontSize: 20.0, + color: Colors + .white, // Set the text color to white to ensure visibility + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ) + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/introduction_page/scanui_splash.dart b/.Connected_Version - TeaHub/lib/introduction_page/scanui_splash.dart new file mode 100644 index 0000000..cd24c24 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/introduction_page/scanui_splash.dart @@ -0,0 +1,137 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: ScanUI(), + ); + } +} + +class ScanUI extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Padding( + padding: EdgeInsets.only( + top: 20.0), // Top padding for 'Join The Community' + child: Column( + children: [ + // 'Join The Community' text with proper alignment and padding + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'TeaHub', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + Text( + 'Application', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: + EdgeInsets.only(bottom: 16.0), // Shift the image up + child: Image.asset( + 'assets/introsplash/tree.png', + width: 200, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + 'Try the TeaHub\nMagic now!', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + // Container for bottom text and button with even padding + Container( + padding: EdgeInsets.fromLTRB(30.0, 8.0, 30.0, + 100.0), // Even horizontal padding and spacing at the bottom + child: IntrinsicHeight( + child: Row( + children: [ + Expanded( + child: Text( + 'Turn your Android phone into\n a mobile crop doctor for tea plants.\n Chlorotic diagnosis at your fingertip.', + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[500], + ), + ), + ), + Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + Navigator.pop(context); + }, + child: Container( + width: 80, + height: 80, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.1), + offset: Offset(0, 18), + blurRadius: 23, + ), + ], + color: Color.fromRGBO(181, 234, 125, 1), + ), + child: Text( + 'Start', + style: TextStyle( + fontSize: 20.0, + color: Colors + .white, // Set the text color to white to ensure visibility + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ) + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/main.dart b/.Connected_Version - TeaHub/lib/main.dart new file mode 100644 index 0000000..3983da2 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/main.dart @@ -0,0 +1,40 @@ +import 'package:TeaHub/disease_description_treatment/home_screen.dart'; +import 'package:TeaHub/disease_description_treatment/welcome_screen.dart'; +import 'package:TeaHub/pages/authentication_page.dart'; +import 'package:TeaHub/theme/theme.dart'; +import 'package:TeaHub/theme/theme_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_core/firebase_core.dart'; +import 'package:provider/provider.dart'; +import 'firebase_options.dart'; + +void main() async { + WidgetsFlutterBinding.ensureInitialized(); + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform, + ); + runApp( + ChangeNotifierProvider( + create: (_) => ThemeProvider()..initializer(), + child: MyApp(), + ), + ); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return Consumer(builder: (context, provider, child) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: const AuthPage(), + theme: lightMode, + darkTheme: darkMode, + themeMode: provider.themeMode, + ); + }); + } +} diff --git a/.Connected_Version - TeaHub/lib/openingsplashscreen/main.dart b/.Connected_Version - TeaHub/lib/openingsplashscreen/main.dart new file mode 100644 index 0000000..ab6eb9e --- /dev/null +++ b/.Connected_Version - TeaHub/lib/openingsplashscreen/main.dart @@ -0,0 +1,18 @@ +import 'package:TeaHub/openingsplashscreen/splashscreen.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp( + debugShowCheckedModeBanner: false, + home: SplashScreen(), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/openingsplashscreen/splashscreen.dart b/.Connected_Version - TeaHub/lib/openingsplashscreen/splashscreen.dart new file mode 100644 index 0000000..a53cccd --- /dev/null +++ b/.Connected_Version - TeaHub/lib/openingsplashscreen/splashscreen.dart @@ -0,0 +1,102 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + super.initState(); + Timer(const Duration(seconds: 5), () { + Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => const MyHomePage())); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(top: 100), // Increased top margin + child: Lottie.asset("assets/Animation.json"), + ), + const SizedBox(height: 20), // Adjust the space as needed + ShaderMask( + shaderCallback: (Rect bounds) { + return LinearGradient( + colors: [Colors.black, Color(0xFF4ecb81)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ).createShader(bounds); + }, + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + children: [ + for (var letter in "TeaHub".split('')) + WidgetSpan( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), // Increase spacing between letters + child: Text( + letter, + style: TextStyle( + fontSize: 60, // Increased font size + fontWeight: FontWeight.bold, + color: Colors.white, + shadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + offset: Offset(4, 4), + blurRadius: 5, + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + const SizedBox(height: 20), // Add some space before the loader + SizedBox( + // Specify the size for the loader animation + width: 200, // Adjust the width as needed + height: 200, // Adjust the height as needed + child: Lottie.asset("assets/loader.json"), + ), + ], + ), + ); + } +} + +class MyHomePage extends StatelessWidget { + const MyHomePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + backgroundColor: Colors.blue, + title: const Text("Home Page"), + ), + body: const Center( + child: Text( + "Welcome", + style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/LoginOrSignin_page.dart b/.Connected_Version - TeaHub/lib/pages/LoginOrSignin_page.dart new file mode 100644 index 0000000..83f6d70 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/LoginOrSignin_page.dart @@ -0,0 +1,37 @@ +import 'package:TeaHub/pages/login_page.dart'; +import 'package:TeaHub/pages/signin_page.dart'; +import 'package:flutter/material.dart'; +//import 'package:teahub/pages/login_page.dart'; +//import 'package:teahub/pages/signin_page.dart'; + +class LoginOrRegisterPage extends StatefulWidget { + const LoginOrRegisterPage({super.key}); + + @override + State createState() => _LoginOrRegisterPageState(); +} + +class _LoginOrRegisterPageState extends State { + // initially show login page + bool showLoginPage = true; + + // toggle between login and register page + void togglePages() { + setState(() { + showLoginPage = !showLoginPage; + }); + } + + @override + Widget build(BuildContext context) { + if (showLoginPage) { + return RegisterPage( + onTap: togglePages, + ); + } else { + return LoginPage( + onTap: togglePages, + ); + } + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/authentication_page.dart b/.Connected_Version - TeaHub/lib/pages/authentication_page.dart new file mode 100644 index 0000000..b675b6e --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/authentication_page.dart @@ -0,0 +1,40 @@ +import 'package:TeaHub/pages/LoginOrSignin_page.dart'; +import 'package:TeaHub/pages/splash_screens.dart'; +import 'package:TeaHub/pages/two_step_verification/verification_page.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; + +class AuthPage extends StatelessWidget { + const AuthPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: StreamBuilder( + stream: FirebaseAuth.instance.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.hasData) { + if (Navigator.of(context).canPop()) { + Navigator.pop(context); + } + + if (Navigator.of(context).canPop()) { + Navigator.pop(context); + } + + // Return to the home page + //return HomePage(); + + return VerificationPage(); + } else { + // Display splash screens + return splashScreens(); + + // Display login or sign in page + //return LoginOrRegisterPage(); + } + }, + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/home_page.dart b/.Connected_Version - TeaHub/lib/pages/home_page.dart new file mode 100644 index 0000000..200de99 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/home_page.dart @@ -0,0 +1,471 @@ +import 'package:TeaHub/TeaDescriptionPage/main.dart'; +import 'package:TeaHub/chatbot_ui_updated/ChatScreen.dart'; +import 'package:TeaHub/home_page/scanPage.dart'; +import 'package:TeaHub/theme/theme_button.dart'; +import 'package:TeaHub/weather_widget/weather_page.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; + +class TopEllipsePainter extends CustomPainter { + final Color color; + + TopEllipsePainter(this.color); + + @override + void paint(Canvas canvas, Size size) { + var paint = Paint() + ..color = color + ..style = PaintingStyle.fill; + + // Draw the ellipse + var path = Path() + ..addOval(Rect.fromLTWH(-50, -100, size.width + 100, 311)); + canvas.drawPath(path, paint); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) => false; +} + + +class HomePage extends StatelessWidget { + HomePage({super.key}); + + final user = FirebaseAuth.instance.currentUser!; + + //sign user out method + void signUserOut() { + FirebaseAuth.instance.signOut(); + GoogleSignIn().signOut(); + } + + // //Document IDs + // List docIDs = []; + + // //Get docIDs + // Future getDocId() async { + // await FirebaseFirestore.instance + // .collection('Users') + // .get() + // .then((snapshot) => null); + // } + + Widget _buildIconTextButton(BuildContext context, IconData icon, String label, Color backgroundColor, Color iconAndTextColor,VoidCallback onPressed) { + return ElevatedButton( + onPressed: onPressed, + style: ElevatedButton.styleFrom( + foregroundColor: iconAndTextColor, backgroundColor: backgroundColor, // Foreground (text/icon) color + elevation: 15, + shadowColor: Colors.black, + fixedSize: Size(100, 100), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 0.5, + ), + ), + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon(icon, size: 40), + SizedBox(height: 8), // Spacing between icon and text + Text( + label, + style: TextStyle( + fontSize: 14, + ), + ), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + //------------------------ Drawer UI ------------------------// + drawerEnableOpenDragGesture: false, // Prevent user sliding open + + appBar: AppBar( + backgroundColor: Color(0xFF4ecb81), + automaticallyImplyLeading: false, + title: Row( + children: [ + Expanded( + child: Text( + 'Home', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + fontSize: 30, + ), + ), + ), + ], + ), + actions: [ + Builder( + builder: (context) => // Ensure Scaffold is in context + IconButton( + icon: Icon( + Icons.settings, + color: Theme.of(context).colorScheme.primary, + size: 30, + ), + onPressed: () => Scaffold.of(context).openDrawer(), + ), + ), + Builder( + builder: (context) => // Ensure Scaffold is in context + IconButton( + icon: Icon( + Icons.notifications, + color: Theme.of(context).colorScheme.primary, + size: 30, + ), + onPressed: () => Scaffold.of(context).openDrawer(), + ), + ), + ], + ), + + drawer: Drawer( + backgroundColor: Theme.of(context).colorScheme.background, + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment + .start, // Align children to the start (left) + children: [ + SizedBox(width: 10), // Left margin + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Vertical spacing between text and icon + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black, + width: 1.5, + ), + ), + child: SizedBox( + width: 60, + height: 60, + child: Image.asset( + 'assets/images/user_profile/rectangle-6.png', + fit: BoxFit.cover, + ), + ), + ), + SizedBox(width: 158), + GestureDetector( + onTap: () { + // Close the drawer + Navigator.pop(context); + }, + child: Container( + margin: + EdgeInsets.all(0), // Set all margins to 0 + padding: EdgeInsets.only( + top: 0), // Set top padding to 0 + child: Icon( + Icons.arrow_left, + color: Colors.black, + size: 50, + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only( + top: 5), // Add bottom padding of 20 pixels + child: Text( + 'User Name', + style: TextStyle( + color: Colors.black, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + ), + + Padding( + padding: const EdgeInsets.only( + top: 5), // Add bottom padding of 20 pixels + child: Text( + '${user.email!}', + style: TextStyle( + fontSize: 16, + //color: Colors.black, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(10.0), + padding: EdgeInsets.all(8.0), // Add padding here + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + border: Border.all( + color: + Theme.of(context).colorScheme.primary, // Set border color + width: 0.5, // Set border width + ), + color: Theme.of(context).colorScheme.tertiary, + ), + child: Row( + children: [ + SizedBox(width: 20), + Icon( + Icons.color_lens_rounded, + color: Theme.of(context).colorScheme.primary, + ), + Padding( + padding: EdgeInsets.only(left: 15.0), + child: Text( + "Theme", + style: TextStyle( + color: Theme.of(context) + .colorScheme + .primary, // Set text color + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox(width: 15), + const Padding( + padding: EdgeInsets.only(left: 10.0), + child: ThemeSelector(), + ), + ], + ), + ), + GestureDetector( + onTap: () { + signUserOut(); + }, + child: Container( + margin: EdgeInsets.all(10.0), + padding: EdgeInsets.all(8.0), // Add padding here + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + border: Border.all( + color: Theme.of(context) + .colorScheme + .primary, // Set border color + width: 0.5, // Set border width + ), + color: Theme.of(context).colorScheme.tertiary, + ), + child: SizedBox( + width: 120, + height: 36, + child: Padding( + padding: EdgeInsets.only(left: 20.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, // Align items to the left + children: [ + Icon( + Icons.logout, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox(width: 15), + Text( + 'Sign Out', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ), + ), + GestureDetector( + onTap: () { + // Close the app + SystemNavigator.pop(); + }, + child: Container( + margin: EdgeInsets.all(10.0), + padding: EdgeInsets.all(8.0), // Add padding here + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + border: Border.all( + color: Theme.of(context) + .colorScheme + .primary, // Set border color + width: 0.5, // Set border width + ), + color: Theme.of(context).colorScheme.tertiary, + ), + child: SizedBox( + width: 120, + height: 36, + child: Padding( + padding: EdgeInsets.only(left: 20.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, // Align items to the left + children: [ + Icon( + Icons.exit_to_app, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox(width: 15), + Text( + 'Exit', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ), + ) + ], + ), + ), + + //------------------------ Main page UI ------------------------// + + backgroundColor: Theme.of(context).colorScheme.background, + body: SingleChildScrollView( + child: Column( + children: [ + Stack( + children: [ + CustomPaint( + size: Size(MediaQuery.of(context).size.width, 250), + painter: TopEllipsePainter(Color(0xFF4ecb81)), + ), + Padding( + padding: EdgeInsets.only( + top: MediaQuery.of(context).padding.top + 20, + left: 20, + right: 20, + ), + child: Column( + children: [ + Align( + alignment: Alignment.centerLeft, + child: Text( + 'Hi Vihanga,', + style: TextStyle( + color: Colors.white, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox(height: 5), + Align( + alignment: Alignment.centerLeft, + child: Text( + 'Welcome to TeaHub', + style: TextStyle( + color: Colors.white, + fontSize: 24, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ), + ], + ), + + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + + _buildIconTextButton( + context, + Icons.camera_alt, + 'Identify', + Color(0xFF4ecb81), // Background color for "Identify" + Colors.white, // Icon and text color for "Identify" + () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ScanPage()), + ); + }, + ), + // The "Assist" button has the new colors + _buildIconTextButton( + context, + Icons.message, + 'Assist', + Color(0xFFDDB892), // Creamy brown background color + Color(0xFF000000), // Icon and text color + () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ChatScreen()), + ); + }, + ), + // The "Educate" button also has the new colors + _buildIconTextButton( + context, + Icons.school, + 'Educate', + Color(0xFFDDB892), // Creamy brown background color + Color(0xFF000000), // Icon and text color + () { + // Navigator.push logic for 'Educate' button + }, + ), + ], + ), + + + SizedBox(height: 40), + priceWidget(), + SizedBox(height: 40), + WeatherPage(), + ], + ), + ), + + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/login_page.dart b/.Connected_Version - TeaHub/lib/pages/login_page.dart new file mode 100644 index 0000000..0c0901a --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/login_page.dart @@ -0,0 +1,371 @@ +import 'package:TeaHub/components/login_button.dart'; +import 'package:TeaHub/components/my_textfield.dart'; +import 'package:TeaHub/components/square_tile.dart'; +import 'package:TeaHub/pages/splash_screens.dart'; +import 'package:TeaHub/services/authentication_service.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; + +import 'package:flutter/cupertino.dart'; + +class LoginPage extends StatefulWidget { + final Function() onTap; + const LoginPage({super.key, required this.onTap}); + + @override + State createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + //text editing controllers + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + + //User login + void UserLogin() async { + //Show loading circle + showDialog( + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + Color.fromARGB(255, 78, 203, 128)), + ), + ); + }, + ); + + try { + await FirebaseAuth.instance.signInWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + + //pop the loading circle + Navigator.pop(context); + } on FirebaseAuthException catch (e) { + //Display exception in terminal + print("Exception code : ${e.code}"); + //pop the loading circle + Navigator.pop(context); + //invalid user + if (e.code == 'invalid-credential') { + //Display error to user + invalidUserMessage(); + } else if (e.code == 'invalid-email') { + //Display error to user + invalidEmailMessage(); + } else if (e.code == 'channel-error') { + //Display error to user + emptyUserMessage(); + } + } + } + + // Error message - Display an error message if the user input is empty + void emptyUserMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid credentials', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Please enter your email and password.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Email error message - Display error message if the user's email is invalid + void invalidEmailMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'The provided email is invalid. Please check your email.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Invalid user message - Display error message if the user credentials are invalid + void invalidUserMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid User', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'The provided credentials are invalid. Please check your email and password.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // ------------- Log in page UI -------------- // + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.background, + leading: IconButton( + onPressed: () { + //Navigator.pop(context); + Navigator.of(context) + .push(MaterialPageRoute(builder: (context) => splashScreens())); + }, + icon: Icon( + Icons.arrow_back, + size: 35, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + backgroundColor: Theme.of(context).colorScheme.background, + body: SafeArea( + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + //Login text + Text( + 'Log In', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 45, + fontWeight: FontWeight.bold, + ), + ), + + Text( + 'Enter your Email and Password', + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'and start creating', + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + + const SizedBox(height: 30), + + // Email textfield + MyTextField( + controller: emailController, + hintText: 'Enter your email', + obscureText: false, + ), + + const SizedBox(height: 30), + + // Password textfield + MyTextField( + controller: passwordController, + hintText: 'Enter your password', + obscureText: true, + ), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 25.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Text( + 'Forgot password?', + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + ), + ), + ], + ), + ), + + const SizedBox(height: 40), + + //Login button + LoginButton( + onTap: UserLogin, + ), + + const SizedBox(height: 40), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 25.0), + child: Row( + children: [ + Expanded( + child: Divider( + thickness: 0.5, + color: Colors.grey, + ), + ), + Text( + ' Or Login with ', + ), + Expanded( + child: Divider( + thickness: 0.5, + color: Theme.of(context).colorScheme.tertiary, + ), + ), + ], + ), + ), + + const SizedBox(height: 40), + + //Facebook, Google and Apple icons + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SquareTile( + onTap: () => AuthService().signInWithFacebook(context), + imagePath: 'lib/images/Facebook_icon.png', + ), + const SizedBox(width: 30), + SquareTile( + onTap: () => AuthService().signInWithGoogle(), + imagePath: 'lib/images/Google_icon.png', + ), + // const SizedBox(width: 15), + // SquareTile( + // onTap: () => {}, + // imagePath: 'lib/images/Apple_icon.png', + // ), + ], + ), + + const SizedBox(height: 50), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Don\'t have an account?', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + ), + GestureDetector( + onTap: widget.onTap, + child: const Text( + ' Register Now', + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/signin_page.dart b/.Connected_Version - TeaHub/lib/pages/signin_page.dart new file mode 100644 index 0000000..4d573c8 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/signin_page.dart @@ -0,0 +1,613 @@ +import 'package:TeaHub/components/my_textfield.dart'; +import 'package:TeaHub/components/signin_button.dart'; +import 'package:TeaHub/components/square_tile.dart'; +import 'package:TeaHub/services/authentication_service.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; + +class RegisterPage extends StatefulWidget { + final Function()? onTap; + const RegisterPage({super.key, required this.onTap}); + + @override + State createState() => _RegisterPageState(); +} + +class _RegisterPageState extends State { + //text editing controllers + final userNameController = TextEditingController(); + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + final confirmpasswordController = TextEditingController(); + + //sign user up method + void signUserUp() async { + // show loading circle + showDialog( + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); // Conter + }, + ); + + // Check if username field is empty + if (userNameController.text.isEmpty) { + // Username field is empty, show error message + Navigator.pop(context); // Dismiss the loading circle + userNameErrorMessage(); + + return; // Exit the method + } + + //try creating the user + try { + if (passwordController.text == confirmpasswordController.text) { + // Assuming you have a UserCredential object named userCredential + UserCredential userCredential; + userCredential = + await FirebaseAuth.instance.createUserWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + + // Accessing uid from the User object within UserCredential + String? uid = userCredential?.user?.uid; + + if (uid != null) { + addUserDetails(userNameController.text.trim(), uid!); + } + + Navigator.pop(context); + } else { + //showErrorMessage("error"); + Navigator.pop(context); + // show error message, passwords dont't match + mainError(); + } + + //Navigator.pop(context); + } on FirebaseAuthException catch (e) { + print("Exception code : ${e.code}"); + // pop the loading circle + Navigator.pop(context); + // show error message + //showErrorMessage(e.code); + if (e.code == 'invalid-email') { + Navigator.pop(context); + invalidEmail(); + } else if (e.code == 'channel-error') { + channelError(); + } else if (e.code == 'weak-password') { + weakPasswordError(); + } else if (e.code == 'email-already-in-use') { + EmailInErrorMessage(); + } + } + } + + Future addUserDetails(String userName, String uid) async { + await FirebaseFirestore.instance.collection('Users').add({ + 'username': userName, + 'uid': uid, + }); + } + + //error message to user + void showErrorMessage(String message) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Colors.deepPurple, + title: Center( + child: Text( + message, + style: const TextStyle(color: Colors.white), + ), + ), + ); + }, + ); + } + + void userNameErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'User Name Error', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'It seems like the username\nfield is empty. Please enter\nyour username to continue.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Email error message - Display when email all ready have an account + void EmailInErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Email Address Already in Use.\nPlease choose a different email\naddress or log in using the\nexisting account.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Password error message - Display when user doesn't input the same password twice + void PasswordErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Passwords', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Passwords do not match. Please make sure you enter \nthe same password twice \nfor authentication.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Password error message - Display when password is less than 6 digits + void weakPasswordError() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Weak password', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Weak password. Please ensure your password is longer than 6 digits for better security.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Email error message - Display when input email is invalid + void invalidEmail() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Invalid email address. Please enter a valid email address.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Error message - Display an error message if the user input is empty + void channelError() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid credentials', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Please enter both your email address and password to proceed with Signin.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + void mainError() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid credentials', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + 'Please ensure that all your credentials are entered correctly to proceed with signing in.', + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + // appBar: AppBar( + // backgroundColor: Theme.of(context).colorScheme.background, + // leading: IconButton( + // onPressed: () { + // Navigator.pop(context); + // }, + // icon: Icon( + // Icons.arrow_back, + // size: 35, + // //color: Colors.black, + // color: Theme.of(context).colorScheme.primary, + // ), + // ), + // ), + backgroundColor: Theme.of(context).colorScheme.background, + body: SafeArea( + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Sign Up', + style: TextStyle( + //color: Colors.black, + color: Theme.of(context).colorScheme.primary, + fontSize: 45, + fontWeight: FontWeight.bold, + ), + ), + + Text( + 'Enter your Email and Password', + style: TextStyle( + //color: Colors.grey, + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'and start creating', + style: TextStyle( + //color: Colors.grey, + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + + const SizedBox(height: 15), + // email textfield + MyTextField( + controller: userNameController, + hintText: 'User Name', + obscureText: false, + ), + + const SizedBox( + height: 10, + ), + + // email textfield + MyTextField( + controller: emailController, + hintText: 'Email', + obscureText: false, + ), + + const SizedBox( + height: 10, + ), + + //password textfield + MyTextField( + controller: passwordController, + hintText: 'Password', + obscureText: true, + ), + + const SizedBox( + height: 10, + ), + + // confirm password textfield + MyTextField( + controller: confirmpasswordController, + hintText: 'Confirm Password', + obscureText: true, + ), + + const SizedBox( + height: 20, + ), + + // sign in button + MyButton( + text: "Register", + onTap: signUserUp, + ), //MyButton + + const SizedBox(height: 20), + + // or continue with + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25.0), + child: Row( + children: [ + Expanded( + child: Divider( + thickness: 0.5, + //color: Colors.grey[400], + color: Theme.of(context).colorScheme.secondary, + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Text( + 'Or Register with', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + Expanded( + child: Divider( + thickness: 0.5, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ], + ), + ), + + const SizedBox(height: 20), + + // google and facebook button + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SquareTile( + onTap: () => AuthService().signInWithFacebook(context), + imagePath: 'lib/images/Facebook_icon.png', + ), + const SizedBox(width: 30), + SquareTile( + onTap: () => AuthService().signInWithGoogle(), + imagePath: 'lib/images/Google_icon.png', + ), + // const SizedBox(width: 15), + // SquareTile( + // onTap: () => {}, + // imagePath: 'lib/images/Apple_icon.png', + // ), + ], + ), + + const SizedBox(height: 30), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Already have an account?', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + ), + ), + const SizedBox(width: 4), + GestureDetector( + onTap: widget.onTap, + child: const Text( + ' Register Now', + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(height: 30), + ], + ) + ], + ), + ), + )), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/splash_screens.dart b/.Connected_Version - TeaHub/lib/pages/splash_screens.dart new file mode 100644 index 0000000..bd5674d --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/splash_screens.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:smooth_page_indicator/smooth_page_indicator.dart'; +import 'splash_screens/screen_1.dart'; +import 'splash_screens/screen_2.dart'; +import 'splash_screens/screen_3.dart'; +import 'splash_screens/screen_4.dart'; + +class splashScreens extends StatefulWidget { + const splashScreens({Key? key}) : super(key: key); + + @override + _splashScreensState createState() => _splashScreensState(); +} + +class _splashScreensState extends State { + final _controller = PageController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Stack( + children: [ + Container( + child: SizedBox( + child: PageView( + controller: _controller, + children: [ + screen_1(), + screen_2(), + screen_3(), + //screen_4(), + ], + ), + ), + ), + Positioned( + bottom: 150, + right: MediaQuery.of(context).size.width / 3, + child: Container( + child: SmoothPageIndicator( + controller: _controller, + count: 3, + effect: const ExpandingDotsEffect( + activeDotColor: Color.fromARGB(255, 78, 203, 128), + dotColor: Colors.grey, + ), + ), + ), + ), + + //Next button + Positioned( + bottom: 50, + left: 33, + child: TextButton( + onPressed: () { + int pageIndex = _controller.page?.round() ?? + 0; // Round the double to get the nearest integer + + if (pageIndex == 2) { + // Assuming screen_3() is at index 2 (0-based index) + //_controller.jumpToPage(3); // Go back to the first page + + Navigator.push( + context, + MaterialPageRoute(builder: (context) => screen_4()), + ); + } else { + _controller.nextPage( + duration: Duration(milliseconds: 500), + curve: Curves.ease, + ); + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Color.fromARGB(255, 78, 203, 128), + ), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(5.0), // Set the radius to 5 + ), + ), + ), + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 120, vertical: 15), + child: const Text( + 'Next', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_1.dart b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_1.dart new file mode 100644 index 0000000..50491b3 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_1.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class screen_1 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_1.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Theme.of(context).colorScheme.background, + height: 410, + width: MediaQuery.of(context).size.width, + child: Column( + children: [ + SizedBox(height: 30), + Text( + 'Predict Diseases Instantly\nwith a Snap!', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 20), + Text( + '"Snap a pic, diagnose quick! Our app predicts\nplant diseases with Al precision, empowering\ngrowers for healthier yields!"', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_2.dart b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_2.dart new file mode 100644 index 0000000..f4f80aa --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_2.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class screen_2 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_2.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Theme.of(context).colorScheme.background, + height: 410, + width: MediaQuery.of(context).size.width, + child: Column( + children: [ + SizedBox(height: 30), + Text( + 'Chatbot Guidance for\nThriving Greens!', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 20), + Text( + '"Snap your plant woe, chat for a pro! Our app\'s\nyour green guru, diagnosing diseases and bulding growth, leaf by leaf!"', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_3.dart b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_3.dart new file mode 100644 index 0000000..d958037 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_3.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class screen_3 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_3.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Theme.of(context).colorScheme.background, + height: 410, + width: MediaQuery.of(context).size.width, + child: Column( + children: [ + SizedBox(height: 30), + Text( + 'Your Green Guru for Growing Success!', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 20), + Text( + '"Unlock the Green World: Your Ultimate Plant\nEncyclopedia! Delve into climate needs, water\nsecrets, and harvest timing for lush, thriving plants."', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_4.dart b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_4.dart new file mode 100644 index 0000000..575bf43 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/splash_screens/screen_4.dart @@ -0,0 +1,145 @@ +import 'package:TeaHub/pages/LoginOrSignin_page.dart'; + +import 'package:flutter/material.dart'; +//import 'package:teahub/pages/signin_page.dart'; +//import 'package:teahub/pages/login_page.dart'; + +class screen_4 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_4.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Theme.of(context).colorScheme.background, + height: 410, + width: MediaQuery.of(context).size.width, + child: Column( + children: [ + const SizedBox(height: 20), + Text( + 'Let\'s Create', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 42, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 25), + Text( + 'Welcome to TeaHub', + textAlign: TextAlign.center, + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 40), + + //button + Positioned( + child: TextButton( + onPressed: () { + //pop the splash screen_4 + Navigator.pop(context); + // Move to the register page + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + const LoginOrRegisterPage()), + // MaterialPageRoute(builder: (context) => AuthPage()), + ); + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + const Color.fromARGB(255, 78, 203, 128), + ), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 5.0), // Set the radius to 5 + ), + ), + ), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 80, vertical: 16), + child: const Text( + 'I\'m New Here', + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + + // + const SizedBox(height: 60), + + //sign in + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Already Have An Account? ', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.secondary, + ), + ), + TextButton( + onPressed: () { + //pop the splash screen_4 + Navigator.pop(context); + //send to log in page + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => + const LoginOrRegisterPage())); + }, + child: const Text( + 'Sign In', + style: TextStyle( + color: Colors.blue, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/pages/two_step_verification/verification_page.dart b/.Connected_Version - TeaHub/lib/pages/two_step_verification/verification_page.dart new file mode 100644 index 0000000..b927952 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/pages/two_step_verification/verification_page.dart @@ -0,0 +1,197 @@ +import 'dart:async'; + +import 'package:TeaHub/home_page/navigation.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; + +class VerificationPage extends StatefulWidget { + const VerificationPage({Key? key}) : super(key: key); + + @override + State createState() => _VerificationPageState(); +} + +class _VerificationPageState extends State { + bool isEmailVerified = false; + bool canResendEmail = false; + Timer? timer; + +// void sendOTP() async { +// EmailAuth.sessionName = "sessionOne"; +// var res=await EmailAuth.sendotp +// } + + @override + void initState() { + super.initState(); + + isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified; + + if (!isEmailVerified) { + sendVerificationEmail(); + + timer = Timer.periodic( + Duration(seconds: 3), + (_) => checkEmailVerified(), + ); + } + } + + @override + void dispose() { + timer?.cancel(); + + super.dispose(); + } + + Future checkEmailVerified() async { + await FirebaseAuth.instance.currentUser!.reload(); + + setState(() { + isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified; + }); + + if (isEmailVerified) timer?.cancel(); + } + + Future sendVerificationEmail() async { + try { + final user = FirebaseAuth.instance.currentUser!; + await user.sendEmailVerification(); + print('email ${user.email}'); + + setState(() => canResendEmail = false); + await Future.delayed(Duration(seconds: 60)); + setState(() => canResendEmail = true); + } catch (e) { + print('Send verification email error : $e'); + } + } + + Future cancelEmail() async { + try { + final user = FirebaseAuth.instance.currentUser; + user?.delete(); + + // if (Navigator.of(context).canPop()) { + // Navigator.pop(context); + // } + } catch (e) { + print('Send verification email error : $e'); + } + } + + @override + Widget build(BuildContext context) => isEmailVerified + ? const navigationPage() + : Scaffold( + backgroundColor: Theme.of(context).colorScheme.background, + body: Padding( + padding: EdgeInsets.all(20), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'lib/images/email_icon.png', + width: 180, + height: 180, + ), + SizedBox(height: 30), + Text( + 'Please Verify your Email', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 26, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + const SizedBox( + height: 50, + ), + Text( + 'Verification email has been sent to', + style: TextStyle( + fontSize: 18, + color: Theme.of(context).colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 5), + Text( + '${FirebaseAuth.instance.currentUser!.email}', // Displaying user's email + style: TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 30), + Text( + 'Click on the link to complete the verification process', + style: TextStyle( + fontSize: 18, + color: Theme.of(context).colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 30), + Text( + 'Wait 60 seconds to get new verification email', + style: TextStyle( + fontSize: 15, + color: Theme.of(context).colorScheme.primary, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 5), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + backgroundColor: Color.fromARGB(255, 78, 203, 128), + ), + icon: const Icon( + Icons.email, + size: 32, + color: Colors.black, + ), + label: const Text( + 'Resend Email', + style: TextStyle( + fontSize: 22, + color: Colors.black, + ), + ), + onPressed: canResendEmail ? sendVerificationEmail : null, + ), + const SizedBox( + height: 20, + ), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + backgroundColor: Color.fromARGB(255, 78, 203, 128), + ), + icon: const Icon( + Icons.email, + size: 32, + color: Colors.black, + ), + label: const Text( + 'Cancel', + style: TextStyle(fontSize: 22, color: Colors.black), + ), + onPressed: cancelEmail, + ), + ], + ), + ), + ); +} diff --git a/.Connected_Version - TeaHub/lib/services/authentication_service.dart b/.Connected_Version - TeaHub/lib/services/authentication_service.dart new file mode 100644 index 0000000..2b2fba6 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/services/authentication_service.dart @@ -0,0 +1,79 @@ +import 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; + +class AuthService { + //Google Sign in + signInWithGoogle() async { + //begin interactive sign in precess + final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); + + //obtain auth details from request + final GoogleSignInAuthentication googleAuth = + await googleUser!.authentication; + + //create a new credentials for user + final credential = GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + //finally,lets sign in + return await FirebaseAuth.instance.signInWithCredential(credential); + } + + Future signInWithFacebook(BuildContext context) async { + //Show loading circle + showDialog( + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator( + valueColor: AlwaysStoppedAnimation( + Color.fromARGB(255, 78, 203, 128)), + ), + ); + }, + ); + // Create a Completer to capture the current context + final Completer completer = Completer(); + + // Execute code synchronously to capture the context + // This will be executed before entering the async block + final currentContext = context; + + try { + final LoginResult loginResult = await FacebookAuth.instance.login(); + + final OAuthCredential facebookAuthCredential = + FacebookAuthProvider.credential(loginResult.accessToken!.token); + + // Use the captured context inside the async block + await FirebaseAuth.instance.signInWithCredential(facebookAuthCredential); + + // Complete the Completer to signal that the operation is complete + completer.complete(); + } on FirebaseAuthException catch (e) { + // Use the captured context to show the snackbar + // ignore: use_build_context_synchronously + showSnackBar(currentContext, e.message!); + + // Complete the Completer with an error to propagate the error + completer.completeError(e); + } + + // Return the Future associated with the Completer + return completer.future; + } + + void showSnackBar(BuildContext context, String text) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(text), + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/snap_tips/SnapTips.dart b/.Connected_Version - TeaHub/lib/snap_tips/SnapTips.dart new file mode 100644 index 0000000..6c1a103 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/snap_tips/SnapTips.dart @@ -0,0 +1,176 @@ +import 'package:flutter/material.dart'; + +class SnapTips extends StatelessWidget { + const SnapTips({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + child: Container( + alignment: + Alignment.bottomCenter, // Align the column to the bottom center + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Title "Snap Tips" + Text( + "Snap Tips", + style: TextStyle( + fontSize: 24, // Adjust the font size as needed + fontWeight: FontWeight.bold, + //color: Colors.black, // Font color black + color: Theme.of(context).colorScheme.primary, + ), + ), + SizedBox(height: 20), // Spacer between title and first larger image + // First larger image in the center + Stack( + children: [ + Container( + width: 200, // Adjust the width as needed + height: 200, // Adjust the height as needed + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + color: Colors.green, // Green border + width: 4, + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(100), + child: Image.asset( + "lib/images/snap_tips imgs/image 1.jpg", + fit: BoxFit.cover, + ), + ), + ), + Positioned( + top: 8, // Adjust the top padding as needed + right: 8, // Adjust the right padding as needed + child: Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.green, + shape: BoxShape.circle, + ), + child: Icon( + Icons.check, + color: Colors.white, + size: 30, // Adjust the icon size as needed + ), + ), + ), + ], + ), + SizedBox(height: 20), // Spacer between the first and second row + + // Second row with three smaller images + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildImageWithBorderAndIcon( + "lib/images/snap_tips imgs/image 2.jpg", + Colors.red, + "Too close"), + SizedBox(width: 30), // Increase the spacer between images + _buildImageWithBorderAndIcon( + "lib/images/snap_tips imgs/image 3.jpg", + Colors.red, + "Too far"), + SizedBox(width: 30), // Increase the spacer between images + _buildImageWithBorderAndIcon( + "lib/images/snap_tips imgs/image 4.jpg", + Colors.red, + "Multiple species"), + ], + ), + SizedBox(height: 40), // Spacer between images and button + Container( + width: double.infinity, // Make the button full width + margin: EdgeInsets.symmetric( + horizontal: 20, + vertical: 20), // Add margin horizontally and vertically + child: Material( + elevation: 5, // Add elevation for shadow effect + borderRadius: + BorderRadius.circular(30), // Make the button circular + color: Colors.green, // Set button background color + child: TextButton( + onPressed: () { + //Close snap tips page when click continue + Navigator.pop(context); + // Handle button press + }, + child: Text( + 'Continue', + style: TextStyle( + color: Colors.white, // Set button text color + fontSize: 16, // Adjust the font size as needed + ), + ), + ), + ), + ), + ], + ), + ), + ); + } + + Widget _buildImageWithBorderAndIcon( + String imagePath, Color borderColor, String text) { + return Column( + children: [ + Stack( + children: [ + Container( + width: 100, // Adjust the width as needed + height: 100, // Adjust the height as needed + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50), + border: Border.all( + color: borderColor, // Red border + width: 4, + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.asset( + imagePath, + fit: BoxFit.cover, + ), + ), + ), + Positioned( + top: -4, // Adjust the top padding as needed + right: -4, // Adjust the right padding as needed + child: Container( + padding: EdgeInsets.all(8), + margin: EdgeInsets.all( + 4), // Add margin to avoid cutting off the circle + decoration: BoxDecoration( + color: borderColor, + shape: BoxShape.circle, + ), + child: Icon( + Icons.close, + color: Colors.white, + size: 20, // Adjust the icon size as needed + ), + ), + ), + ], + ), + SizedBox(height: 5), // Spacer between image and text + Text( + text, + style: TextStyle( + fontSize: 12, // Adjust the font size as needed + fontWeight: FontWeight.bold, // Make the text bold + //color: Colors.black, // Font color black + ), + ), + ], + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/snap_tips/snapTip.dart b/.Connected_Version - TeaHub/lib/snap_tips/snapTip.dart new file mode 100644 index 0000000..b5477da --- /dev/null +++ b/.Connected_Version - TeaHub/lib/snap_tips/snapTip.dart @@ -0,0 +1,18 @@ +import 'package:TeaHub/snap_tips/SnapTips.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: SnapTips(), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/splash_screen.dart b/.Connected_Version - TeaHub/lib/splash_screen.dart new file mode 100644 index 0000000..b9f78bb --- /dev/null +++ b/.Connected_Version - TeaHub/lib/splash_screen.dart @@ -0,0 +1 @@ +// TODO Implement this library. \ No newline at end of file diff --git a/.Connected_Version - TeaHub/lib/theme/theme.dart b/.Connected_Version - TeaHub/lib/theme/theme.dart new file mode 100644 index 0000000..d7bced1 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/theme/theme.dart @@ -0,0 +1,21 @@ +import 'package:flutter/material.dart'; + +ThemeData lightMode = ThemeData( + brightness: Brightness.light, + colorScheme: ColorScheme.light( + background: Colors.white, + primary: Colors.black, + secondary: Colors.grey, + tertiary: Colors.grey.shade300, + surfaceTint: Colors.white, + )); + +ThemeData darkMode = ThemeData( + brightness: Brightness.dark, + colorScheme: ColorScheme.dark( + background: Colors.grey.shade800, + primary: Colors.white, + secondary: Colors.grey.shade400, + tertiary: Colors.grey.shade600, + surfaceTint: Colors.black, + )); diff --git a/.Connected_Version - TeaHub/lib/theme/theme_button.dart b/.Connected_Version - TeaHub/lib/theme/theme_button.dart new file mode 100644 index 0000000..d6e8d50 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/theme/theme_button.dart @@ -0,0 +1,83 @@ +import 'package:TeaHub/theme/theme_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ThemeSelector extends StatelessWidget { + const ThemeSelector({super.key}); + + Widget build(BuildContext context) { + return Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), // Set border radius + + border: Border.all( + color: Theme.of(context).colorScheme.primary, // Set border color + width: 0.5, // Set border width + ), + + color: Theme.of(context).colorScheme.tertiary, + ), + + //color: Theme.of(context).colorScheme.primary, + // width: 100, // Set the desired width of the dropdown button + // height: 40, + child: Consumer( + builder: (context, provider, child) { + return DropdownButton( + value: provider.currentTheme, + padding: EdgeInsets.only(left: 8), + dropdownColor: Theme.of(context).colorScheme.tertiary, + borderRadius: BorderRadius.circular(10), + icon: Icon(Icons.arrow_drop_down, + color: Theme.of(context).colorScheme.primary, + size: 30), // Add dropdown icon + underline: Container( + // Remove underline + height: 0, + ), + + items: [ + DropdownMenuItem( + value: 'light', + child: Text( + 'Light', + style: TextStyle( + color: + Theme.of(context).colorScheme.primary, // Set text color + fontSize: 18, // Set font size + ), + ), + ), + DropdownMenuItem( + value: 'dark', + child: Text( + 'Dark', + style: TextStyle( + color: + Theme.of(context).colorScheme.primary, // Set text color + fontSize: 18, // Set font size + ), + ), + ), + DropdownMenuItem( + value: 'system', + child: Text( + 'System', + style: TextStyle( + color: + Theme.of(context).colorScheme.primary, // Set text color + fontSize: 18, // Set font size + ), + ), + ), + ], + onChanged: (String? value) { + provider.changeTheme(value ?? 'system'); + }, + ); + }, + ), + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/theme/theme_provider.dart b/.Connected_Version - TeaHub/lib/theme/theme_provider.dart new file mode 100644 index 0000000..df53c3f --- /dev/null +++ b/.Connected_Version - TeaHub/lib/theme/theme_provider.dart @@ -0,0 +1,54 @@ +// import 'package:TeaHub/theme/theme.dart'; +// import 'package:flutter/material.dart'; + +// class ThemeProvider with ChangeNotifier { +// ThemeData _themeData = lightMode; + +// ThemeData get themeData => _themeData; + +// set themeData(ThemeData themeData) { +// _themeData = themeData; +// notifyListeners(); +// } + +// void toggleTheme() { +// if (_themeData == lightMode) { +// themeData = darkMode; +// } else { +// themeData = lightMode; +// } +// } +// } + +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ThemeProvider extends ChangeNotifier { + String currentTheme = 'system'; + + ThemeMode get themeMode { + if (currentTheme == 'light') { + return ThemeMode.light; + } else if (currentTheme == 'dark') { + return ThemeMode.dark; + } else { + return ThemeMode.system; + } + } + + changeTheme(String theme) async { + final SharedPreferences _prefs = await SharedPreferences.getInstance(); + + await _prefs.setString('theme', theme); + + currentTheme = theme; + notifyListeners(); + } + + initializer() async { + final SharedPreferences _prefs = await SharedPreferences.getInstance(); + + currentTheme = _prefs.getString('theme') ?? 'system'; + notifyListeners(); + } +} diff --git a/.Connected_Version - TeaHub/lib/user_profile/main.dart b/.Connected_Version - TeaHub/lib/user_profile/main.dart new file mode 100644 index 0000000..6955c7e --- /dev/null +++ b/.Connected_Version - TeaHub/lib/user_profile/main.dart @@ -0,0 +1,22 @@ +import 'package:TeaHub/user_profile/user_profile.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); // Fixing the key parameter + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'User Profile', + theme: ThemeData( + primarySwatch: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: const UserProfile(), // Using the Disease widget as the home screen + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/user_profile/user_profile.dart b/.Connected_Version - TeaHub/lib/user_profile/user_profile.dart new file mode 100644 index 0000000..4285e70 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/user_profile/user_profile.dart @@ -0,0 +1,1728 @@ +import 'dart:ui'; +import 'package:firebase_storage/firebase_storage.dart' as firebase_storage; +import 'package:TeaHub/pages/home_page.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:google_fonts/google_fonts.dart'; +import 'dart:io'; +import 'package:image_picker/image_picker.dart'; + +class MyCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} + +class UserProfile extends StatefulWidget { + const UserProfile({Key? key}) : super(key: key); + + @override + _UserProfileState createState() => _UserProfileState(); +} + +class _UserProfileState extends State { + File? _imageFile; + // ignore: unused_field + String? _imageUrl; //To store the URL of the uploaded image. + + Future _selectImage() async { + final pickedFile = + await ImagePicker().pickImage(source: ImageSource.gallery); + if (pickedFile != null) { + setState(() { + _imageFile = File(pickedFile.path); + }); + + // upload image to Firebase storage + firebase_storage.Reference ref = firebase_storage.FirebaseStorage.instance + .ref() + .child('profile_image') + .child('profile_${DateTime.now().millisecondsSinceEpoch}.jpg'); + + await ref.putFile(_imageFile!); + + //Get download URL + String imageUrl = await ref.getDownloadURL(); + + setState(() { + _imageUrl = imageUrl; //Update the imageUrl + }); + + //Use the imageUrl as needed. + print('Uploaded image URL: $imageUrl'); + } + } + + @override + Widget build(BuildContext context) { + double baseWidth = 375; + double fem = MediaQuery.of(context).size.width / baseWidth; + double ffem = fem * 0.97; + return Container( + width: double.infinity, + child: Container( + // userprofilegyM (226:2601) + width: double.infinity, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.background, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // autogroupqvxhcs1 (9njecn1HncthMNQkxpQVxh) + width: 390 * fem, + height: 355 * fem, + child: Stack( + children: [ + Positioned( + // rectangle51jgj (226:2630) + left: 0 * fem, + top: 0 * fem, + child: Align( + child: SizedBox( + width: 380 * fem, + height: 263 * fem, + child: Image.asset( + 'assets/images/user_profile/rectangle-51.png', + width: 390 * fem, + height: 263 * fem, + ), + ), + ), + ), + // Positioned( + // // toprWT (226:2631) + // left: 24 * fem, + // top: 69 * fem, + // child: Align( + // child: SizedBox( + // width: 350 * fem, + // height: 24 * fem, + // child: Image.asset( + // 'assets/images/user_profile/top.png', + // width: 350 * fem, + // height: 24 * fem, + // ), + // ), + // ), + // ), + Positioned( + // group71AJB (226:2650) + left: 84.5 * fem, + top: 171 * fem, + child: Container( + width: 221 * fem, + height: 184 * fem, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + GestureDetector( + onTap: _selectImage, + child: Container( + // avatartEB (226:2651) + margin: EdgeInsets.fromLTRB( + 47.5 * fem, 0 * fem, 46.5 * fem, 0 * fem), + width: double.infinity, + height: 130 * fem, + child: Stack( + children: [ + Positioned( + // rectangle6RV1 (I226:2652;218:102701) + left: 0 * fem, + top: 0 * fem, + child: SizedBox( + width: 120 * fem, + height: 120 * fem, + child: _imageFile != null + ? Image.file( + _imageFile!, + fit: BoxFit.cover, + ) + : Image.asset( + 'assets/images/user_profile/rectangle-6.png', + fit: BoxFit.cover, + ), + ), + ), + Positioned( + // edit icon + left: 81 * fem, + top: 84 * fem, + child: GestureDetector( + onTap: _selectImage, + child: SizedBox( + width: 46 * fem, + height: 46 * fem, + child: Image.asset( + 'assets/images/user_profile/group-62.png', + width: 46 * fem, + height: 46 * fem, + ), + ), + ), + ), + ], + ), + ), + ), + Container( + // vihangasupasanzwR (226:2656) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 1 * fem, 6 * fem), + child: Text( + 'Vihanga Supasan', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 22 * ffem, + fontWeight: FontWeight.w600, + height: 1.2727272727 * ffem / fem, + //color: const Color(0xff000000), + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + Text( + // vs2001gmailcom0772026018JSK (226:2657) + 'vs2001@gmail.com | 0772026018', + textAlign: TextAlign.center, + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + //color: const Color(0xff000000), + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + ), + ], + ), + ), + Container( + // autogroupa6b7pQf (9njfGg5ouQpJKDWi1Pa6b7) + padding: + EdgeInsets.fromLTRB(20 * fem, 45 * fem, 9 * fem, 10 * fem), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // group70M9h (226:2753) + margin: EdgeInsets.fromLTRB( + 4 * fem, 0 * fem, 0 * fem, 45 * fem), + padding: EdgeInsets.fromLTRB( + 16 * fem, 14 * fem, 24 * fem, 11 * fem), + width: 342 * fem, + decoration: BoxDecoration( + //color: const Color(0xffffffff), + color: Theme.of(context).colorScheme.tertiary, + borderRadius: BorderRadius.circular(8 * fem), + boxShadow: [ + BoxShadow( + color: const Color(0x3f000000), + offset: Offset(0 * fem, 1 * fem), + blurRadius: 2 * fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // component11zCf (226:2755) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 0 * fem, 11 * fem), + padding: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 117 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linebusinessprofilelinehMy (I226:2755;226:2370) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 13 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/images/user_profile/line-business-profile-line.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + GestureDetector( + onTap: () { + // Navigate to the edit profile page + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomePage()), + ); + }, + child: Text( + 'Edit profile information', + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + color: + Theme.of(context).colorScheme.primary, + ), + ), + ), + + // GestureDetector( + // onTap: () { + // // Navigate to the edit profile page + // Navigator.push( + // context, + // MaterialPageRoute(builder: (context) => EditProfilePage()), + // ); + // }, + // child: Text( + // 'Edit profile information', + // style: GoogleFonts.roboto( + // fontSize: 14 * ffem, + // fontWeight: FontWeight.w400, + // height: 1.4285714286 * ffem / fem, + // letterSpacing: 0.25 * fem, + // color: Theme.of(context).colorScheme.primary, + // ), + // ), + // ) + + // Text( + // // editprofileinformationQGP (I226:2755;226:2371) + // 'Edit profile information', + // style: GoogleFonts.roboto( + // fontSize: 14 * ffem, + // fontWeight: FontWeight.w400, + // height: 1.4285714286 * ffem / fem, + // letterSpacing: 0.25 * fem, + // //color: const Color(0xff000000), + // color: Theme.of(context).colorScheme.primary, + // ), + // ), + ], + ), + ), + Container( + // component12LA3 (226:2756) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 0 * fem, 13 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linemedianotification3line4Lw (I226:2756;226:2370) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 13 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/images/user_profile/line-media-notification-3-line.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + Container( + // editprofileinformationyTu (I226:2756;226:2371) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 161 * fem, 0 * fem), + child: Text( + 'Notifications', + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + //color: const Color(0xff000000), + color: + Theme.of(context).colorScheme.primary, + ), + ), + ), + Text( + // englishea3 (I226:2756;226:2372) + 'ON', + textAlign: TextAlign.right, + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + color: const Color(0xff4ecb81), + ), + ), + ], + ), + ), + Container( + // component13P1q (226:2757) + padding: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 212 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // autogroupoclv7iX (9njg4V6oyoBkeHR9keocLV) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 13 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/images/user_profile/auto-group-oclv.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + Text( + // editprofileinformation2qV (I226:2757;226:2371) + 'Security', + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + //color: const Color(0xff000000), + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + ], + ), + ), + Container( + // group69ZaX (226:2730) + margin: + EdgeInsets.fromLTRB(0 * fem, 0 * fem, 4 * fem, 0 * fem), + padding: EdgeInsets.fromLTRB( + 16 * fem, 14 * fem, 24 * fem, 11 * fem), + width: 342 * fem, + decoration: BoxDecoration( + //color: const Color(0xffffffff), + color: Theme.of(context).colorScheme.tertiary, + borderRadius: BorderRadius.circular(8 * fem), + boxShadow: [ + BoxShadow( + color: const Color(0x3f000000), + offset: Offset(0 * fem, 1 * fem), + blurRadius: 2 * fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // component113Eo (226:2732) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 0 * fem, 11 * fem), + padding: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 167 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // lineusercontactslineXvf (I226:2732;226:2370) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 13 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/images/user_profile/line-user-contacts-line.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + Text( + // editprofileinformationrT9 (I226:2732;226:2371) + 'Help & Support', + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + //color: const Color(0xff000000), + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + Container( + // component12PT5 (226:2733) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 0 * fem, 13 * fem), + padding: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 195 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linecommunicationchatquoteline (I226:2733;226:2370) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 13 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/images/user_profile/line-communication-chat-quote-line.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + Text( + // editprofileinformationq4B (I226:2733;226:2371) + 'Contact us', + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + //color: const Color(0xff000000), + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + Container( + // component13Zks (226:2734) + padding: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 176 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linesystemlock2lineuZq (I226:2734;226:2370) + margin: EdgeInsets.fromLTRB( + 0 * fem, 0 * fem, 13 * fem, 0 * fem), + width: 24 * fem, + height: 24 * fem, + child: Image.asset( + 'assets/images/user_profile/line-system-lock-2-line.png', + width: 24 * fem, + height: 24 * fem, + ), + ), + Text( + // editprofileinformationo9R (I226:2734;226:2371) + 'Privacy policy', + style: GoogleFonts.roboto( + fontSize: 14 * ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286 * ffem / fem, + letterSpacing: 0.25 * fem, + //color: const Color(0xff000000), + color: Theme.of(context).colorScheme.primary, + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + // Container( + // // menu1vzj (226:2663) + // width: 428 * fem, + // height: 115 * fem, + // child: Stack( + // children: [ + // Positioned( + // // floatbtngDD (I226:2663;405:7322) + // left: 155 * fem, + // top: 0 * fem, + // child: Align( + // child: SizedBox( + // width: 64 * fem, + // height: 64 * fem, + // child: Image.asset( + // 'assets/images/user_profile/float-btn-5hq.png', + // width: 64 * fem, + // height: 64 * fem, + // ), + // ), + // ), + // ), + // Positioned( + // // bgaJb (I226:2663;405:7324) + // left: 0 * fem, + // top: 40 * fem, + // child: Align( + // child: SizedBox( + // width: 375 * fem, + // height: 75 * fem, + // child: Image.asset( + // 'assets/images/user_profile/bg-ysV.png', + // width: 375 * fem, + // height: 75 * fem, + // ), + // ), + // ), + // ), + // Positioned( + // // scansvgrepocomu5y (226:2704) + // left: 167 * fem, + // top: 14 * fem, + // child: Align( + // child: SizedBox( + // width: 40 * fem, + // height: 40 * fem, + // child: Image.asset( + // 'assets/images/user_profile/scansvgrepocom-N6T.png', + // width: 40 * fem, + // height: 40 * fem, + // ), + // ), + // ), + // ), + // ], + // ), + // ), + ], + ), + ), + ); + } +} + + +// import 'dart:io'; +// import 'dart:ui'; +// import 'package:TeaHub/pages/home_page.dart'; +// import 'package:flutter/material.dart'; +// import 'package:google_fonts/google_fonts.dart'; +// import 'package:image_picker/image_picker.dart'; +// // import 'package:firebase_storage/firebase_storage.dart'; + +// class MyCustomScrollBehavior extends MaterialScrollBehavior { +// @override +// Set get dragDevices => { +// PointerDeviceKind.touch, +// PointerDeviceKind.mouse, +// }; +// } + +// class UserProfile extends StatefulWidget { +// const UserProfile({Key? key}) : super(key: key); + +// @override +// _UserProfileState createState() => _UserProfileState(); +// } + +// class _UserProfileState extends State { +// File? _imageFile; + +// Future _selectImage() async { +// final pickedFile = +// await ImagePicker().pickImage(source: ImageSource.gallery); +// if (pickedFile != null) { +// setState(() { +// _imageFile = File(pickedFile.path); +// }); +// } +// } + +// @override +// Widget build(BuildContext context) { +// double baseWidth = 375; +// double fem = MediaQuery.of(context).size.width / baseWidth; +// double ffem = fem * 0.97; +// return Container( +// width: double.infinity, +// child: Container( +// // userprofilegyM (226:2601) +// width: double.infinity, +// decoration: BoxDecoration( +// color: Theme.of(context).colorScheme.background, +// ), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.start, +// children: [ +// Container( +// // autogroupqvxhcs1 (9njecn1HncthMNQkxpQVxh) +// width: 390 * fem, +// height: 355 * fem, +// child: Stack( +// children: [ +// Positioned( +// // rectangle51jgj (226:2630) +// left: 0 * fem, +// top: 0 * fem, +// child: Align( +// child: SizedBox( +// width: 380 * fem, +// height: 263 * fem, +// child: Image.asset( +// 'assets/images/user_profile/rectangle-51.png', +// width: 390 * fem, +// height: 263 * fem, +// ), +// ), +// ), +// ), +// // Positioned( +// // // toprWT (226:2631) +// // left: 24 * fem, +// // top: 69 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 350 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/top.png', +// // width: 350 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // ), +// // ), +// Positioned( +// // group71AJB (226:2650) +// left: 84.5 * fem, +// top: 171 * fem, +// child: Container( +// width: 221 * fem, +// height: 184 * fem, +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // avatartEB (226:2651) +// margin: EdgeInsets.fromLTRB( +// 47.5 * fem, 0 * fem, 46.5 * fem, 0 * fem), +// width: double.infinity, +// height: 130 * fem, +// child: Stack( +// children: [ +// Positioned( +// // rectangle6RV1 (I226:2652;218:102701) +// left: 0 * fem, +// top: 0 * fem, +// child: SizedBox( +// width: 120 * fem, +// height: 120 * fem, +// child: _imageFile != null +// ? Image.file( +// _imageFile!, +// fit: BoxFit.cover, +// ) +// : Image.asset( +// 'assets/images/user_profile/rectangle-6.png', +// fit: BoxFit.cover, +// ), +// ), +// ), +// Positioned( +// // edit icon +// left: 81 * fem, +// top: 84 * fem, +// child: GestureDetector( +// onTap: _selectImage, +// child: SizedBox( +// width: 46 * fem, +// height: 46 * fem, +// child: Image.asset( +// 'assets/images/user_profile/group-62.png', +// width: 46 * fem, +// height: 46 * fem, +// ), +// ), +// ), +// ), +// ], +// ), +// ), +// Container( +// // vihangasupasanzwR (226:2656) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 1 * fem, 6 * fem), +// child: Text( +// 'Vihanga Supasan', +// textAlign: TextAlign.center, +// style: GoogleFonts.poppins( +// fontSize: 22 * ffem, +// fontWeight: FontWeight.w600, +// height: 1.2727272727 * ffem / fem, +// //color: const Color(0xff000000), +// color: Theme.of(context).colorScheme.primary, +// ), +// ), +// ), +// Text( +// // vs2001gmailcom0772026018JSK (226:2657) +// 'vs2001@gmail.com | 0772026018', +// textAlign: TextAlign.center, +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// //color: const Color(0xff000000), +// color: Theme.of(context).colorScheme.primary, +// ), +// ), +// ], +// ), +// ), +// ), +// ], +// ), +// ), +// Container( +// // autogroupa6b7pQf (9njfGg5ouQpJKDWi1Pa6b7) +// padding: +// EdgeInsets.fromLTRB(20 * fem, 45 * fem, 9 * fem, 10 * fem), +// width: double.infinity, +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // group70M9h (226:2753) +// margin: EdgeInsets.fromLTRB( +// 4 * fem, 0 * fem, 0 * fem, 45 * fem), +// padding: EdgeInsets.fromLTRB( +// 16 * fem, 14 * fem, 24 * fem, 11 * fem), +// width: 342 * fem, +// decoration: BoxDecoration( +// //color: const Color(0xffffffff), +// color: Theme.of(context).colorScheme.tertiary, +// borderRadius: BorderRadius.circular(8 * fem), +// boxShadow: [ +// BoxShadow( +// color: const Color(0x3f000000), +// offset: Offset(0 * fem, 1 * fem), +// blurRadius: 2 * fem, +// ), +// ], +// ), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // component11zCf (226:2755) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 0 * fem, 11 * fem), +// padding: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 117 * fem, 0 * fem), +// width: double.infinity, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // linebusinessprofilelinehMy (I226:2755;226:2370) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// width: 24 * fem, +// height: 24 * fem, +// child: Image.asset( +// 'assets/images/user_profile/line-business-profile-line.png', +// width: 24 * fem, +// height: 24 * fem, +// ), +// ), +// GestureDetector( +// onTap: () { +// // Navigate to the edit profile page +// Navigator.push( +// context, +// MaterialPageRoute( +// builder: (context) => HomePage()), +// ); +// }, +// child: Text( +// 'Edit profile information', +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// color: +// Theme.of(context).colorScheme.primary, +// ), +// ), +// ), + +// // GestureDetector( +// // onTap: () { +// // // Navigate to the edit profile page +// // Navigator.push( +// // context, +// // MaterialPageRoute(builder: (context) => EditProfilePage()), +// // ); +// // }, +// // child: Text( +// // 'Edit profile information', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ) + +// // Text( +// // // editprofileinformationQGP (I226:2755;226:2371) +// // 'Edit profile information', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// ], +// ), +// ), +// Container( +// // component12LA3 (226:2756) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 0 * fem, 13 * fem), +// width: double.infinity, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // linemedianotification3line4Lw (I226:2756;226:2370) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// width: 24 * fem, +// height: 24 * fem, +// child: Image.asset( +// 'assets/images/user_profile/line-media-notification-3-line.png', +// width: 24 * fem, +// height: 24 * fem, +// ), +// ), +// Container( +// // editprofileinformationyTu (I226:2756;226:2371) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 161 * fem, 0 * fem), +// child: Text( +// 'Notifications', +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// //color: const Color(0xff000000), +// color: +// Theme.of(context).colorScheme.primary, +// ), +// ), +// ), +// Text( +// // englishea3 (I226:2756;226:2372) +// 'ON', +// textAlign: TextAlign.right, +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// color: const Color(0xff4ecb81), +// ), +// ), +// ], +// ), +// ), +// Container( +// // component13P1q (226:2757) +// padding: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 212 * fem, 0 * fem), +// width: double.infinity, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // autogroupoclv7iX (9njg4V6oyoBkeHR9keocLV) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// width: 24 * fem, +// height: 24 * fem, +// child: Image.asset( +// 'assets/images/user_profile/auto-group-oclv.png', +// width: 24 * fem, +// height: 24 * fem, +// ), +// ), +// Text( +// // editprofileinformation2qV (I226:2757;226:2371) +// 'Security', +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// //color: const Color(0xff000000), +// color: Theme.of(context).colorScheme.primary, +// ), +// ), +// ], +// ), +// ), +// ], +// ), +// ), +// Container( +// // group69ZaX (226:2730) +// margin: +// EdgeInsets.fromLTRB(0 * fem, 0 * fem, 4 * fem, 0 * fem), +// padding: EdgeInsets.fromLTRB( +// 16 * fem, 14 * fem, 24 * fem, 11 * fem), +// width: 342 * fem, +// decoration: BoxDecoration( +// //color: const Color(0xffffffff), +// color: Theme.of(context).colorScheme.tertiary, +// borderRadius: BorderRadius.circular(8 * fem), +// boxShadow: [ +// BoxShadow( +// color: const Color(0x3f000000), +// offset: Offset(0 * fem, 1 * fem), +// blurRadius: 2 * fem, +// ), +// ], +// ), +// child: Column( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // component113Eo (226:2732) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 0 * fem, 11 * fem), +// padding: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 167 * fem, 0 * fem), +// width: double.infinity, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // lineusercontactslineXvf (I226:2732;226:2370) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// width: 24 * fem, +// height: 24 * fem, +// child: Image.asset( +// 'assets/images/user_profile/line-user-contacts-line.png', +// width: 24 * fem, +// height: 24 * fem, +// ), +// ), +// Text( +// // editprofileinformationrT9 (I226:2732;226:2371) +// 'Help & Support', +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// //color: const Color(0xff000000), +// color: Theme.of(context).colorScheme.primary, +// ), +// ), +// ], +// ), +// ), +// Container( +// // component12PT5 (226:2733) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 0 * fem, 13 * fem), +// padding: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 195 * fem, 0 * fem), +// width: double.infinity, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // linecommunicationchatquoteline (I226:2733;226:2370) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// width: 24 * fem, +// height: 24 * fem, +// child: Image.asset( +// 'assets/images/user_profile/line-communication-chat-quote-line.png', +// width: 24 * fem, +// height: 24 * fem, +// ), +// ), +// Text( +// // editprofileinformationq4B (I226:2733;226:2371) +// 'Contact us', +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// //color: const Color(0xff000000), +// color: Theme.of(context).colorScheme.primary, +// ), +// ), +// ], +// ), +// ), +// Container( +// // component13Zks (226:2734) +// padding: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 176 * fem, 0 * fem), +// width: double.infinity, +// child: Row( +// crossAxisAlignment: CrossAxisAlignment.center, +// children: [ +// Container( +// // linesystemlock2lineuZq (I226:2734;226:2370) +// margin: EdgeInsets.fromLTRB( +// 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// width: 24 * fem, +// height: 24 * fem, +// child: Image.asset( +// 'assets/images/user_profile/line-system-lock-2-line.png', +// width: 24 * fem, +// height: 24 * fem, +// ), +// ), +// Text( +// // editprofileinformationo9R (I226:2734;226:2371) +// 'Privacy policy', +// style: GoogleFonts.roboto( +// fontSize: 14 * ffem, +// fontWeight: FontWeight.w400, +// height: 1.4285714286 * ffem / fem, +// letterSpacing: 0.25 * fem, +// //color: const Color(0xff000000), +// color: Theme.of(context).colorScheme.primary, +// ), +// ), +// ], +// ), +// ), +// ], +// ), +// ), +// ], +// ), +// ), +// // Container( +// // // menu1vzj (226:2663) +// // width: 428 * fem, +// // height: 115 * fem, +// // child: Stack( +// // children: [ +// // Positioned( +// // // floatbtngDD (I226:2663;405:7322) +// // left: 155 * fem, +// // top: 0 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 64 * fem, +// // height: 64 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/float-btn-5hq.png', +// // width: 64 * fem, +// // height: 64 * fem, +// // ), +// // ), +// // ), +// // ), +// // Positioned( +// // // bgaJb (I226:2663;405:7324) +// // left: 0 * fem, +// // top: 40 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 375 * fem, +// // height: 75 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/bg-ysV.png', +// // width: 375 * fem, +// // height: 75 * fem, +// // ), +// // ), +// // ), +// // ), +// // Positioned( +// // // scansvgrepocomu5y (226:2704) +// // left: 167 * fem, +// // top: 14 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 40 * fem, +// // height: 40 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/scansvgrepocom-N6T.png', +// // width: 40 * fem, +// // height: 40 * fem, +// // ), +// // ), +// // ), +// // ), +// // ], +// // ), +// // ), +// ], +// ), +// ), +// ); +// } +// } + + +// // import 'dart:ui'; + +// // import 'package:TeaHub/editor_page/presentation/edit_profile_page/edit_profile_page.dart'; +// // import 'package:flutter/material.dart'; +// // import 'package:google_fonts/google_fonts.dart'; + +// // class MyCustomScrollBehavior extends MaterialScrollBehavior { +// // @override +// // Set get dragDevices => { +// // PointerDeviceKind.touch, +// // PointerDeviceKind.mouse, +// // }; +// // } + +// // class UserProfile extends StatelessWidget { +// // const UserProfile({Key? key}); +// // @override +// // Widget build(BuildContext context) { +// // double baseWidth = 375; +// // double fem = MediaQuery.of(context).size.width / baseWidth; +// // double ffem = fem * 0.97; +// // return Container( +// // width: double.infinity, +// // child: Container( +// // // userprofilegyM (226:2601) +// // width: double.infinity, +// // decoration: BoxDecoration( +// // color: Theme.of(context).colorScheme.background, +// // ), +// // child: Column( +// // crossAxisAlignment: CrossAxisAlignment.start, +// // children: [ +// // Container( +// // // autogroupqvxhcs1 (9njecn1HncthMNQkxpQVxh) +// // width: 390 * fem, +// // height: 355 * fem, +// // child: Stack( +// // children: [ +// // Positioned( +// // // rectangle51jgj (226:2630) +// // left: 0 * fem, +// // top: 0 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 380 * fem, +// // height: 263 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/rectangle-51.png', +// // width: 390 * fem, +// // height: 263 * fem, +// // ), +// // ), +// // ), +// // ), +// // // Positioned( +// // // // toprWT (226:2631) +// // // left: 24 * fem, +// // // top: 69 * fem, +// // // child: Align( +// // // child: SizedBox( +// // // width: 350 * fem, +// // // height: 24 * fem, +// // // child: Image.asset( +// // // 'assets/images/user_profile/top.png', +// // // width: 350 * fem, +// // // height: 24 * fem, +// // // ), +// // // ), +// // // ), +// // // ), +// // Positioned( +// // // group71AJB (226:2650) +// // left: 84.5 * fem, +// // top: 171 * fem, +// // child: Container( +// // width: 221 * fem, +// // height: 184 * fem, +// // child: Column( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // avatartEB (226:2651) +// // margin: EdgeInsets.fromLTRB( +// // 47.5 * fem, 0 * fem, 46.5 * fem, 0 * fem), +// // width: double.infinity, +// // height: 130 * fem, +// // child: Stack( +// // children: [ +// // Positioned( +// // // rectangle6RV1 (I226:2652;218:102701) +// // left: 0 * fem, +// // top: 0 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 120 * fem, +// // height: 120 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/rectangle-6.png', +// // fit: BoxFit.cover, +// // ), +// // ), +// // ), +// // ), +// // Positioned( +// // // group627cj (226:2653) +// // left: 81 * fem, +// // top: 84 * fem, +// // child: Align( +// // child: SizedBox( +// // width: 46 * fem, +// // height: 46 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/group-62.png', +// // width: 46 * fem, +// // height: 46 * fem, +// // ), +// // ), +// // ), +// // ), +// // ], +// // ), +// // ), +// // Container( +// // // vihangasupasanzwR (226:2656) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 1 * fem, 6 * fem), +// // child: Text( +// // 'Vihanga Supasan', +// // textAlign: TextAlign.center, +// // style: GoogleFonts.poppins( +// // fontSize: 22 * ffem, +// // fontWeight: FontWeight.w600, +// // height: 1.2727272727 * ffem / fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ), +// // Text( +// // // vs2001gmailcom0772026018JSK (226:2657) +// // 'vs2001@gmail.com | 0772026018', +// // textAlign: TextAlign.center, +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ], +// // ), +// // ), +// // ), +// // ], +// // ), +// // ), +// // Container( +// // // autogroupa6b7pQf (9njfGg5ouQpJKDWi1Pa6b7) +// // padding: +// // EdgeInsets.fromLTRB(20 * fem, 45 * fem, 9 * fem, 10 * fem), +// // width: double.infinity, +// // child: Column( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // group70M9h (226:2753) +// // margin: EdgeInsets.fromLTRB( +// // 4 * fem, 0 * fem, 0 * fem, 45 * fem), +// // padding: EdgeInsets.fromLTRB( +// // 16 * fem, 14 * fem, 24 * fem, 11 * fem), +// // width: 342 * fem, +// // decoration: BoxDecoration( +// // //color: const Color(0xffffffff), +// // color: Theme.of(context).colorScheme.tertiary, +// // borderRadius: BorderRadius.circular(8 * fem), +// // boxShadow: [ +// // BoxShadow( +// // color: const Color(0x3f000000), +// // offset: Offset(0 * fem, 1 * fem), +// // blurRadius: 2 * fem, +// // ), +// // ], +// // ), +// // child: Column( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // component11zCf (226:2755) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 0 * fem, 11 * fem), +// // padding: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 117 * fem, 0 * fem), +// // width: double.infinity, +// // child: Row( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // linebusinessprofilelinehMy (I226:2755;226:2370) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// // width: 24 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/line-business-profile-line.png', +// // width: 24 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // GestureDetector( +// // onTap: () { +// // // Navigate to the edit profile page +// // Navigator.push( +// // context, +// // MaterialPageRoute( +// // builder: (context) => +// // EditProfilePage()), +// // ); +// // }, +// // child: Text( +// // 'Edit profile information', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // color: +// // Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ) + +// // // Text( +// // // // editprofileinformationQGP (I226:2755;226:2371) +// // // 'Edit profile information', +// // // style: GoogleFonts.roboto( +// // // fontSize: 14 * ffem, +// // // fontWeight: FontWeight.w400, +// // // height: 1.4285714286 * ffem / fem, +// // // letterSpacing: 0.25 * fem, +// // // //color: const Color(0xff000000), +// // // color: Theme.of(context).colorScheme.primary, +// // // ), +// // // ), +// // ], +// // ), +// // ), +// // Container( +// // // component12LA3 (226:2756) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 0 * fem, 13 * fem), +// // width: double.infinity, +// // child: Row( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // linemedianotification3line4Lw (I226:2756;226:2370) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// // width: 24 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/line-media-notification-3-line.png', +// // width: 24 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // Container( +// // // editprofileinformationyTu (I226:2756;226:2371) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 161 * fem, 0 * fem), +// // child: Text( +// // 'Notifications', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: +// // Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ), +// // Text( +// // // englishea3 (I226:2756;226:2372) +// // 'ON', +// // textAlign: TextAlign.right, +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // color: const Color(0xff4ecb81), +// // ), +// // ), +// // ], +// // ), +// // ), +// // Container( +// // // component13P1q (226:2757) +// // padding: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 212 * fem, 0 * fem), +// // width: double.infinity, +// // child: Row( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // autogroupoclv7iX (9njg4V6oyoBkeHR9keocLV) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// // width: 24 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/auto-group-oclv.png', +// // width: 24 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // Text( +// // // editprofileinformation2qV (I226:2757;226:2371) +// // 'Security', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ], +// // ), +// // ), +// // ], +// // ), +// // ), +// // Container( +// // // group69ZaX (226:2730) +// // margin: +// // EdgeInsets.fromLTRB(0 * fem, 0 * fem, 4 * fem, 0 * fem), +// // padding: EdgeInsets.fromLTRB( +// // 16 * fem, 14 * fem, 24 * fem, 11 * fem), +// // width: 342 * fem, +// // decoration: BoxDecoration( +// // //color: const Color(0xffffffff), +// // color: Theme.of(context).colorScheme.tertiary, +// // borderRadius: BorderRadius.circular(8 * fem), +// // boxShadow: [ +// // BoxShadow( +// // color: const Color(0x3f000000), +// // offset: Offset(0 * fem, 1 * fem), +// // blurRadius: 2 * fem, +// // ), +// // ], +// // ), +// // child: Column( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // component113Eo (226:2732) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 0 * fem, 11 * fem), +// // padding: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 167 * fem, 0 * fem), +// // width: double.infinity, +// // child: Row( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // lineusercontactslineXvf (I226:2732;226:2370) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// // width: 24 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/line-user-contacts-line.png', +// // width: 24 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // Text( +// // // editprofileinformationrT9 (I226:2732;226:2371) +// // 'Help & Support', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ], +// // ), +// // ), +// // Container( +// // // component12PT5 (226:2733) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 0 * fem, 13 * fem), +// // padding: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 195 * fem, 0 * fem), +// // width: double.infinity, +// // child: Row( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // linecommunicationchatquoteline (I226:2733;226:2370) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// // width: 24 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/line-communication-chat-quote-line.png', +// // width: 24 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // Text( +// // // editprofileinformationq4B (I226:2733;226:2371) +// // 'Contact us', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ], +// // ), +// // ), +// // Container( +// // // component13Zks (226:2734) +// // padding: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 176 * fem, 0 * fem), +// // width: double.infinity, +// // child: Row( +// // crossAxisAlignment: CrossAxisAlignment.center, +// // children: [ +// // Container( +// // // linesystemlock2lineuZq (I226:2734;226:2370) +// // margin: EdgeInsets.fromLTRB( +// // 0 * fem, 0 * fem, 13 * fem, 0 * fem), +// // width: 24 * fem, +// // height: 24 * fem, +// // child: Image.asset( +// // 'assets/images/user_profile/line-system-lock-2-line.png', +// // width: 24 * fem, +// // height: 24 * fem, +// // ), +// // ), +// // Text( +// // // editprofileinformationo9R (I226:2734;226:2371) +// // 'Privacy policy', +// // style: GoogleFonts.roboto( +// // fontSize: 14 * ffem, +// // fontWeight: FontWeight.w400, +// // height: 1.4285714286 * ffem / fem, +// // letterSpacing: 0.25 * fem, +// // //color: const Color(0xff000000), +// // color: Theme.of(context).colorScheme.primary, +// // ), +// // ), +// // ], +// // ), +// // ), +// // ], +// // ), +// // ), +// // ], +// // ), +// // ), +// // // Container( +// // // // menu1vzj (226:2663) +// // // width: 428 * fem, +// // // height: 115 * fem, +// // // child: Stack( +// // // children: [ +// // // Positioned( +// // // // floatbtngDD (I226:2663;405:7322) +// // // left: 155 * fem, +// // // top: 0 * fem, +// // // child: Align( +// // // child: SizedBox( +// // // width: 64 * fem, +// // // height: 64 * fem, +// // // child: Image.asset( +// // // 'assets/images/user_profile/float-btn-5hq.png', +// // // width: 64 * fem, +// // // height: 64 * fem, +// // // ), +// // // ), +// // // ), +// // // ), +// // // Positioned( +// // // // bgaJb (I226:2663;405:7324) +// // // left: 0 * fem, +// // // top: 40 * fem, +// // // child: Align( +// // // child: SizedBox( +// // // width: 375 * fem, +// // // height: 75 * fem, +// // // child: Image.asset( +// // // 'assets/images/user_profile/bg-ysV.png', +// // // width: 375 * fem, +// // // height: 75 * fem, +// // // ), +// // // ), +// // // ), +// // // ), +// // // Positioned( +// // // // scansvgrepocomu5y (226:2704) +// // // left: 167 * fem, +// // // top: 14 * fem, +// // // child: Align( +// // // child: SizedBox( +// // // width: 40 * fem, +// // // height: 40 * fem, +// // // child: Image.asset( +// // // 'assets/images/user_profile/scansvgrepocom-N6T.png', +// // // width: 40 * fem, +// // // height: 40 * fem, +// // // ), +// // // ), +// // // ), +// // // ), +// // // ], +// // // ), +// // // ), +// // ], +// // ), +// // ), +// // ); +// // } +// // } diff --git a/.Connected_Version - TeaHub/lib/weather_widget/home.dart b/.Connected_Version - TeaHub/lib/weather_widget/home.dart new file mode 100644 index 0000000..e98f630 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/weather_widget/home.dart @@ -0,0 +1,27 @@ +import 'package:TeaHub/weather_widget/weather_page.dart'; +import 'package:flutter/material.dart'; + +//import 'weather_page.dart'; // Assuming WeatherPage is another widget you want to display + +class Home extends StatelessWidget { + const Home({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Column( + children: [ + SizedBox(height: 30), + WeatherPage(), + //WPage(), + //WeatherDisplay(), // Corrected the syntax to specify body for Scaffold + ], + ), + ), + + //SizedBox(height: 30), + //WeatherPage(), // Corrected the syntax to specify body for Scaffold + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/weather_widget/weather_model.dart b/.Connected_Version - TeaHub/lib/weather_widget/weather_model.dart new file mode 100644 index 0000000..6ebedc2 --- /dev/null +++ b/.Connected_Version - TeaHub/lib/weather_widget/weather_model.dart @@ -0,0 +1,22 @@ +class Weather { + final String cityName; + final String country; + final double temperature; + final String mainCondition; + + Weather({ + required this.cityName, + required this.country, + required this.temperature, + required this.mainCondition, + }); + + factory Weather.fromJson(Map json) { + return Weather( + cityName: json['name'], + country: json['sys']['country'], + temperature: json['main']['temp'].toDouble(), + mainCondition: json['weather'][0]['main'], + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/weather_widget/weather_page.dart b/.Connected_Version - TeaHub/lib/weather_widget/weather_page.dart new file mode 100644 index 0000000..9fee2aa --- /dev/null +++ b/.Connected_Version - TeaHub/lib/weather_widget/weather_page.dart @@ -0,0 +1,299 @@ +import 'package:TeaHub/weather_widget/weather_model.dart'; +import 'package:TeaHub/weather_widget/weather_service.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:lottie/lottie.dart'; + +class WeatherDisplay extends StatefulWidget { + final Weather? weather; + + WeatherDisplay({this.weather}); + + @override + State createState() => _WeatherDisplayState(); +} + +class _WeatherDisplayState extends State { + // Weather animation + String getWeatherAnimation(String? mainCondition) { + DateTime now = DateTime.now(); + if (mainCondition == null) { + return 'weather_animation/loading.json'; // Default weather condition + } + + switch (mainCondition.toLowerCase()) { + case 'clear': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'clear') { + return 'weather_animation/clear_night.json'; + } else { + return 'weather_animation/clear_day.json'; + } + + case 'clouds': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'clouds') { + return 'weather_animation/cloudy_night.json'; + } else { + return 'weather_animation/cloudy_day.json'; + } + + case 'mist': + case 'smoke': + case 'fog': + case 'haze': + case 'dust': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'mist') { + return 'weather_animation/mist_night.json'; + } else { + return 'weather_animation/mist_day.json'; + } + + case 'rain': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'rain') { + return 'weather_animation/rain_night.json'; + } else { + return 'weather_animation/rain_day.json'; + } + + case 'drizzle': + case 'shower rain': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'drizzle') { + return 'weather_animation/partly_rain_night.json'; + } else { + return 'weather_animation/partly_rain_day.json'; + } + + case 'thunderstorm': + if (isHourInRange(now) && + mainCondition.toLowerCase() == 'thunderstorm') { + return 'weather_animation/thunder_strom_night.json'; + } else { + return 'weather_animation/thunder_strom_day.json'; + } + + default: + if (isHourInRange(now)) { + return 'weather_animation/clear_night.json'; + } else { + return 'weather_animation/clear_day.json'; + } + } + } + + // Get the current day of the week + String getDayOfWeek() { + DateTime now = DateTime.now(); + return DateFormat('EEEE') + .format(now); // 'EEEE' will return the full name of the day + } + + bool isHourInRange(DateTime dateTime) { + int hour = dateTime.hour; + return (hour >= 18 && hour <= 24) || (hour >= 0 && hour <= 4); + } + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(15), // Set border radius here + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 4, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + margin: const EdgeInsets.symmetric( + vertical: 0, + horizontal: 20, + ), + height: 150, + width: MediaQuery.of(context).size.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB( + 20, 10, 20, 0), // Left, Top, Right, Bottom + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Weather condition + Text( + widget.weather?.mainCondition ?? "Weather...", + style: const TextStyle( + fontSize: 16, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + // Weather animation + Lottie.asset( + getWeatherAnimation(widget.weather?.mainCondition), + height: 110), + ], + ), + ), + ), + Container( + margin: const EdgeInsets.only( + top: 10, bottom: 10), // Adjust margins as needed + child: ClipRRect( + borderRadius: + BorderRadius.circular(20.0), // Adjust border radius as needed + child: VerticalDivider( + width: 4.0, + thickness: 4.0, // Adjust thickness as needed + color: Theme.of(context) + .colorScheme + .background, // Change color as needed + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB( + 20, 10, 20, 0), // Left, Top, Right, Bottom + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // City name, country + Text( + widget.weather != null + ? '${widget.weather!.cityName}, ${widget.weather!.country}' + : " Pleace Turn \n On Location", + style: const TextStyle( + fontSize: 15.5, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + // Day + Text( + widget.weather != null ? '${getDayOfWeek()}' : "", + //'${getDayOfWeek()}', + style: const TextStyle( + fontSize: 15.5, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + // Temperature + Text( + widget.weather != null + ? '${widget.weather?.temperature.round()}°C' + : "", + //'${weather?.temperature.round()}°C', + style: const TextStyle( + fontSize: 30, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + Text( + widget.weather != null + ? '${((widget.weather!.temperature * 9 / 5) + 32).round()}°F' + : "", + style: const TextStyle( + fontSize: 20, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} + +class WeatherButton extends StatelessWidget { + final Weather? weather; + + WeatherButton({this.weather}); + + @override + Widget build(BuildContext context) { + bool locationPermission = + WeatherService("4a994c4e93b8bbb69680bd5467d568c0").locationPermission; + + return Container( + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(15), // Set border radius here + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 4, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + margin: const EdgeInsets.symmetric( + vertical: 0, + horizontal: 20, + ), + height: 150, + width: MediaQuery.of(context).size.width, + ); + } +} + +class WeatherPage extends StatelessWidget { + final WeatherService _weatherService = + WeatherService("4a994c4e93b8bbb69680bd5467d568c0"); + + bool locationPermission = + WeatherService("4a994c4e93b8bbb69680bd5467d568c0").locationPermission; + + // Fetch weather + Future _fetchWeather() async { + try { + String cityName = await _weatherService.getCurrentCity(); + return await _weatherService.getWeather(cityName); + } catch (e) { + print(e); + return null; + } + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _fetchWeather(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Container( + child: Stack( + children: [ + WeatherButton(), + const Positioned.fill( + child: Center( + child: CircularProgressIndicator(), + ), + ), + ], + ), + ); + } else if (locationPermission == true) { + return WeatherDisplay(weather: snapshot.data); + } else if (locationPermission == false) { + return Container( + child: Stack( + children: [ + WeatherButton(), + ], + ), + ); + } else if (snapshot.hasError) { + return Center(child: Text('Error fetching weather 1')); + } else { + return WeatherDisplay(weather: snapshot.data); + } + }, + ); + } +} diff --git a/.Connected_Version - TeaHub/lib/weather_widget/weather_service.dart b/.Connected_Version - TeaHub/lib/weather_widget/weather_service.dart new file mode 100644 index 0000000..cf8866f --- /dev/null +++ b/.Connected_Version - TeaHub/lib/weather_widget/weather_service.dart @@ -0,0 +1,53 @@ +import 'dart:convert'; +import 'package:TeaHub/weather_widget/weather_model.dart'; +import 'package:geocoding/geocoding.dart'; +import 'package:geolocator/geolocator.dart'; + +import 'package:http/http.dart' as http; + +class WeatherService { + static const BASE_URL = 'http://api.openweathermap.org/data/2.5/weather'; + final String apikey; + + bool locationPermission = true; // Boolean variable to track permission + + WeatherService(this.apikey); + + Future getWeather(String cityName) async { + final response = await http + .get(Uri.parse('$BASE_URL?q=$cityName&appid=$apikey&units=metric')); + if (response.statusCode == 200) { + return Weather.fromJson(jsonDecode(response.body)); + } else { + throw Exception('Failed to load weather data'); + } + } + + Future getCurrentCity() async { + // Check if permission has been granted + LocationPermission permission = await Geolocator.checkPermission(); + // permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + locationPermission = false; + } else { + locationPermission = true; + } + + // If permission is granted, fetch the current location + if (locationPermission) { + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + + // convert the location into a list of placemark objects + List placemarks = + await placemarkFromCoordinates(position.latitude, position.longitude); + + // extract the city name from the first placemark + String? city = placemarks[0].locality; + + return city ?? ""; + } else { + throw Exception('Location permission not granted'); + } + } +} diff --git a/README.md b/README.md index 420c714..e850755 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,43 @@ -# teahub - -A new Flutter project. - -## Getting Started - -This project is a starting point for a Flutter application. - -A few resources to get you started if this is your first Flutter project: - -- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) -- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) - -For help getting started with Flutter development, view the -[online documentation](https://docs.flutter.dev/), which offers tutorials, -samples, guidance on mobile development, and a full API reference. +# TeaHub Mobile App + +This README file provides an overview of the frontend branch for the TeaHub mobile application developed using Flutter. + +## Overview + +The TeaHub mobile app is designed to provide users with disease detection for tea plants, treatment recommendations, a conversational chatbot, information about various types of tea, including descriptions, brewing tips, and health benefits. The app aims to be a comprehensive guide for tea enthusiasts and those looking to explore the world of tea. + +## Features + +TeaHub offers a wide range of features to enhance your tea experience: + +- **Introduction Page**: Get introduced to the TeaHub app and its features. +- **Disease Description UI**: Learn about various diseases that affect tea plants and their symptoms. +- **Disease Treatment UI**: Explore treatment options for different tea plant diseases. +- **Chatbot UI**: Have a conversation with our chatbot to get answers to your tea-related questions. +- **Tea Description Page**: Discover detailed descriptions of different types of tea, including brewing tips and health benefits. +- **Weather Widget**: Stay informed about weather conditions that may affect tea cultivation. +- **Home Page**: Navigate to different sections of the app with ease. +- **Editor Page**: Edit and customize your TeaHub profile. +- **Snap Tips**: Receive helpful tips and tricks related to Tea. +- **User Profile**: Manage your profile and preferences. +- **Four Splash Screens**: Enjoy visually appealing splash screens when launching the app. + +## Setup + +To set up the TeaHub mobile app frontend branch: + +1. Clone the repository. +2. Ensure you have Flutter installed on your development machine. +3. Navigate to the `frontend` branch of the repository. +4. Run `flutter pub get` to install dependencies. +5. Launch the app on an emulator or physical device using `flutter run`. + +## Technology Stack + +TeaHub's frontend is built using the following technologies and frameworks: +- Flutter +- Dart + +## Demo Video + +Watch a demo of TeaHub in action: [TeaHub Demo](https://drive.google.com/file/d/1PEGISSPS_rd8GZkrcsIA9mOYqnYTLBx5/view?usp=drive_link) diff --git a/analysis_options.yaml b/analysis_options.yaml index 0d29021..d4e0f0c 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -1,28 +1,28 @@ -# This file configures the analyzer, which statically analyzes Dart code to -# check for errors, warnings, and lints. -# -# The issues identified by the analyzer are surfaced in the UI of Dart-enabled -# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be -# invoked from the command line by running `flutter analyze`. - -# The following line activates a set of recommended lints for Flutter apps, -# packages, and plugins designed to encourage good coding practices. -include: package:flutter_lints/flutter.yaml - -linter: - # The lint rules applied to this project can be customized in the - # section below to disable rules from the `package:flutter_lints/flutter.yaml` - # included above or to enable additional rules. A list of all available lints - # and their documentation is published at https://dart.dev/lints. - # - # Instead of disabling a lint rule for the entire project in the - # section below, it can also be suppressed for a single line of code - # or a specific dart file by using the `// ignore: name_of_lint` and - # `// ignore_for_file: name_of_lint` syntax on the line or in the file - # producing the lint. - rules: - # avoid_print: false # Uncomment to disable the `avoid_print` rule - # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule - -# Additional information about this file can be found at -# https://dart.dev/guides/language/analysis-options +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/app/build.gradle b/android/app/build.gradle index cab4ec8..267a2a7 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -23,17 +23,17 @@ if (flutterVersionName == null) { } android { - namespace "com.example.teahub" + namespace "com.example.chatbotui" compileSdkVersion flutter.compileSdkVersion ndkVersion flutter.ndkVersion compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = '17' + jvmTarget = '1.8' } sourceSets { @@ -41,13 +41,11 @@ android { } defaultConfig { - minSdkVersion 21 - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.teahub" + applicationId "com.example.chatbotui" // 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 + minSdkVersion flutter.minSdkVersion targetSdkVersion flutter.targetSdkVersion versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml index 399f698..8ffe024 100644 --- a/android/app/src/debug/AndroidManifest.xml +++ b/android/app/src/debug/AndroidManifest.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 514026c..198d1a0 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,58 +1,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..c4cb0da --- /dev/null +++ b/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,89 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + try { + flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.auth.FlutterFirebaseAuthPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin firebase_auth, io.flutter.plugins.firebase.auth.FlutterFirebaseAuthPlugin", e); + } + try { + flutterEngine.getPlugins().add(new io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin firebase_core, io.flutter.plugins.firebase.core.FlutterFirebaseCorePlugin", e); + } + try { + flutterEngine.getPlugins().add(new app.meedu.flutter_facebook_auth.FlutterFacebookAuthPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin flutter_facebook_auth, app.meedu.flutter_facebook_auth.FlutterFacebookAuthPlugin", e); + } + try { + flutterEngine.getPlugins().add(new net.jonhanson.flutter_native_splash.FlutterNativeSplashPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin flutter_native_splash, net.jonhanson.flutter_native_splash.FlutterNativeSplashPlugin", e); + } + try { + flutterEngine.getPlugins().add(new io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin flutter_plugin_android_lifecycle, io.flutter.plugins.flutter_plugin_android_lifecycle.FlutterAndroidLifecyclePlugin", e); + } + try { + flutterEngine.getPlugins().add(new com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin flutter_secure_storage, com.it_nomads.fluttersecurestorage.FlutterSecureStoragePlugin", e); + } + try { + flutterEngine.getPlugins().add(new com.baseflow.geocoding.GeocodingPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin geocoding_android, com.baseflow.geocoding.GeocodingPlugin", e); + } + try { + flutterEngine.getPlugins().add(new com.baseflow.geolocator.GeolocatorPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin geolocator_android, com.baseflow.geolocator.GeolocatorPlugin", e); + } + try { + flutterEngine.getPlugins().add(new io.flutter.plugins.googlesignin.GoogleSignInPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin google_sign_in_android, io.flutter.plugins.googlesignin.GoogleSignInPlugin", e); + } + try { + flutterEngine.getPlugins().add(new vn.hunghd.flutter.plugins.imagecropper.ImageCropperPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin image_cropper, vn.hunghd.flutter.plugins.imagecropper.ImageCropperPlugin", e); + } + try { + flutterEngine.getPlugins().add(new io.flutter.plugins.imagepicker.ImagePickerPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin image_picker_android, io.flutter.plugins.imagepicker.ImagePickerPlugin", e); + } + try { + flutterEngine.getPlugins().add(new io.flutter.plugins.pathprovider.PathProviderPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin path_provider_android, io.flutter.plugins.pathprovider.PathProviderPlugin", e); + } + try { + flutterEngine.getPlugins().add(new com.baseflow.permissionhandler.PermissionHandlerPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin permission_handler_android, com.baseflow.permissionhandler.PermissionHandlerPlugin", e); + } + try { + flutterEngine.getPlugins().add(new com.tekartik.sqflite.SqflitePlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin sqflite, com.tekartik.sqflite.SqflitePlugin", e); + } + } +} diff --git a/android/app/src/main/kotlin/com/example/chatbotui/MainActivity.kt b/android/app/src/main/kotlin/com/example/chatbotui/MainActivity.kt new file mode 100644 index 0000000..3aa3550 --- /dev/null +++ b/android/app/src/main/kotlin/com/example/chatbotui/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.chatbotui + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/android/app/src/main/res/drawable-hdpi/splash.png b/android/app/src/main/res/drawable-hdpi/splash.png new file mode 100644 index 0000000..344c485 Binary files /dev/null and b/android/app/src/main/res/drawable-hdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-mdpi/splash.png b/android/app/src/main/res/drawable-mdpi/splash.png new file mode 100644 index 0000000..403bd0a Binary files /dev/null and b/android/app/src/main/res/drawable-mdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-v21/background.png b/android/app/src/main/res/drawable-v21/background.png new file mode 100644 index 0000000..e37ebe3 Binary files /dev/null and b/android/app/src/main/res/drawable-v21/background.png differ diff --git a/android/app/src/main/res/drawable-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml index f74085f..1cb7aa2 100644 --- a/android/app/src/main/res/drawable-v21/launch_background.xml +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -1,12 +1,12 @@ - - - - - - - - + + + + + + + + diff --git a/android/app/src/main/res/drawable-xhdpi/splash.png b/android/app/src/main/res/drawable-xhdpi/splash.png new file mode 100644 index 0000000..81b08c7 Binary files /dev/null and b/android/app/src/main/res/drawable-xhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-xxhdpi/splash.png b/android/app/src/main/res/drawable-xxhdpi/splash.png new file mode 100644 index 0000000..f371838 Binary files /dev/null and b/android/app/src/main/res/drawable-xxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable-xxxhdpi/splash.png b/android/app/src/main/res/drawable-xxxhdpi/splash.png new file mode 100644 index 0000000..12f6ac7 Binary files /dev/null and b/android/app/src/main/res/drawable-xxxhdpi/splash.png differ diff --git a/android/app/src/main/res/drawable/background.png b/android/app/src/main/res/drawable/background.png new file mode 100644 index 0000000..e37ebe3 Binary files /dev/null and b/android/app/src/main/res/drawable/background.png differ diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml index 304732f..8403758 100644 --- a/android/app/src/main/res/drawable/launch_background.xml +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -1,12 +1,12 @@ - - - - - - - - + + + + + + + + diff --git a/android/app/src/main/res/mipmap-hdpi/launcher_icon.png b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png new file mode 100644 index 0000000..c2b1864 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/launcher_icon.png b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png new file mode 100644 index 0000000..1ff62c1 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png new file mode 100644 index 0000000..e6fa526 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png new file mode 100644 index 0000000..5dd84e7 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png new file mode 100644 index 0000000..d743943 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/launcher_icon.png differ diff --git a/android/app/src/main/res/values-night-v31/styles.xml b/android/app/src/main/res/values-night-v31/styles.xml new file mode 100644 index 0000000..a3653cb --- /dev/null +++ b/android/app/src/main/res/values-night-v31/styles.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml index 06952be..360a160 100644 --- a/android/app/src/main/res/values-night/styles.xml +++ b/android/app/src/main/res/values-night/styles.xml @@ -1,18 +1,18 @@ - - - - - - - + + + + + + + diff --git a/android/app/src/main/res/values-v31/styles.xml b/android/app/src/main/res/values-v31/styles.xml new file mode 100644 index 0000000..d0a68e9 --- /dev/null +++ b/android/app/src/main/res/values-v31/styles.xml @@ -0,0 +1,19 @@ + + + + + + + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index cb1ef88..5fac679 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -1,18 +1,18 @@ - - - - - - - + + + + + + + diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml index 399f698..8ffe024 100644 --- a/android/app/src/profile/AndroidManifest.xml +++ b/android/app/src/profile/AndroidManifest.xml @@ -1,7 +1,7 @@ - - - - + + + + diff --git a/android/build.gradle b/android/build.gradle index e83fb5d..7ff1933 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,30 +1,30 @@ -buildscript { - ext.kotlin_version = '1.7.10' - repositories { - google() - mavenCentral() - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -allprojects { - repositories { - google() - mavenCentral() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -tasks.register("clean", Delete) { - delete rootProject.buildDir -} +buildscript { + ext.kotlin_version = '1.7.10' + repositories { + google() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/chatbotui_android.iml b/android/chatbotui_android.iml new file mode 100644 index 0000000..5e74ee6 --- /dev/null +++ b/android/chatbotui_android.iml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/android/gradle.properties b/android/gradle.properties index 598d13f..a583219 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -android.useAndroidX=true -android.enableJetifier=true +org.gradle.jvmargs=-Xmx4G +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..13372ae Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c472b9..eabb85f 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 0000000..aec9973 --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/local.properties b/android/local.properties new file mode 100644 index 0000000..f28e338 --- /dev/null +++ b/android/local.properties @@ -0,0 +1,5 @@ +sdk.dir=C:\\Users\\Lenovo\\AppData\\Local\\Android\\sdk +flutter.sdk=C:\\src\\flutter +flutter.buildMode=debug +flutter.versionName=1.0.0 +flutter.versionCode=1 \ No newline at end of file diff --git a/android/settings.gradle b/android/settings.gradle index 7cd7128..e646870 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,29 +1,29 @@ -pluginManagement { - def flutterSdkPath = { - def properties = new Properties() - file("local.properties").withInputStream { properties.load(it) } - def flutterSdkPath = properties.getProperty("flutter.sdk") - assert flutterSdkPath != null, "flutter.sdk not set in local.properties" - return flutterSdkPath - } - settings.ext.flutterSdkPath = flutterSdkPath() - - includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") - - repositories { - google() - mavenCentral() - gradlePluginPortal() - } - - plugins { - id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false - } -} - -plugins { - id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version "7.3.0" apply false -} - -include ":app" +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } + + plugins { + id "dev.flutter.flutter-gradle-plugin" version "1.0.0" apply false + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "7.3.0" apply false +} + +include ":app" diff --git a/assets/Analyser2.json b/assets/Analyser2.json new file mode 100644 index 0000000..bbb5733 --- /dev/null +++ b/assets/Analyser2.json @@ -0,0 +1 @@ +{"v":"5.7.4","fr":25,"ip":0,"op":100,"w":500,"h":500,"nm":"icons8-search","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"icons8-search Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.333,0],[0,-11.333],[-11.333,0],[0,11.333]],"o":[[-11.333,0],[0,11.333],[11.333,0],[0,-11.333]],"v":[[0,-20.52],[-20.52,0],[0,20.52],[20.521,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.999998922909,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[252.673,245.238],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":20,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.545,4.827],[0,0],[1.522,-4.914],[3.817,7.24],[0,0],[4.826,-2.546],[0,0],[0,0],[-4.725,-2.136],[-5.63,2.969],[-1.477,6.948]],"o":[[0,0],[1.93,4.637],[-2.472,7.987],[0,0],[-2.545,-4.827],[0,0],[0,0],[2.546,4.828],[6.567,2.706],[5.631,-2.969],[1.521,-4.915]],"v":[[40.136,22.584],[37.401,18.371],[38.132,33.407],[21.062,34.183],[-23.476,-50.286],[-36.377,-54.279],[-44.421,-50.038],[0.293,42.563],[11.527,54.119],[31.243,53.49],[42.901,37.576]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.01568627450980392,0.13333333333333333,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[340.115,415.218],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.895,19.044],[-40.545,-12.55],[-10.093,-15.241],[22.116,6.845],[12.549,-40.546],[-10.56,-18.078]],"o":[[12.55,-40.545],[19.045,5.894],[-8.762,-19.542],[-40.545,-12.55],[-6.846,22.115],[-6.874,-16.937]],"v":[[-64.446,8.323],[32.09,-42.578],[75.533,-8.937],[27.849,-50.623],[-68.687,0.279],[-61.228,63.173]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.440842692057,0.686968395757,0.872369803634,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[247.98,221.165],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-40.714,-12.602],[12.602,-40.714],[40.714,12.602],[-12.602,40.714]],"o":[[40.714,12.602],[-12.601,40.714],[-40.714,-12.602],[12.601,-40.713]],"v":[[22.818,-73.719],[73.719,22.817],[-22.818,73.719],[-73.719,-22.818]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560150086646,0.775497915231,0.918944833793,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[253.012,244.26],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[40.546,12.55],[-12.55,40.546],[-40.546,-12.55],[12.55,-40.545]],"o":[[-40.545,-12.55],[12.549,-40.546],[40.546,12.549],[-12.549,40.546]],"v":[[-22.817,73.719],[-73.718,-22.816],[22.817,-73.719],[73.718,22.818]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[50.989,15.782],[15.782,-50.988],[-50.989,-15.783],[-15.781,50.988]],"o":[[-50.988,-15.782],[-15.782,50.989],[50.988,15.781],[15.782,-50.989]],"v":[[28.521,-92.148],[-92.148,-28.521],[-28.521,92.15],[92.149,28.523]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.06274509803921569,0.37254901960784315,0.7372549019607844,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[253.012,244.26],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":6,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[14.262,7.748],[-1.665,16.145],[-14.262,-7.745],[1.664,-16.145]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.763206392176,0.819719681085,0.881296853458,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[301.791,336.773],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":4,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.711,-5.528],[0,0],[11.672,3.612],[2.97,5.63],[0,0],[-3.218,1.696],[0,0],[-1.697,-3.219],[0,0]],"o":[[0,0],[-3.613,11.673],[-6.144,-1.902],[0,0],[-1.696,-3.218],[0,0],[3.217,-1.697],[0,0],[3.159,5.016]],"v":[[43.815,47.983],[43.815,47.983],[15.659,62.831],[1.777,51.129],[-43.83,-45.115],[-41.167,-53.716],[-20.25,-64.745],[-11.65,-62.083],[41.811,30.534]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.01568627450980392,0.13333333333333333,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[338.865,408.072],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[250,250],"to":[-3.333,0],"ti":[3.333,5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19.8,"s":[230,250],"to":[-3.333,-5],"ti":[-6.667,5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40.392,"s":[230,220],"to":[6.667,-5],"ti":[-6.667,-6.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":59.796,"s":[270,220],"to":[6.667,6.667],"ti":[3.333,-5]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79.2,"s":[270,260],"to":[-3.333,5],"ti":[3.333,1.667]},{"t":99,"s":[250,250]}],"ix":2},"a":{"a":0,"k":[250,250],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":7,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.762,0],[0,-2.761],[-2.762,0],[0,2.761]],"o":[[-2.762,0],[0,2.761],[2.762,0],[0,-2.761]],"v":[[0,-5],[-5,0],[0,5],[5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.999998922909,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[401,160],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.761,0],[0,-2.762],[-2.761,0],[0,2.762]],"o":[[-2.761,0],[0,2.762],[2.761,0],[0,-2.762]],"v":[[0,-5],[-5,0],[0,5],[5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.01568627450980392,0.13333333333333333,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[106,325],"to":[1.667,0],"ti":[-1.667,-1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[116,325],"to":[1.667,1.667],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[116,335],"to":[0,0],"ti":[1.667,1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[116,325],"to":[-1.667,-1.667],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[106,325],"to":[0,0],"ti":[-1.667,0]},{"t":99,"s":[116,325]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[6.903,0],[0,-6.903],[-6.903,0],[0,6.903]],"o":[[-6.903,0],[0,6.903],[6.903,0],[0,-6.903]],"v":[[0,-12.5],[-12.5,0],[0,12.5],[12.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.999998922909,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.5,257.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":4,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.523,0],[0,-5.522],[-5.523,0],[0,5.522]],"o":[[-5.523,0],[0,5.522],[5.523,0],[0,-5.522]],"v":[[0,-10],[-10,0],[0,10],[10,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6039215686274509,0.6901960784313725,0.8313725490196079,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126,425],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":20,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[50]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":79,"s":[100]},{"t":99,"s":[50]}],"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.046,0],[0,-11.046],[-11.046,0],[0,11.046]],"o":[[-11.046,0],[0,11.046],[11.046,0],[0,-11.046]],"v":[[-160,-47.5],[-180,-27.5],[-160,-7.5],[-140,-27.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[5.522,0],[0,-5.522],[-5.522,0],[0,5.522]],"o":[[-5.522,0],[0,5.522],[5.522,0],[0,-5.522]],"v":[[170,27.5],[160,37.5],[170,47.5],[180,37.5]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.40784313725490196,0.5686274509803921,0.8352941176470589,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[236,332.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[90,90]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":60,"s":[90,90]},{"t":79,"s":[100,100]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":6,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.522,0],[0,-5.523],[-5.522,0],[0,5.523]],"o":[[-5.522,0],[0,5.523],[5.522,0],[0,-5.523]],"v":[[0,-10],[-10,0],[0,10],[10,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6039215686274509,0.6901960784313725,0.8313725490196079,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[436,110],"to":[1.667,0],"ti":[-1.667,-1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[446,110],"to":[1.667,1.667],"ti":[1.667,-1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[446,120],"to":[-1.667,1.667],"ti":[1.667,1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[436,120],"to":[-1.667,-1.667],"ti":[-1.667,1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[436,110],"to":[1.667,-1.667],"ti":[-1.667,0]},{"t":99,"s":[446,110]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.046,0],[0,-11.046],[-11.046,0],[0,11.046]],"o":[[-11.046,0],[0,11.046],[11.046,0],[0,-11.046]],"v":[[0,-20],[-20,0],[0,20],[20,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.01568627450980392,0.13333333333333333,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[416,65],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[80,80]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":60,"s":[90,90]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":79,"s":[100,100]},{"t":99,"s":[90,90]}],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[102.173,0],[0,-102.173],[-102.173,0],[0,102.173]],"o":[[-102.173,0],[0,102.173],[102.173,0],[0,-102.173]],"v":[[0,-185],[-185,0],[0,185],[185,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.94691102271,0.946237960516,0.952209831687,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[251,240],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":4,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.762,0],[0,-2.761],[-2.762,0],[0,2.761]],"o":[[-2.762,0],[0,2.761],[2.762,0],[0,-2.761]],"v":[[0,-5],[-5,0],[0,5],[5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.01568627450980392,0.13333333333333333,0.27058823529411763,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[386,55],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":4,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.523,0],[0,-5.523],[-5.523,0],[0,5.523]],"o":[[-5.523,0],[0,5.523],[5.523,0],[0,-5.523]],"v":[[0,-10],[-10,0],[0,10],[10,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.6039215686274509,0.6901960784313725,0.8313725490196079,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[66,135],"to":[1.667,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[76,135],"to":[0,0],"ti":[1.667,1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[66,135],"to":[-1.667,-1.667],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[66,125],"to":[0,0],"ti":[1.667,-1.667]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":79,"s":[66,135],"to":[-1.667,1.667],"ti":[1.667,0]},{"t":99,"s":[56,135]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":4,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":750,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"icons8-search Outlines Comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[250,250,0],"ix":2,"l":2},"a":{"a":0,"k":[250,250,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":500,"h":500,"ip":0,"op":100,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/Teahub.csv b/assets/Teahub.csv new file mode 100644 index 0000000..4fe9379 --- /dev/null +++ b/assets/Teahub.csv @@ -0,0 +1,124 @@ +Question,Answer,,,,,, +What is the best soil pH for tea cultivation?,Tea plants typically thrive in slightly acidic soil with an ideal pH range of 4.5 to 5.5., ,,,,, +How can I identify and treat tea blister blight?,Blister blight appears as small circular raised blisters on tea leaves. Treatment often involves fungicides like copper-based compounds and good field sanitation practices., ,,,,, +What are the common pests affecting tea plants?,Common tea pests include tea mosquito bugs red spider mites and caterpillars. Integrated pest management strategies are recommended for control.,, ,,,, +What is the ideal temperature for growing tea plants?,Tea plants grow best in a temperature range of 20°C to 30°C (68°F to 86°F). They require a warm and humid climate to thrive.,,,,,, +How often should tea plants be watered?,Tea plants need regular watering especially during dry periods. However overwatering can lead to root problems so soil moisture should be monitored.,,,,,, +What are the best practices for pruning tea plants?,Pruning is vital for maintaining plant health and productivity. It should be done annually or biennially depending on the growth to remove old branches and stimulate new growth.,, ,,,, +Can you tell me about the process of tea fermentation?,Tea fermentation particularly for black and oolong teas involves oxidizing the leaves after they are harvested and withered. This process develops the tea's flavor aroma and color,, , ,,, +What's the difference between green tea and black tea processing?,The key difference lies in the oxidation process. Green tea is not oxidized which keeps it green. Black tea however is fully oxidized giving it a darker color and richer flavor.,, ,, ,, +How do you control fungal diseases in tea plants?,Fungal diseases in tea plants can be controlled by using appropriate fungicides maintaining field hygiene and ensuring proper air circulation through pruning.,, ,,,, +What is the impact of altitude on tea quality?,Higher altitudes with cooler temperatures and misty conditions often result in tea leaves with better flavor and aroma. Such teas are usually considered higher quality.,,,,,, +What type of fertilizers are best for tea plants?,Organic fertilizers like compost and green manure are beneficial for tea plants. Nitrogen-based fertilizers can also be used but it's important to avoid over-fertilization.,,,,,, +How long does it take for a tea plant to mature?,Tea plants typically take about 3 to 5 years to mature enough for harvesting. Full maturity when they reach peak productivity can take around 8 to 12 years.,,,,,, +Can tea plants grow in shade?,Tea plants prefer a balance of sun and shade. While they need good sunlight for growth partial shade can protect them from excessive heat and help in producing high-quality leaves., ,,,,, +What is 'flush' in tea cultivation?,A 'flush' refers to the growth of new leaves on a tea plant. It varies with geography and climate with terms like 'first flush' and 'second flush' indicating the seasonal harvesting periods.,,,,,, +How do I protect tea plants from frost damage?,To protect tea plants from frost use methods like windbreaks frost covers or even sprinkler systems. Ensuring good soil drainage also helps prevent frost damage.,, , ,,, +What is the impact of rain on tea production?,Tea plants need sufficient rain for growth but excessive rain can lead to diseases and poor quality leaves. It's a delicate balance between adequate moisture and avoiding waterlogging., ,,,,, +What causes leaf drop in tea plants?,Leaf drop in tea plants can be caused by several factors including drought overwatering nutrient deficiencies or pest and disease attacks., , , , ,, +How do tea plants respond to different light intensities?,Tea plants can adapt to different light intensities. While they grow well in bright light they can also tolerate partial shade which can sometimes enhance the quality of the leaves., ,,,,, +Are there any specific pruning techniques for tea bushes?,Skiffing and fine plucking are common pruning techniques. Skiffing involves light pruning to encourage new growth while fine plucking is the selective removal of the youngest leaves and buds.,,,,,, +What is the significance of elevation in tea cultivation?,Elevation plays a crucial role in tea cultivation. Higher elevations often result in slower-growing plants which can yield leaves with more complex flavors and aromas., ,,,,, +What kind of soil is ideal for growing tea?,Tea plants prefer well-drained fertile soil with good organic matter content. Loamy or sandy loam soils with slight acidity are generally ideal., ,,,,, +How does altitude affect the flavor of tea?,Higher altitude teas often have a more refined flavor due to the cooler temperatures and slower growth rate resulting in a denser concentration of flavor compounds in the leaves., ,,,,, +What is the process of withering in tea processing?,Withering in tea processing involves spreading the freshly harvested leaves out to dry reducing their moisture content. This makes the leaves soft and pliable ready for further processing.,,,,,, +How do you harvest tea leaves?,Tea leaves are typically hand-picked with harvesters selecting the top two leaves and a bud. This careful selection ensures the best quality for tea production.,,,,,, +What are the main types of tea plants?,The two main types of tea plants are Camellia sinensis var. sinensis typically used for Chinese teas and Camellia sinensis var. assamica used predominantly for Indian Assam teas.,, ,,,, +How can I control weeds in tea plantations?,Weed control in tea plantations can be managed through mulching manual weeding and the careful use of herbicides ensuring they don't harm the tea plants.,, , ,,, +What role do bees play in tea cultivation?,Bees are important pollinators for tea plants especially when they flower. They help in the cross-pollination process which can improve the genetic diversity and resilience of the plants., , ,,,, +How important is water quality in tea cultivation?,Water quality is crucial in tea cultivation. Clean unpolluted water is necessary for irrigation to avoid contaminating the soil and the plants which can affect the taste and safety of the tea., , ,,,, +What are the challenges in organic tea cultivation?,Organic tea cultivation faces challenges like managing pests and diseases without synthetic chemicals maintaining soil fertility and higher labor and production costs.,, ,,,, +Can you explain the process of rolling in tea processing?,Rolling is a step in tea processing where the withered leaves are mechanically rolled and twisted. This breaks down the cells releases essential oils and shapes the leaves contributing to the tea's flavor.,, , ,,, +What is the best time of year to plant tea seedlings?,The best time to plant tea seedlings is generally during the rainy season when the soil is moist which aids in the establishment and growth of the young plants.,,,,,, +How can I recognize nutrient deficiencies in tea plants?,Nutrient deficiencies in tea plants can manifest as discolored or malformed leaves. For instance nitrogen deficiency often causes yellowing of older leaves while potassium deficiency can lead to scorched leaf edges.,, ,,,, +What's the best way to store harvested tea leaves?,Harvested tea leaves should be stored in a cool dry place away from direct sunlight and strong odors. Proper storage is essential to maintain their freshness and flavor., ,,,,, +How does climate change impact tea cultivation?,Climate change affects tea cultivation by altering rainfall patterns increasing pests and diseases and impacting the quality and flavor of tea leaves due to changes in temperature and humidity levels., , ,,,, +Is it possible to grow tea plants indoors?,Growing tea plants indoors is possible but challenging. They require ample sunlight controlled humidity and careful watering. It's more of a novelty as indoor conditions are rarely ideal for producing quality tea leaves.,,,,,, +What are the environmental benefits of shade-grown tea?,Shade-grown tea can benefit the environment by preserving biodiversity reducing soil erosion and maintaining a more balanced ecosystem as it often involves growing tea under a canopy of diverse trees.,, , ,,, +How long does it take for a tea bush to recover after pruning?,A tea bush typically takes around 2 to 4 years to fully recover and reach peak productivity after a severe pruning known as 'rejuvenation pruning.',,,,,, +What are biocontrol methods for pest management in tea cultivation?,Biocontrol methods in tea cultivation include using natural predators or parasites to control pests applying microbial insecticides and encouraging biodiversity to naturally regulate pest populations.,, ,,,, +Can tea plants be grown from seeds?,Yes tea plants can be grown from seeds but it requires patience as they can take several years to mature. Growing from cuttings is a faster alternative for propagation.,, ,,,, +What is the role of mulching in tea cultivation?,Mulching in tea cultivation helps retain soil moisture control weeds regulate soil temperature and improve soil structure and fertility as the organic matter decomposes.,,, ,,, +What is blister blight in tea plants and how can it be managed?,Blister blight caused by the fungus Exobasidium vexans affects young tea leaves. It's managed by regular fungicide sprays and selecting disease-resistant tea clones.,, ,,,, +How does shade affect tea diseases?,Shade in tea cultivation can influence disease incidence. While it can reduce some pest attacks it might also encourage diseases like blister blight in humid conditions.,,,,,, +What is the best way to control root diseases in tea?,Controlling root diseases involves improving soil microbiota eradicating with pesticides and practicing good soil management to prevent fungal growth.,,,,,, +Can pruning help in managing tea diseases?,Yes strategic pruning can help manage diseases like black blight. Pruning the affected bushes and burning the clippings can prevent disease spread., ,,,,, +What are the environmental factors affecting tea diseases?,Environmental factors like humidity temperature and rainfall play a significant role in tea diseases. For example high humidity and lack of sunlight can aggravate blister blight.,, , ,,, +What is tea red spider mite and how is it treated?,Tea red spider mite is a common pest causing leaf discoloration and reduced yield. Treatment includes using miticides and promoting natural predators like ladybugs.,,,,,, +What are the symptoms of grey blight in tea and its treatment?,Grey blight caused by Pestalotiopsis species manifests as grey spots on leaves. Treatment involves pruning affected areas and applying fungicides to control the spread.,,,,,, +Can you tell me about the use of biopesticides in tea cultivation?,Biopesticides derived from natural materials like plants bacteria and certain minerals are used in tea cultivation for sustainable pest management reducing the reliance on chemical pesticides.,, ,,,, +What are the effects of removing tree shade in tea cultivation?,Removing tree shade in tea cultivation increases weed growth the need for fertilizers and susceptibility to diseases like stem canker and grey blight as well as pests like mites.,,,,,, +How does altitude affect disease pressure in tea cultivation?,Disease and pest pressure in tea cultivation varies with altitude. Lower altitudes may have less disease but increased pest issues while higher altitudes can see increased disease pressure like blister blight.,,,,,, +Can you tell me about integrated control for tea root diseases?,Integrated control of tea root diseases involves using pesticides for eradication and improving soil microflora. It also includes good soil management to prevent fungal growth.,,,,,, +What is the impact of pruning on tea diseases?,Pruning in tea cultivation can help manage diseases like black blight. Affected bushes should be pruned and the clippings burned to prevent disease spread.,,,,,, +How do environmental factors influence tea diseases?,Environmental factors like humidity temperature and rainfall significantly impact tea diseases. High humidity and lack of sunlight can aggravate diseases like blister blight.,,,,,, +What is the significance of plucking intervals in tea cultivation?,Plucking intervals are crucial in tea cultivation. They determine the growth cycle of the plant and the quality of the tea leaves. Shorter intervals can ensure higher quality but may stress the plant.,,,,,, +How does irrigation affect tea plant growth?,Proper irrigation is essential for tea plant growth especially in regions with less rainfall. It helps in maintaining soil moisture which is vital for the health and productivity of the tea plants.,,,,,, +What role does topography play in tea cultivation?,Topography plays a significant role in tea cultivation. Sloped terrains can provide better drainage and sun exposure which are beneficial for tea plants. It also influences the microclimate around the tea bushes.,,,,,, +Can you explain the process of tea plant propagation?,Tea plants are usually propagated either by seeds or by vegetative methods like cuttings grafting or layering. Vegetative methods are more common as they preserve the characteristics of the parent plant.,,,,,, +What is the impact of organic farming on tea quality?,Organic farming can positively impact tea quality. It involves using natural fertilizers and pest control methods which can lead to the production of tea leaves with better flavor and reduced chemical residues., ,,,,, +What are the benefits of using mulch in tea gardens?,Using mulch in tea gardens helps in moisture retention weed control and soil temperature regulation. It also adds organic matter to the soil enhancing its fertility and structure.,, , ,,, +How do different harvesting methods affect tea quality?,Different harvesting methods like hand plucking vs. mechanical harvesting significantly affect tea quality. Hand plucking allows for selective harvesting of the best leaves generally resulting in higher quality tea.,, , ,,, +What are the best practices for sustainable tea farming?,Sustainable tea farming practices include using organic fertilizers practicing soil and water conservation promoting biodiversity and implementing integrated pest management techniques., , , ,,, +How does the pH level of soil affect tea growth?,Soil pH level is crucial for tea growth. Tea plants prefer slightly acidic soil usually with a pH between 4.5 and 5.5. This pH range helps the plants absorb nutrients more effectively.,,,,,, +What is the role of shade trees in tea plantations?,Shade trees in tea plantations provide benefits like regulating microclimate improving soil structure reducing leaf temperature and protecting tea plants from harsh sunlight and wind., , , ,,, +What impact does altitude have on tea leaf quality?,Altitude greatly impacts tea leaf quality. Higher altitudes often result in slower leaf growth leading to a concentration of flavors. Teas from high altitudes are generally considered superior in quality., ,,,,, +How does rainfall influence tea production?,Rainfall is crucial for tea production. Adequate and well-distributed rainfall promotes healthy growth but excessive rain can cause waterlogging increase disease risk and affect leaf quality., ,,,,, +What are the challenges of growing tea in colder climates?,Growing tea in colder climates poses challenges like the risk of frost slower growth rates and potential for reduced yields. However some cold-resistant tea varieties can still thrive.,, , ,,, +Can tea plants be affected by air pollution?,Yes tea plants can be affected by air pollution. Pollutants can deposit on leaves affecting photosynthesis and potentially altering the flavor and safety of the tea.,, ,,,, +What are the benefits of organic tea farming compared to conventional methods?,Organic tea farming offers benefits like improved soil health and biodiversity reduction in chemical residues on tea leaves and potential for higher market value. It emphasizes sustainable practices and eco-friendly methods.,, ,,,, +How can farmers improve soil fertility in tea plantations?,Improving soil fertility in tea plantations can be achieved through the use of organic compost green manure and careful application of chemical fertilizers. Regular soil testing is also crucial to monitor nutrient levels,,.,,,, +What is the importance of pest monitoring in tea cultivation?,Pest monitoring is crucial in tea cultivation for early detection and management of infestations. It helps in applying targeted control measures reducing the need for widespread pesticide use and preserving ecological balance., ,,,,, +What methods are used to conserve water in tea farming?,Water conservation methods in tea farming include rainwater harvesting drip irrigation and maintaining soil cover to reduce evaporation. These practices help in sustainable water management especially in areas with limited water resources., , , ,,, +How does climate change impact tea cultivation?,Climate change impacts tea cultivation through altered rainfall patterns temperature changes and increased frequency of extreme weather events. These changes can affect tea quality yield and increase susceptibility to pests and diseases.,,,,,, +What role do companion plants play in tea gardens?,Companion plants in tea gardens can enhance biodiversity attract beneficial insects and may even help in pest control and improving soil health. For example planting certain flowers can attract pollinators and predatory insects., ,,,,, +Can tea cultivation affect local wildlife? How?,Tea cultivation can impact local wildlife particularly if it involves clearing natural habitats. Sustainable practices like preserving natural corridors and avoiding harmful chemicals can mitigate negative impacts and promote wildlife conservation., ,,,,, +How does the moon phase affect tea cultivation?,Some tea cultivators believe that the moon phase can influence tea growth and quality following biodynamic farming principles. They might time certain activities like planting or harvesting based on lunar cycles although scientific evidence supporting this is limited., , ,,,, +What is 'white tea' and how is it cultivated differently?,White tea is made from young tea leaves and buds that are minimally processed. Its cultivation requires careful timing to harvest at a young stage and the leaves are typically dried naturally with minimal oxidation preserving a delicate flavor.,, ,,,, +Are there any unique methods of tea cultivation found only in specific regions?,Yes some regions have unique tea cultivation methods. For example in parts of China and Japan tea plants are shaded for a period before harvest to produce certain types of green tea like Matcha or Gyokuro enhancing their flavor and nutrient content.,, , ,,, +What is the role of agroforestry in tea cultivation?,Agroforestry in tea cultivation involves integrating trees and shrubs within tea plantations. This method can enhance biodiversity improve soil quality and create a more resilient ecosystem against climate change impacts.,,,,,, +How does the use of permaculture principles benefit tea farming?,Applying permaculture principles in tea farming promotes sustainable and eco-friendly practices. It includes creating diverse self-sustaining systems that mimic natural ecosystems which can lead to healthier soil and plants.,,,,,, +Is there a way to use renewable energy in tea processing?,Renewable energy sources like solar or biomass energy can be used in tea processing to reduce carbon footprint. For instance solar dryers can be an eco-friendly alternative to traditional drying methods.,, , ,,, +Can tea cultivation be combined with beekeeping?,Tea cultivation can be effectively combined with beekeeping. Bees can aid in pollination and improve crop yields while tea plantations provide a foraging habitat for bees enhancing honey production., , ,,,, +What are the effects of using green manure in tea gardens?,Green manure consisting of decomposing plant material is beneficial for tea gardens. It improves soil structure increases organic matter and nutrient content and helps in maintaining soil moisture levels.,,,,,, +How does vertical farming apply to tea cultivation?,Vertical farming though not traditional for tea can be applied by growing tea plants in vertically stacked layers. This method can optimize space especially in urban settings and allows for precise control of growing conditions.,, , , ,, +What is the impact of sound waves or music on tea plant growth?,Some studies suggest that sound waves or music could impact plant growth including tea. The idea is that certain frequencies or vibrations may stimulate growth or enhance plant metabolism although concrete evidence is still limited., ,,,,, +Can artificial intelligence be used in tea farming? How?,Artificial intelligence can revolutionize tea farming by analyzing data for precision agriculture predicting optimal harvest times detecting pests or diseases early and even automating some farming processes.,, , ,,, +What's the concept of 'forest tea' and its cultivation method?,Forest tea refers to tea plants grown in a forested environment mimicking natural ecosystems. This method emphasizes biodiversity and natural growth conditions potentially leading to unique flavor profiles in the tea., , ,,,, +Is hydroponic cultivation feasible for tea plants?,Hydroponic cultivation of tea plants is a novel concept where plants are grown in nutrient-rich water without soil. This method allows for controlled environment agriculture although it's not commonly used for commercial tea production yet., ,,,,, +How can biodynamic practices be integrated into tea cultivation?,Biodynamic practices in tea cultivation involve following a holistic agricultural approach which includes using biodynamic preparations aligning farming activities with lunar cycles and fostering a self-sustaining ecosystem within the tea plantation.,, ,,,, +What is the concept of tea micro-terroirs and its importance?,Tea micro-terroirs refer to the unique combination of climate soil and topography in a specific small area. These micro-terroirs can significantly influence the flavor profile and quality of the tea produced leading to unique and distinct teas.,,,,,, +Can tea plants be cultivated alongside medicinal herbs?,Cultivating tea alongside medicinal herbs can be beneficial. It can enhance biodiversity improve soil health and potentially create synergies between plants leading to enhanced growth and possibly unique flavor profiles in the tea.,, , ,,, +How does the use of natural pest repellents benefit tea farming?,Natural pest repellents in tea farming like neem oil or garlic sprays offer an eco-friendly alternative to chemical pesticides. They help manage pests without harming beneficial insects or the environment.,,,,,, +Is aquaponics a viable method for growing tea?,Aquaponics combining aquaculture with hydroponics is an innovative approach for tea cultivation. While not traditional it could potentially be used for tea allowing for efficient water use and nutrient recycling but requires careful balance and management.,, ,, , , +What are some natural remedies for fungal diseases in tea plants?,Natural remedies for fungal diseases in tea include using neem oil baking soda solutions or garlic extracts. These organic treatments can help manage mild fungal infections without the use of harsh chemicals., , ,,,, +Can beneficial microbes be used to combat tea plant diseases?,Yes beneficial microbes like certain bacteria and fungi can be used to combat tea plant diseases. They work by enhancing soil health improving plant immunity and sometimes directly antagonizing pathogenic microbes.,, , ,,, +Is there a role for biopesticides in managing tea pests?,Biopesticides derived from natural sources such as plants bacteria and certain minerals can play a significant role in managing tea pests. They are generally more environmentally friendly and target specific pests without harming beneficial organisms.,,, ,,, +What are the methods for controlling root rot in tea plants?,Controlling root rot in tea plants involves improving soil drainage applying fungicides and using resistant plant varieties. Good cultural practices like avoiding overwatering and ensuring proper soil aeration are also crucial.,, , , ,, +How can integrated pest management (IPM) be applied in tea cultivation?,IPM in tea cultivation involves a combination of practices like monitoring pest populations using biological control agents practicing cultural controls such as crop rotation and applying chemical controls as a last resort.,, ,,,, +Are there any pheromone-based treatments for tea pests?,Pheromone-based treatments involve using synthetic pheromones to disrupt the mating patterns of certain tea pests. This method is environmentally friendly and can effectively reduce pest populations without chemical pesticides.,,,,,, +What's the role of silicon in managing tea plant diseases?,Silicon when added to the soil or as a foliar spray can enhance tea plant resistance to diseases. It strengthens plant cell walls making it harder for pathogens to penetrate and infect the plant tissues.,,, ,,, +How effective are essential oils in treating tea plant diseases?,Essential oils such as tea tree or neem oil can be effective in treating certain tea plant diseases. They possess antifungal and antibacterial properties but their efficacy depends on the disease type and application method.,,, ,,, +Can compost tea be used as a disease suppressant for tea plants?,Compost tea a liquid extract of compost can be used as a foliar spray to suppress diseases in tea plants. It helps by improving leaf surface microbial activity which can outcompete or inhibit the growth of pathogenic fungi and bacteria.,, , ,,, +Is ultraviolet light a viable treatment for managing tea diseases?,Ultraviolet (UV) light treatments can be used to manage certain tea diseases especially fungal pathogens. UV-C light in particular has been shown to inhibit the growth of some fungi and bacteria on plant surfaces when applied correctly.,,, ,,, +Can soil solarization be used to control soil-borne diseases in tea?,Soil solarization a process of using solar power to heat the soil can be effective in controlling soil-borne diseases in tea plantations. It involves covering the soil with clear plastic to trap solar energy reducing pathogens.,, , ,,, +Are there any biological control agents specifically effective against tea pests?,Yes there are biological control agents used against tea pests. For example certain parasitic wasps and predatory insects can be introduced to control aphids and mites. These agents are environmentally friendly and target specific pests without harming other beneficial organisms.,,,,,, +What is the role of trap crops in managing tea pests?,Trap crops are plants grown to attract pests away from the main tea crop. They serve as a natural pest control method by concentrating pests on a specific plant making it easier to manage them without affecting the main tea crop. ,,,,,, +Can intercropping with certain plants reduce tea plant diseases?,Intercropping tea with certain plants can help reduce disease incidence. Companion plants may improve soil health attract beneficial insects or even produce natural substances that deter pathogens thereby providing a more resilient and healthy growing environment for tea plants.,,, ,,, +How can drones be utilized in the management of tea diseases?,Drones can be utilized in tea plantations for precise application of pesticides or fungicides monitoring crop health and early detection of disease outbreaks. They offer a high-tech solution for efficient and targeted disease management.,, ,,,, +Can electromagnetic fields be used to control diseases in tea plants?,The use of electromagnetic fields for disease control in tea plants is an emerging area of research. Some studies suggest that certain electromagnetic frequencies might enhance plant resistance to diseases or inhibit the growth of pathogens although practical applications are still in experimental stages.,,,,,, +Is nanotechnology being explored for disease management in tea cultivation?,Nanotechnology is being explored for its potential in disease management in tea cultivation. It could offer novel ways to deliver pesticides or fungicides more efficiently target specific pathogens and reduce environmental impact though it's still largely in the research phase.,,,,,, +What is the potential of using sound therapy for tea plant diseases?,Sound therapy using specific frequencies or vibrations is an unconventional method being explored for plant disease management. While there is some anecdotal evidence suggesting benefits in plant health scientific research on its effectiveness particularly for tea plants is limited.,, , , ,, +Can controlled atmospheric conditions be used to prevent diseases in tea storage?,Controlled atmospheric conditions such as modified humidity and temperature levels can be used in tea storage to prevent diseases and preserve quality. This method involves creating an environment less conducive to the growth of molds and other pathogens.,, ,,,, +Are there any experimental treatments using light spectra to combat tea diseases?,Experimental treatments using specific light spectra are being studied for their potential in combating tea diseases. Certain wavelengths of light such as UV have been shown to suppress fungal growth and could be a future avenue for disease control in tea cultivation.,,,,,, +Can plant-based extracts be effective in treating tea plant diseases?,Plant-based extracts such as those from certain herbs or medicinal plants are being explored for their potential in treating tea plant diseases. These natural extracts may have antifungal or antibacterial properties offering a more sustainable and eco-friendly alternative to synthetic chemicals.,,, ,,, +Is there a role for mycorrhizal fungi in managing tea plant health?,Mycorrhizal fungi which form symbiotic relationships with plant roots can play a significant role in enhancing tea plant health. They help improve nutrient uptake enhance resistance to soil-borne diseases and can improve overall plant vigor and resilience.,, ,, ,, +How can thermal fogging be used in disease control for tea plants?,Thermal fogging a method of generating a fine mist or fog of a pesticide solution can be used for disease control in tea plantations. It allows for uniform application over large areas and can be effective in reaching difficult-to-access parts of the plant., ,,,,, +Are there innovative irrigation techniques that help in disease management for tea?,Innovative irrigation techniques like drip or subsurface irrigation can help in disease management for tea by providing water directly to the roots and minimizing leaf wetness which often contributes to the spread of fungal diseases.,,, ,,, +Can altering tea plant microbiomes be a strategy for disease resistance?,Altering the microbiome of tea plants is an emerging strategy for enhancing disease resistance. By promoting beneficial microbes or introducing specific microbial strains it's possible to suppress pathogenic organisms and improve plant health and resilience against diseases., ,,,,, +Can aeroponics be used for growing tea?,Aeroponics the process of growing plants in an air or mist environment without soil is an innovative approach that could be applied to tea cultivation. This method allows for precise control of nutrients oxygen and moisture potentially enhancing growth and quality. However it's more common in experimental settings than commercial tea production.,,, , ,, +How does grafting different tea varieties affect plant characteristics?,Grafting different tea varieties can combine desirable traits from each variety such as disease resistance yield and quality of tea leaves. This technique allows for the creation of plants that can thrive in specific environments or produce unique flavors.,, , ,,, +Is there a way to use wind energy in tea processing?,Wind energy can be harnessed in tea processing as a renewable energy source. It can power machinery used in the processing stages such as withering rolling and drying making the process more sustainable and reducing the carbon footprint of tea production., , , ,,, +What are the impacts of using cover crops in tea plantations?,Using cover crops in tea plantations can improve soil health prevent erosion enhance moisture retention and suppress weeds. Cover crops can also attract beneficial insects and improve the overall biodiversity of the plantation.,,, ,,, +Can tea cultivation benefit from vertical layering or stratification?,Vertical layering or stratification in tea cultivation involves growing plants at different heights or layers. This can optimize space utilization and can be particularly beneficial in controlled environments like greenhouses. It might allow for diverse microclimates in a single plantation potentially benefiting different varieties of tea.,,,,,, +Thank you, Have a Nice Day,,,,,, \ No newline at end of file diff --git a/assets/diseasenotfound/error.json b/assets/diseasenotfound/error.json new file mode 100644 index 0000000..2884832 --- /dev/null +++ b/assets/diseasenotfound/error.json @@ -0,0 +1 @@ +{"v":"5.5.9","fr":60,"ip":0,"op":180,"w":426,"h":290,"nm":"search_empty","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"mouth","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[211,145,0],"to":[0,0.667,0],"ti":[0,-0.667,0]},{"t":69,"s":[211,149,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":44,"s":[100,100,100]},{"t":68,"s":[105,105,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.5,0.25],[-1.715,0.372]],"o":[[-13.025,-6.512],[7.5,-1.625]],"v":[[-10,12.25],[-31.75,12.625]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1843137254901961,0.1803921568627451,0.2549019607843137,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"汗","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":51,"s":[0]},{"t":95,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":51,"s":[248,95.252,0],"to":[0,1.5,0],"ti":[0,-1.5,0]},{"t":94,"s":[248,104.252,0]}],"ix":2},"a":{"a":0,"k":[0,-19.333,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":51,"s":[40,40,100]},{"t":95,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-9.94,0],[0,7.27],[0,0],[0,-7.27]],"o":[[9.94,0],[0,-7.27],[0,0],[0,7.27]],"v":[[0,19],[18,5.84],[0,-19],[-18,5.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.6901960784313725,0.9764705882352941,1,0.5,0.714,0.954,0.997,1,0.738,0.932,0.994],"ix":9}},"s":{"a":0,"k":[0.019,-9.236],"ix":5},"e":{"a":0,"k":[10.208,19],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"汗","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"eye","parent":1,"sr":1,"ks":{"o":{"a":0,"k":92,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-7.064,-11.347,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,20,100]},{"t":56,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.466,16.135],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1843137254901961,0.1803921568627451,0.2549019607843137,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"eye","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"eye","parent":1,"sr":1,"ks":{"o":{"a":0,"k":92,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-33.767,-11.347,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":3,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":9,"s":[100,20,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":50,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":53,"s":[100,20,100]},{"t":56,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.466,16.135],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.1843137254901961,0.1803921568627451,0.2549019607843137,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"eye","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"magnifier","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213,145,0],"ix":2},"a":{"a":0,"k":[213,145,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":569,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213,145,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"st","c":{"a":0,"k":[0.1843137254901961,0.1803921568627451,0.2549019607843137,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[190.106,142.222,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[99.994,100.091],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-40,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[192.013,142.223,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-26.81,22.62],[22.49,26.96],[26.8,-22.62],[-22.5,-26.95]],"o":[[26.81,-22.62],[-22.49,-26.96],[-26.81,22.62],[22.49,26.96]],"v":[[40.727,48.812],[48.537,-40.958],[-40.723,-48.808],[-48.533,40.952]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.27058823529411763,0.43137254901960786,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[268.024,226.941,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[42.094,74.507],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":10,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.27058823529411763,0.43137254901960786,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-40,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"矩形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-5,"ix":10},"p":{"a":0,"k":[238.933,197.25,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[24.446,44.702],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.7215686274509804,0.7490196078431373,0.788235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-40,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"矩形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"合併形狀","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":60,"s":[0]},{"t":265,"s":[360]}],"ix":10},"p":{"a":0,"k":[208,27,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"合併形狀","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"合併形狀","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"t":358,"s":[360]}],"ix":10},"p":{"a":0,"k":[418,107,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"合併形狀","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"合併形狀","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0]},{"t":281,"s":[360]}],"ix":10},"p":{"a":0,"k":[31,196,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[16,2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"rc","d":1,"s":{"a":0,"k":[2,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 2","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"合併形狀","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":281,"s":[360]}],"ix":10},"p":{"a":0,"k":[70,33,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,9,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[376,179,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"橢圓形","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[8,115,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[16,16],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"橢圓形","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[191,145,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":30,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":90,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":120,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":150,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":180,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":210,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":240,"s":[70,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":270,"s":[50,100,100]},{"t":295,"s":[70,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56.697,6.631],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4666666666666667,0.4666666666666667,0.4666666666666667,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-9.651,124.815],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"main","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[213,145,0],"to":[0,0.833,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":60,"s":[213,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":90,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":120,"s":[213,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":150,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":180,"s":[213,145,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":210,"s":[213,150,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":240,"s":[213,145,0],"to":[0,0,0],"ti":[0,-0.833,0]},{"t":270,"s":[213,150,0]}],"ix":2},"a":{"a":0,"k":[213,145,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"decoration1","refId":"comp_2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.981],"y":[1.128]},"o":{"x":[0.39],"y":[0.019]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":72,"s":[80]},{"t":73,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213,289,0],"ix":2},"a":{"a":0,"k":[213,289,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.667],"y":[0.866,0.866,1]},"o":{"x":[0.37,0.37,0.333],"y":[-0.029,-0.029,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":72,"s":[80,80,100]},{"t":133,"s":[90,90,100]}],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":569,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"decoratio2","refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[100]},{"t":72,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[211,291,0],"ix":2},"a":{"a":0,"k":[211,291,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[99.442,99.442,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":72,"s":[84.442,84.442,100]},{"t":133,"s":[90,90,100]}],"ix":6}},"ao":0,"w":426,"h":290,"ip":0,"op":569,"st":0,"bm":0}],"markers":[{"tm":180,"cm":"1","dr":0},{"tm":3600,"cm":"2","dr":0}]} \ No newline at end of file diff --git a/assets/editProfileImages/image_not_found.png b/assets/editProfileImages/image_not_found.png new file mode 100644 index 0000000..840d828 Binary files /dev/null and b/assets/editProfileImages/image_not_found.png differ diff --git a/assets/editProfileImages/img_arrow_left.svg b/assets/editProfileImages/img_arrow_left.svg new file mode 100644 index 0000000..1473d22 --- /dev/null +++ b/assets/editProfileImages/img_arrow_left.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/editProfileImages/img_arrowdropdown.svg b/assets/editProfileImages/img_arrowdropdown.svg new file mode 100644 index 0000000..6aea30a --- /dev/null +++ b/assets/editProfileImages/img_arrowdropdown.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/editProfileImages/img_contrast.svg b/assets/editProfileImages/img_contrast.svg new file mode 100644 index 0000000..65b157e --- /dev/null +++ b/assets/editProfileImages/img_contrast.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/editProfileImages/img_group_10.png b/assets/editProfileImages/img_group_10.png new file mode 100644 index 0000000..1e61e16 Binary files /dev/null and b/assets/editProfileImages/img_group_10.png differ diff --git a/assets/editProfileImages/img_home_1_svgrepo_com.svg b/assets/editProfileImages/img_home_1_svgrepo_com.svg new file mode 100644 index 0000000..5f5a131 --- /dev/null +++ b/assets/editProfileImages/img_home_1_svgrepo_com.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/editProfileImages/img_plant_pot_svgrepo_com.svg b/assets/editProfileImages/img_plant_pot_svgrepo_com.svg new file mode 100644 index 0000000..17a41ff --- /dev/null +++ b/assets/editProfileImages/img_plant_pot_svgrepo_com.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/editProfileImages/img_scan_svgrepo_com.svg b/assets/editProfileImages/img_scan_svgrepo_com.svg new file mode 100644 index 0000000..dbea616 --- /dev/null +++ b/assets/editProfileImages/img_scan_svgrepo_com.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/editProfileImages/img_srilanka_1.png b/assets/editProfileImages/img_srilanka_1.png new file mode 100644 index 0000000..8a55774 Binary files /dev/null and b/assets/editProfileImages/img_srilanka_1.png differ diff --git a/assets/editProfileImages/img_user_circle_svgrepo_com.svg b/assets/editProfileImages/img_user_circle_svgrepo_com.svg new file mode 100644 index 0000000..442213e --- /dev/null +++ b/assets/editProfileImages/img_user_circle_svgrepo_com.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/emailverificationui/tick.png b/assets/emailverificationui/tick.png new file mode 100644 index 0000000..e155166 Binary files /dev/null and b/assets/emailverificationui/tick.png differ diff --git a/assets/fonts/PoppinsBold.ttf b/assets/fonts/PoppinsBold.ttf new file mode 100644 index 0000000..00559ee Binary files /dev/null and b/assets/fonts/PoppinsBold.ttf differ diff --git a/assets/fonts/PoppinsRegular.ttf b/assets/fonts/PoppinsRegular.ttf new file mode 100644 index 0000000..9f0c71b Binary files /dev/null and b/assets/fonts/PoppinsRegular.ttf differ diff --git a/assets/fonts/RedHatTextRomanLight.ttf b/assets/fonts/RedHatTextRomanLight.ttf new file mode 100644 index 0000000..eaf02c2 Binary files /dev/null and b/assets/fonts/RedHatTextRomanLight.ttf differ diff --git a/assets/fonts/RobotoRegular.ttf b/assets/fonts/RobotoRegular.ttf new file mode 100644 index 0000000..ddf4bfa Binary files /dev/null and b/assets/fonts/RobotoRegular.ttf differ diff --git a/assets/fonts/RobotoRomanMedium.ttf b/assets/fonts/RobotoRomanMedium.ttf new file mode 100644 index 0000000..ac0f908 Binary files /dev/null and b/assets/fonts/RobotoRomanMedium.ttf differ diff --git a/assets/images/bgimag.png b/assets/images/bgimag.png new file mode 100644 index 0000000..88161fe Binary files /dev/null and b/assets/images/bgimag.png differ diff --git a/assets/images/headsetsvgrepocom.png b/assets/images/headsetsvgrepocom.png new file mode 100644 index 0000000..75eb220 Binary files /dev/null and b/assets/images/headsetsvgrepocom.png differ diff --git a/assets/images/image_not_found.png b/assets/images/image_not_found.png new file mode 100644 index 0000000..840d828 Binary files /dev/null and b/assets/images/image_not_found.png differ diff --git a/assets/images/img_a5956896_9729.png b/assets/images/img_a5956896_9729.png new file mode 100644 index 0000000..e7b760d Binary files /dev/null and b/assets/images/img_a5956896_9729.png differ diff --git a/assets/images/img_arrow_down.svg b/assets/images/img_arrow_down.svg new file mode 100644 index 0000000..504d7dc --- /dev/null +++ b/assets/images/img_arrow_down.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/img_gallery_svgrepo_com.svg b/assets/images/img_gallery_svgrepo_com.svg new file mode 100644 index 0000000..d1fce61 --- /dev/null +++ b/assets/images/img_gallery_svgrepo_com.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/images/img_grid.svg b/assets/images/img_grid.svg new file mode 100644 index 0000000..76b20eb --- /dev/null +++ b/assets/images/img_grid.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/img_question_mark_c.svg b/assets/images/img_question_mark_c.svg new file mode 100644 index 0000000..d9174c9 --- /dev/null +++ b/assets/images/img_question_mark_c.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/images/img_sendsvgrepocom.svg b/assets/images/img_sendsvgrepocom.svg new file mode 100644 index 0000000..40071d6 --- /dev/null +++ b/assets/images/img_sendsvgrepocom.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/images/img_settings.svg b/assets/images/img_settings.svg new file mode 100644 index 0000000..bbf78bb --- /dev/null +++ b/assets/images/img_settings.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/logo/TeaHub_icon.jpg b/assets/images/logo/TeaHub_icon.jpg new file mode 100644 index 0000000..3749dc7 Binary files /dev/null and b/assets/images/logo/TeaHub_icon.jpg differ diff --git a/assets/images/play-buttonsvgrepocom.png b/assets/images/play-buttonsvgrepocom.png new file mode 100644 index 0000000..90ed9ba Binary files /dev/null and b/assets/images/play-buttonsvgrepocom.png differ diff --git a/assets/images/qr-code-scan.png b/assets/images/qr-code-scan.png new file mode 100644 index 0000000..23217ea Binary files /dev/null and b/assets/images/qr-code-scan.png differ diff --git a/assets/images/rectangle-8.png b/assets/images/rectangle-8.png new file mode 100644 index 0000000..38005a6 Binary files /dev/null and b/assets/images/rectangle-8.png differ diff --git a/assets/images/tea.json b/assets/images/tea.json new file mode 100644 index 0000000..a728318 --- /dev/null +++ b/assets/images/tea.json @@ -0,0 +1,715 @@ +[ + { + "_id": "63092102a643c85c74b00e6e", + "name": "Black Tea", + "slug": "black", + "altnames": "Red Tea", + "origin": "China", + "type": "black", + "image": "https://iteaworld.com/cdn/shop/articles/black-tea-e1559472467846.jpg?v=1703752925&width=2048", + "caffeine": "40-120mg", + "sources": [ + "https://en.wikipedia.org/wiki/Black_tea" + ], + "description": "Black tea, also translated to red tea in various East Asian languages, is a type of tea that is more oxidized than other types", + "colorDescription": "red, amber", + "tasteDescription": "smoky, earthy, spicy, nutty, citrus, caramel, leather, fruity, and honey" + }, + { + "_id": "63092102a643c85c74b00e71", + "name": "White Tea", + "slug": "white", + "caffeine": "time/temperature based", + "type": "white", + "image": "https://cdn2.bigcommerce.com/server2800/59819/product_images/uploaded_images/white-tea-2.jpg", + "origin": "East Asia", + "description": "A style of tea that features young or minimally processed leaves of the Camellia sinensis plant", + "colorDescription": "light green or light yellow", + "tasteDescription": "floral, fresh, fruity, with a hint of cucumber or melon." + }, + { + "_id": "63092102a643c85c74b00e72", + "name": "Assam Tea", + "slug": "assam", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/3/3b/Assam-Tee_SFTGFOP1.jpg", + "origin": "Assam, India", + "type": "black", + "caffeine": "60-110mg", + "caffeineLevel": "high", + "decription": "Assam tea is mostly grown at or near sea level and is known for its body, briskness, malty flavour, and strong, bright colour. Assam teas, or blends containing Assam, are often sold as \"breakfast\" teas.", + "colorDescription": "deep-amber", + "tasteDescription": "The flavor can range from brisk, smokey, earthy, musky and strong to a lighter cup with chocolate, cocoa, or even sweet and spicy notes", + "sources": [ + "https://en.wikipedia.org/wiki/Assam_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e73", + "name": "Darjeeling Tea", + "slug": "darjeeling", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/62/Darjeeling%2C_India%2C_Darjeeling_tea_in_variety%2C_Black_tea.jpg/1920px-Darjeeling%2C_India%2C_Darjeeling_tea_in_variety%2C_Black_tea.jpg?20210606141050", + "origin": "India", + "type": "black", + "caffeine": "50-120mg", + "caffeineLevel": "very high", + "decription": "Darjeeling tea is a black tea that is grown and processed in the Darjeeling or Kalimpong Districts in West Bengal, also among the only teas in the world with a Geographical Indication trademark", + "sources": [ + "https://en.wikipedia.org/wiki/Darjeeling_tea", + "https://www.thespruceeats.com/tea-flushes-in-darjeeling-765194", + "https://www.seriouseats.com/why-you-should-drink-more-darjeeling-tea-what-is-first-flush" + ], + "colorDescription": "ranging from golden yellow to orange to deep red.", + "tasteDescription": "musky-sweet tasting notes similar to muscat wine" + }, + { + "_id": "63092102a643c85c74b00e75", + "name": "Keemun", + "slug": "keemun", + "altnames": "Qimen Red Tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/2/25/Keemun-img1.jpg", + "origin": "China", + "type": "black", + "caffeine": "25-45mg", + "caffeineLevel": "moderate", + "decription": "A black tea ", + "sources": [ + "https://en.wikipedia.org/wiki/Keemun" + ], + "colorDescription": "bright red", + "tasteDescription": "smooth, fruity, malty, unsweetened cocoa" + }, + { + "_id": "63092102a643c85c74b00e74", + "name": "Lapsang Souchong", + "slug": "lapsangsouchong", + "altnames": "Smoked Tea, Smoky Souchong", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Lapsang_Souchong.jpg/1024px-Lapsang_Souchong.jpg?20170625192109", + "origin": "Fujian Province, China", + "type": "black", + "caffeine": "varying", + "caffeineLevel": "moderate", + "decription": "Lapsang Souchong is a tea that is smoke-dried over a pinewood fire", + "sources": [ + "https://en.wikipedia.org/wiki/Lapsang_souchong" + ], + "colorDescription": "ranging from amber to caramel to deep red.", + "tasteDescription": "sweet, piney, smoky" + }, + { + "_id": "63092102a643c85c74b00e76", + "name": "Dianhong Tea", + "slug": "dianhong", + "altnames": "Yunnan Red Tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GoldenDianHong.jpg/800px-GoldenDianHong.jpg?20071029183852", + "origin": "Yunnan Province, China", + "type": "black", + "caffeine": "20-40mg", + "caffeineLevel": "moderate", + "decription": "A relatively high-end, gourmet Chinese black tea sometimes used in various tea blends. The main difference between Dianhong and other Chinese black teas is the amount of fine leaf buds, or \"golden tips,\" present in the dried tea.", + "sources": [ + "https://en.wikipedia.org/wiki/Dianhong" + ], + "colorDescription": "golden orange", + "tasteDescription": "sweet, floral, and honey-like, though tends to be stronger and more bitter than other red teas" + }, + { + "_id": "63092102a643c85c74b00e77", + "name": "Sencha Tea", + "slug": "sencha", + "altnames": "Steeped Tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a6/2017_Kagoshima_sencha.jpg/1024px-2017_Kagoshima_sencha.jpg?20170624211809", + "origin": "Japan", + "type": "green", + "caffeine": "20-40mg", + "caffeineLevel": "low", + "description": "A Japanese green tea prepared by infusing whole tea leaves in hot water.", + "colorDescription": "light green", + "tasteDescription": "fresh, herbal, or grassy flavor, which can have varying vegetal grassy notes depending on how long it is steeped.", + "sources": [ + "https://en.wikipedia.org/wiki/Sencha" + ] + }, + { + "_id": "63092102a643c85c74b00e78", + "name": "Matcha Tea", + "slug": "matcha", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d9/Matcha_Scoop.jpg/1024px-Matcha_Scoop.jpg?20190105233506", + "origin": "China", + "type": "green", + "caffeine": "20-90mg", + "caffeineLevel": "moderate", + "description": "A finely ground powder of specially grown and processed green tea leaves, traditionally consumed in East Asia.", + "colorDescription": "green, dark green", + "tasteDescription": "vegetal grassy notes, natural sweet nuttiness, a touch of bitterness with a pleasant savory ending", + "sources": [ + "https://en.wikipedia.org/wiki/Matcha" + ] + }, + { + "_id": "63092102a643c85c74b00e79", + "name": "Bancha", + "slug": "bancha", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/d/dd/Shizuoka_bancha.jpg", + "origin": "Japan", + "type": "green", + "caffeine": "~10mg", + "caffeineLevel": "very low", + "description": "Tea that is harvested from the same tea tree as sencha grade, but it is plucked later than sencha is. Can be found in a number of forms such as roasted, unroasted, smoked, etc.", + "colorDescription": "light green to green-orange", + "tasteDescription": "mild, earthy grassiness, with dry, toasty notes with less of a deeply vegetal, umami flavo", + "sources": [ + "https://en.wikipedia.org/wiki/Bancha" + ] + }, + { + "_id": "63092102a643c85c74b00e7a", + "name": "Gyokuro", + "slug": "gyokuro", + "altnames": "Jade Dew, Pearl Dew", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/e0/Gyokuro_img_0067.jpg/480px-Gyokuro_img_0067.jpg", + "origin": "Japan", + "type": "green", + "caffeine": "~35mg", + "caffeineLevel": "low", + "description": "A type of shaded green tea from Japan. It differs from the standard sencha (a classic unshaded green tea) in being grown under the shade rather than the full sun.", + "colorDescription": "ranging from light green to dark green", + "tasteDescription": "very full-bodied, with a taste reminiscent to seaweed and grasses, followed by an intense sweetness", + "sources": [ + "https://en.wikipedia.org/wiki/Gyokuro" + ] + }, + { + "_id": "63092102a643c85c74b00e7b", + "name": "Kukicha", + "slug": "kukicha", + "altnames": "Bōcha, Twig tea, Stalk tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/b/ba/Kukicha.jpg/480px-Kukicha.jpg", + "origin": "Japan", + "type": "green", + "caffeine": "1-5mg", + "caffeineLevel": "very low", + "description": "A Japanese blend made of stems, stalks, and twigs. It is available as a green tea or in more oxidised processing", + "colorDescription": "very pale, yellow-green,", + "tasteDescription": "mildly nutty and slightly creamy sweet flavour", + "sources": [ + "https://en.wikipedia.org/wiki/Kukicha" + ] + }, + { + "_id": "63092102a643c85c74b00e7d", + "name": "Hojicha", + "slug": "hojicha", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a9/Houjicha.jpg/360px-Houjicha.jpg", + "origin": "Kyoto, Japan", + "type": "green", + "caffeine": "5-10mg", + "caffeineLevel": "very low", + "description": "A Japanese green tea that is roasted in a porcelain pot over charcoal", + "colorDescription": "distinctive clear red appearance", + "tasteDescription": "naturally sweet taste and smoky flavor with distinct notes of cocoa", + "sources": [ + "https://en.wikipedia.org/wiki/H%C5%8Djicha", + "https://hojicha.co/" + ] + }, + { + "_id": "63092102a643c85c74b00e6f", + "name": "Green Tea", + "slug": "green", + "image": "https://www.netmeds.com/images/cms/wysiwyg/blog/2019/11/Best_Tea_big_898.jpg", + "origin": "China", + "type": "green", + "caffeine": "~10mg", + "sources": [ + "https://en.wikipedia.org/wiki/Green_tea" + ], + "description": "Made from unoxidized leaves, Green tea is one of the least processed types of tea, offering high levels of antioxidants.", + "colorDescription": "varying shades of green", + "tasteDescription": "sweet, bittersweet, nutty, vegetal, buttery, floral, fruity, oceanic" + }, + { + "_id": "63092102a643c85c74b00e7e", + "name": "Da Hong Pao", + "slug": "dahongpao", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/2/29/Da_Hong_Pao_Oolong_tea_leaf.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "20-30mg", + "caffeineLevel": "moderate", + "description": "A Wuyi rock tea grown in the Wuyi Mountains of Fujian Province, China", + "colorDescription": "orange-yellow, bright and clear", + "tasteDescription": "peaty and earthy notes with hints of stone fruit, brown sugar, and molasses", + "sources": [ + "https://en.wikipedia.org/wiki/Da_Hong_Pao" + ] + }, + { + "_id": "63092102a643c85c74b00e7f", + "name": "Shui Jin Gui", + "slug": "shuijingui", + "altnames": "Golden Water Turtle Tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/b/b0/Shui_Jin_Gui_Oolong_tea_leaf.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "20-30mg", + "caffeineLevel": "moderate", + "description": "A Wuyi oolong tea from Mount Wuyi, Fujian, China", + "colorDescription": "bright green", + "tasteDescription": "sweet, floral", + "sources": [ + "https://en.wikipedia.org/wiki/Shui_Jin_Gui_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e83", + "name": "Tieguanyin", + "slug": "tieguanyin", + "altnames": "iron Goddess, Iron Guanyin", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Tieguanyin2.jpg/640px-Tieguanyin2.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "12-14mg", + "caffeineLevel": "low", + "description": "A variety of oolong tea that was originated during the 19th century", + "colorDescription": "bright emerald to bright yellow", + "tasteDescription": "roasted, nutty, creamy, fruity, toasty, honey, floral, fresh, vegetal and mineral", + "sources": [ + "https://en.wikipedia.org/wiki/Tieguanyin", + "https://www.puretaiwantea.com/health-benefits-of-tieguanyin-tea" + ] + }, + { + "_id": "63092102a643c85c74b00e82", + "name": "Shui Xian", + "slug": "shuixian", + "altnames": "Water sprite, Sacred Lily", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Shui_Xian.jpg/600px-Shui_Xian.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "10-20mg", + "caffeineLevel": "low", + "description": "Heavy Wuyi tea, the darkest of the dark oolongs from Wuyi.", + "colorDescription": "Deep amber", + "tasteDescription": "Mellow and delicate, the liquid is rich and complicated, with lingering fragrance in mouth", + "sources": [ + "https://en.wikipedia.org/wiki/Shui_Xian" + ] + }, + { + "_id": "63092102a643c85c74b00e80", + "name": "Tieluohan", + "slug": "tieluohan", + "altnames": "Iron Arhat", + "image": "https://teapedia.org/eng/images/thumb/c/c6/Tieluohan.jpg/400px-Tieluohan.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "20-30mg", + "caffeineLevel": "moderate", + "description": "Grown on the cliffs of the Wuyi Mountains in China, Tieluohan is a light tea with high regards due to legends", + "colorDescription": "clear brown", + "tasteDescription": "strong robust taste with a little bitterness", + "sources": [ + "https://en.wikipedia.org/wiki/Tieluohan_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e84", + "name": "Huangjin Gui", + "slug": "huangjingui", + "altnames": "Golden Osmanthus, Golden Cassia", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Huang_Jin_Gui_Tea.jpeg/640px-Huang_Jin_Gui_Tea.jpeg", + "origin": "China", + "type": "oolong", + "caffeine": "0", + "caffeineLevel": "none", + "description": "A premium variety of Chinese oolong tea named after the yellow golden color of its budding leaves and its unique flowery aroma", + "colorDescription": "light yellow to light green", + "tasteDescription": "smooth sweet flavor with a rich slightly nutty after-taste", + "sources": [ + "https://en.wikipedia.org/wiki/Huangjin_Gui" + ] + }, + { + "_id": "63092102a643c85c74b00e70", + "name": "Wulong (oolong) Tea", + "slug": "wulong", + "caffeine": "37-55mg", + "image": "https://cdn.shopify.com/s/files/1/0888/8900/files/10_Wulong_Tea_Dan_Cong_480x480.jpg?v=1624849166", + "origin": "East Asia", + "type": "oolong", + "description": "A traditional semi-oxidized Chinese tea produced through a process including withering the plant under strong sun and oxidation before curling and twisting", + "colorDescription": "bright green or yellow, or dark amber and red", + "tasteDescription": "Similar to black tea, though varied oxidation levels results in widely varied tastes" + }, + { + "_id": "63092102a643c85c74b00e85", + "name": "Dòng Dǐng", + "slug": "dongding", + "altnames": "Tung-ting", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Dong_Ding_tea.jpg/640px-Dong_Ding_tea.jpg", + "origin": "Taiwan", + "type": "oolong", + "caffeine": "50-60mg", + "caffeineLevel": "moderate", + "description": "An oolong tea from Taiwan which translates to \"Frozen Summit\" or \"Icy Peak\", and is the name of the mountain in Taiwan where the tea is cultivated", + "colorDescription": "dark, army-green color with slight hints of brown", + "tasteDescription": "Conatins nutty notes, along with a smooth caramel-like flavor", + "sources": [ + "https://en.wikipedia.org/wiki/Dong_Ding_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e86", + "name": "Dongfang Meiren", + "slug": "dongfangmeiren", + "altnames": "White-tip oolong", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Dun-fan-mey-zhen-teashopby.jpg/640px-Dun-fan-mey-zhen-teashopby.jpg", + "origin": "Taiwan", + "type": "oolong", + "caffeine": "50-90mg", + "caffeineLevel": "high", + "description": "A heavily oxidized, non-roasted, tip-type oolong tea originating in Hsinchu County, Taiwan", + "colorDescription": "sweet-tasting ", + "tasteDescription": "bright reddish-orange", + "sources": [ + "https://en.wikipedia.org/wiki/Dongfang_meiren" + ] + }, + { + "_id": "63092102a643c85c74b00e88", + "name": "Ruan Zhi Oolong", + "slug": "ruanzhi", + "altnames": "", + "image": "https://tea-village.com/880/ruan-zhi-oolong-no-17.jpg", + "origin": "Taiwan", + "type": "oolong", + "caffeine": "50-90mg*", + "caffeineLevel": "high", + "description": "Ruan Zhi, or \"soft stem\", is a variety of oolong tea developed by the Taiwan Tea Experiment Station ", + "colorDescription": "light amber", + "tasteDescription": "oily flowery taste, with cherry tones.", + "sources": [ + "https://teapedia.org/en/Ruan_Zhi" + ] + }, + { + "_id": "63092102a643c85c74b00e87", + "name": "Baozhong", + "slug": "baozhong", + "altnames": "Pouchong", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Spring_pouchong_tea_leaves_on_plate.jpg/640px-Spring_pouchong_tea_leaves_on_plate.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "20-30mg", + "caffeineLevel": "low", + "description": "A lightly oxidized tea, twist shape, with floral notes, and usually not roasted", + "colorDescription": "mix of pale honey yellow and jade green, bright in color, and clear", + "tasteDescription": "grassy, floral notes and the taste of creamy green melon.", + "sources": [ + "https://en.wikipedia.org/wiki/Baozhong_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e89", + "name": "Jin Xuan", + "slug": "jinxuan", + "altnames": "Milk Oolong, Nai Xiang", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/Jin_Xuan_oolong_tea.jpg/480px-Jin_Xuan_oolong_tea.jpg", + "origin": "Taiwan", + "type": "oolong", + "caffeine": "10-20mg", + "caffeineLevel": "low", + "description": "A variety of oolong tea developed in 1980", + "colorDescription": "dark yellow", + "tasteDescription": "taste is light, creamy, and flowery and sometimes compared to milk", + "sources": [ + "https://en.wikipedia.org/wiki/Jin_Xuan_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e8a", + "name": "Assam Smoked Oolong", + "slug": "assamsmokedoolong", + "altnames": "", + "image": "https://5.imimg.com/data5/SELLER/Default/2022/4/TT/BS/EE/102193361/assam-oolong-2017-906x700-500x500.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "NA", + "caffeineLevel": "none", + "description": "Assam Smoked Oolong is a highly unusual and rare oak smoked tea from Mothola Tea Estate in Assam. ", + "colorDescription": "amber red", + "tasteDescription": "oaky, smokey, sweet, malty, has notes of apricots and tobacco", + "sources": [ + "" + ] + }, + { + "_id": "63092102a643c85c74b00e8b", + "name": "Baihoi Yinzhen", + "slug": "baihoiyinzhen", + "altnames": "Silder Needle, Yinzhen", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/6/6d/2010_FirstFlush_Yunnan_Baihao_Yinzhen.jpg/640px-2010_FirstFlush_Yunnan_Baihao_Yinzhen.jpg", + "origin": "China", + "type": "white", + "caffeine": "0-5mg", + "caffeineLevel": "very low", + "description": "A white tea made from only the top buds of the Camellia sinensis plant.", + "colorDescription": "light orange, light yellow", + "tasteDescription": "sweet, vegetal, and delicate", + "sources": [ + "https://en.wikipedia.org/wiki/Baihao_Yinzhen" + ] + }, + { + "_id": "63092102a643c85c74b00e8c", + "name": "Baimudan tea", + "slug": "baimudan", + "altnames": "White Peony tea, Mudan White tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Baimudan.JPG/640px-Baimudan.JPG", + "origin": "China", + "type": "white", + "caffeine": "15-30mg", + "caffeineLevel": "low", + "description": "A type of white tea made from plucks each with one leaf shoot and two immediate young leaves (one bud two leaf ratio) of the Camellia sinensis plant.", + "colorDescription": "golden yellow", + "tasteDescription": " toasty, slightly sweet floral notes and a clean aftertaste.", + "sources": [ + "https://en.wikipedia.org/wiki/Baimudan_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e8d", + "name": "Shoumei tea", + "slug": "shoumei", + "altnames": "Sow Mee", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Shou_Mei_tea.JPG/640px-Shou_Mei_tea.JPG", + "origin": "China", + "type": "white", + "caffeine": "15-30mg", + "caffeineLevel": "low", + "description": "A type of white tea produced from naturally withered upper leafs and tips", + "colorDescription": "darker green", + "tasteDescription": "sweet, vegetal, delicate", + "sources": [ + "https://en.wikipedia.org/wiki/Shoumei_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e8e", + "name": "Xue Ya", + "slug": "xueya", + "altnames": "Snow Buds, Phoenix Eye", + "image": "https://politesociety.co.uk/cdn/shop/products/image_74451ab2-1247-4a43-8425-598437c5763a.jpg?v=1673267445", + "origin": "China", + "type": "white", + "caffeine": "15-30mg", + "caffeineLevel": "low", + "description": "A complex white tea from Fuding in Fujian Province", + "colorDescription": "light yellow", + "tasteDescription": "smooth, juicy taste has clean notes of unripe fruits, light wood and just a touch of vegetal astringency.", + "sources": [ + "" + ] + }, + { + "_id": "63092102a643c85c74b00e8f", + "name": "Satemwa Antlers", + "slug": "satemwaantlers", + "altnames": "", + "image": "https://www.athirstfortea.com/cdn/shop/products/Satemwa-Antlers.jpg?v=1571264294", + "origin": "Malawi", + "type": "white", + "caffeine": "10-25mg", + "caffeineLevel": "moderate", + "description": "A white tea made from a blend of select Superior Cultivars from Malawi, making it rich in theanine and antioxidants.", + "colorDescription": "golden yellow", + "tasteDescription": "delicate sweetness of apricot and lychee lingers on the pallet", + "sources": [ + "" + ] + }, + { + "_id": "63092102a643c85c74b00e90", + "name": "Earl Grey", + "slug": "earlgrey", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/1/1d/Earl_Grey_Tea.jpg/640px-Earl_Grey_Tea.jpg", + "origin": "UK*", + "type": "blend", + "caffeine": "40-120mg", + "caffeineLevel": "very high", + "mainIngredients": "black tea, oil of bergamot", + "description": "A tea blend which has been flavoured with oil of bergamot", + "colorDescription": "amber, deep orange", + "tasteDescription": "smoky, earthy, spicy, nutty, citrus, caramel, leather, fruity, and honey", + "sources": [ + "https://en.wikipedia.org/wiki/Earl_Grey_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e7c", + "name": "Konacha", + "slug": "konacha", + "altnames": "Gyokurokonacha", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/38/Konacha.jpg/640px-Konacha.jpg", + "origin": "Japan", + "type": "green", + "caffeine": "based on plant growth", + "caffeineLevel": "varied", + "description": "A type of green tea, composed of the dust, tea buds and small leaves that are left behind after processing Gyokuro or Sencha", + "colorDescription": "intense green, deep green", + "tasteDescription": "mild, sweet, and grassy flavor with bitter after taste", + "sources": [ + "https://en.wikipedia.org/wiki/Konacha" + ] + }, + { + "_id": "63092102a643c85c74b00e92", + "name": "English Breakfast tea", + "slug": "englishbreakfast", + "altnames": "Breakfast tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/English_breakfast_tea_tin.jpg/536px-English_breakfast_tea_tin.jpg", + "origin": "UK", + "type": "blend", + "caffeine": "60-100mg", + "caffeineLevel": "very high", + "mainIngredients": "black tea (varied)", + "description": "a traditional blend of black teas from Assam, Ceylon, Keemun and Kenyan teas.", + "colorDescription": "deep amber", + "tasteDescription": "may be slightly sweet, bitter, or malty", + "sources": [ + "https://en.wikipedia.org/wiki/English_breakfast_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e94", + "name": "Masala Chai", + "slug": "masalachai", + "altnames": "Spiced tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Contents_of_a_bag_of_chai_tea.jpg/640px-Contents_of_a_bag_of_chai_tea.jpg", + "origin": "India", + "type": "blend", + "caffeine": "40-50mg", + "caffeineLevel": "high", + "mainIngredients": "assam tea, sugar, cardamom, black pepper, and ginger.", + "description": "An Indian tea beverage made by boiling black tea in milk and water with a mixture of aromatic herbs and spices", + "colorDescription": "brown, beige", + "tasteDescription": "fragrant, spiced, astringent and a strong flavor", + "sources": [ + "https://en.wikipedia.org/wiki/Masala_chai" + ] + }, + { + "_id": "63092102a643c85c74b00e93", + "name": "Irish Breakfast", + "slug": "irishbreakfast", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/a/ad/Milk_in_Irish_Breakfast_tea.jpg/480px-Milk_in_Irish_Breakfast_tea.jpg", + "origin": "UK", + "type": "blend", + "caffeine": "60-100mg", + "caffeineLevel": "very high", + "mainIngredients": "black tea (varied)", + "description": "A traditional blend of black teas from Assam and Ceylon teas. Because of its strength, it is most commonly served with milk.", + "colorDescription": "red, deep amber", + "tasteDescription": "Strong, malty, robust", + "sources": [ + "https://en.wikipedia.org/wiki/Irish_breakfast_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e95", + "name": "Russian Caravan", + "slug": "russiancaravan", + "altnames": "", + "image": "https://amanacoffeeandtea.com/cdn/shop/products/organic-russian-caravan-black-tea-1.jpg?v=1681234274", + "origin": "China", + "type": "blend", + "caffeine": "20-60mg", + "caffeineLevel": "high", + "mainIngredients": "oolong tea, keemun tea, lapsang souchong tea", + "description": "A chinese tea blended with various oolong and black teas that gets its name from tea trading through a traderoute that connected eastern Asia to Europe through Russia", + "colorDescription": "red, deep orange", + "tasteDescription": "sweet, malty, and smoky taste", + "sources": [ + "https://en.wikipedia.org/wiki/Russian_Caravan" + ] + }, + { + "_id": "63092102a643c85c74b00e81", + "name": "Bai Jiguan", + "slug": "baijiguan", + "altnames": "White Rooster", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Bai_Jiguan.jpg/600px-Bai_Jiguan.jpg", + "origin": "China", + "type": "oolong", + "caffeine": "20-30mg", + "caffeineLevel": "moderate", + "description": "A light Wuyi Mountain tea", + "colorDescription": "yellowish to light green", + "tasteDescription": "starts off sweet, uniquely fruity with a toasty floral honeyed aroma and finishes with a lingering mellow fruit and honey note", + "sources": [ + "https://en.wikipedia.org/wiki/Bai_Jiguan_tea" + ] + }, + { + "_id": "63092102a643c85c74b00e96", + "name": "Genmaicha", + "slug": "genmaicha", + "altnames": "Brown Rice Tea, Popcorn Tea", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Genmaicha.JPG/640px-Genmaicha.JPG", + "origin": "Japan", + "type": "blend", + "caffeine": "10mg", + "caffeineLevel": "low", + "mainIngredients": "green tea, brown rice", + "description": "A Japanese brown rice green tea consisting of green tea mixed with roasted popped brown rice.", + "colorDescription": "light yellow-green", + "tasteDescription": "toasty, nutty", + "sources": [ + "https://en.wikipedia.org/wiki/Genmaicha" + ] + }, + { + "_id": "63092102a643c85c74b00e91", + "name": "Lady Grey", + "slug": "ladygrey", + "altnames": "", + "image": "https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/TwiningsLadyGrey_low.jpg/640px-TwiningsLadyGrey_low.jpg", + "origin": "UK*", + "type": "blend", + "caffeine": "25-110mg", + "caffeineLevel": "high", + "mainIngredients": "black tea, oil of bergamot, lemon peel, orange Peel", + "description": "Lady Grey tea is a trademarked variation on Earl Grey tea. Like Earl Grey, it is a black tea flavoured with bergamot essential oil.", + "colorDescription": "lighter amber, orange", + "tasteDescription": "", + "sources": [ + "https://en.wikipedia.org/wiki/Lady_Grey_(tea)" + ] + }, + { + "_id": "63092102a643c85c74b00e97", + "name": "Jasmine Dragon Pearl", + "slug": "jasminedragonpearl", + "altnames": "", + "image": "https://www.harney.com/cdn/shop/products/Cup_Shots_Dragon_Pearl_Jasmine.jpg?v=15690076520", + "origin": "China", + "type": "blend", + "caffeine": "10-20mg", + "caffeineLevel": "low", + "mainIngredients": "green tea, white tea, jasmine flowers", + "description": "Dragon Pearl Jasmine is comprised of little, hand-rolled pearls gently infused with jasmine flowers", + "colorDescription": "clear light yellow", + "tasteDescription": "Jasmine, root beer, sweet, but yet a light/subtle feeling.", + "sources": [ + "" + ] + } +] \ No newline at end of file diff --git a/assets/images/user_profile/auto-group-oclv.png b/assets/images/user_profile/auto-group-oclv.png new file mode 100644 index 0000000..c97b5c3 Binary files /dev/null and b/assets/images/user_profile/auto-group-oclv.png differ diff --git a/assets/images/user_profile/bg-ysV.png b/assets/images/user_profile/bg-ysV.png new file mode 100644 index 0000000..0c368c4 Binary files /dev/null and b/assets/images/user_profile/bg-ysV.png differ diff --git a/assets/images/user_profile/float-btn-5hq.png b/assets/images/user_profile/float-btn-5hq.png new file mode 100644 index 0000000..1b1c367 Binary files /dev/null and b/assets/images/user_profile/float-btn-5hq.png differ diff --git a/assets/images/user_profile/group-62.png b/assets/images/user_profile/group-62.png new file mode 100644 index 0000000..f08f7e0 Binary files /dev/null and b/assets/images/user_profile/group-62.png differ diff --git a/assets/images/user_profile/line-business-profile-line.png b/assets/images/user_profile/line-business-profile-line.png new file mode 100644 index 0000000..3ab1ff7 Binary files /dev/null and b/assets/images/user_profile/line-business-profile-line.png differ diff --git a/assets/images/user_profile/line-communication-chat-quote-line.png b/assets/images/user_profile/line-communication-chat-quote-line.png new file mode 100644 index 0000000..8911ec7 Binary files /dev/null and b/assets/images/user_profile/line-communication-chat-quote-line.png differ diff --git a/assets/images/user_profile/line-media-notification-3-line.png b/assets/images/user_profile/line-media-notification-3-line.png new file mode 100644 index 0000000..a063d9f Binary files /dev/null and b/assets/images/user_profile/line-media-notification-3-line.png differ diff --git a/assets/images/user_profile/line-system-lock-2-line.png b/assets/images/user_profile/line-system-lock-2-line.png new file mode 100644 index 0000000..515e6f9 Binary files /dev/null and b/assets/images/user_profile/line-system-lock-2-line.png differ diff --git a/assets/images/user_profile/line-user-contacts-line.png b/assets/images/user_profile/line-user-contacts-line.png new file mode 100644 index 0000000..140342f Binary files /dev/null and b/assets/images/user_profile/line-user-contacts-line.png differ diff --git a/assets/images/user_profile/rectangle-51.png b/assets/images/user_profile/rectangle-51.png new file mode 100644 index 0000000..328c385 Binary files /dev/null and b/assets/images/user_profile/rectangle-51.png differ diff --git a/assets/images/user_profile/rectangle-6.png b/assets/images/user_profile/rectangle-6.png new file mode 100644 index 0000000..11d4885 Binary files /dev/null and b/assets/images/user_profile/rectangle-6.png differ diff --git a/assets/images/user_profile/scansvgrepocom-N6T.png b/assets/images/user_profile/scansvgrepocom-N6T.png new file mode 100644 index 0000000..e719661 Binary files /dev/null and b/assets/images/user_profile/scansvgrepocom-N6T.png differ diff --git a/assets/images/user_profile/top.png b/assets/images/user_profile/top.png new file mode 100644 index 0000000..084fa1e Binary files /dev/null and b/assets/images/user_profile/top.png differ diff --git a/assets/images/vector-8MD.png b/assets/images/vector-8MD.png new file mode 100644 index 0000000..ce5953b Binary files /dev/null and b/assets/images/vector-8MD.png differ diff --git a/assets/images/vector-SuD.png b/assets/images/vector-SuD.png new file mode 100644 index 0000000..ce5953b Binary files /dev/null and b/assets/images/vector-SuD.png differ diff --git a/assets/images/vector-UWj.png b/assets/images/vector-UWj.png new file mode 100644 index 0000000..ce5953b Binary files /dev/null and b/assets/images/vector-UWj.png differ diff --git a/assets/images/vector-pGX.png b/assets/images/vector-pGX.png new file mode 100644 index 0000000..ce5953b Binary files /dev/null and b/assets/images/vector-pGX.png differ diff --git a/assets/images_main_interface/assistant.png b/assets/images_main_interface/assistant.png new file mode 100644 index 0000000..82d6b76 Binary files /dev/null and b/assets/images_main_interface/assistant.png differ diff --git a/assets/images_main_interface/auto-group-ucn8.png b/assets/images_main_interface/auto-group-ucn8.png new file mode 100644 index 0000000..d869669 Binary files /dev/null and b/assets/images_main_interface/auto-group-ucn8.png differ diff --git a/assets/images_main_interface/book-albumsvgrepocom.png b/assets/images_main_interface/book-albumsvgrepocom.png new file mode 100644 index 0000000..17a8d52 Binary files /dev/null and b/assets/images_main_interface/book-albumsvgrepocom.png differ diff --git a/assets/images_main_interface/peperomia-obtusfolia.png b/assets/images_main_interface/peperomia-obtusfolia.png new file mode 100644 index 0000000..b42e78f Binary files /dev/null and b/assets/images_main_interface/peperomia-obtusfolia.png differ diff --git a/assets/images_main_interface/scansvgrepocom.png b/assets/images_main_interface/scansvgrepocom.png new file mode 100644 index 0000000..e719661 Binary files /dev/null and b/assets/images_main_interface/scansvgrepocom.png differ diff --git a/assets/images_main_interface/setting.png b/assets/images_main_interface/setting.png new file mode 100644 index 0000000..8c4bb60 Binary files /dev/null and b/assets/images_main_interface/setting.png differ diff --git a/assets/images_main_interface/stylelinear.png b/assets/images_main_interface/stylelinear.png new file mode 100644 index 0000000..c033f08 Binary files /dev/null and b/assets/images_main_interface/stylelinear.png differ diff --git a/assets/images_main_interface/vector-8vg.png b/assets/images_main_interface/vector-8vg.png new file mode 100644 index 0000000..69205ed Binary files /dev/null and b/assets/images_main_interface/vector-8vg.png differ diff --git a/assets/images_main_interface/vector-AHS.png b/assets/images_main_interface/vector-AHS.png new file mode 100644 index 0000000..9ce3e2f Binary files /dev/null and b/assets/images_main_interface/vector-AHS.png differ diff --git a/assets/images_main_interface/vector-ax4.png b/assets/images_main_interface/vector-ax4.png new file mode 100644 index 0000000..0c0a5ef Binary files /dev/null and b/assets/images_main_interface/vector-ax4.png differ diff --git a/assets/images_main_interface/vector.png b/assets/images_main_interface/vector.png new file mode 100644 index 0000000..ce64e9c Binary files /dev/null and b/assets/images_main_interface/vector.png differ diff --git a/assets/introsplash/chatbot.png b/assets/introsplash/chatbot.png new file mode 100644 index 0000000..87a8f96 Binary files /dev/null and b/assets/introsplash/chatbot.png differ diff --git a/assets/introsplash/teaprofile.png b/assets/introsplash/teaprofile.png new file mode 100644 index 0000000..11d5c7d Binary files /dev/null and b/assets/introsplash/teaprofile.png differ diff --git a/assets/introsplash/tree.png b/assets/introsplash/tree.png new file mode 100644 index 0000000..5779926 Binary files /dev/null and b/assets/introsplash/tree.png differ diff --git a/assets/splashscreen/Animation.json b/assets/splashscreen/Animation.json new file mode 100644 index 0000000..7b70ddf --- /dev/null +++ b/assets/splashscreen/Animation.json @@ -0,0 +1 @@ +{"nm":"Frame 6","v":"5.9.6","fr":60,"ip":0,"op":299,"w":263,"h":243,"ddd":0,"markers":[],"assets":[{"id":"778796669799b1b3fe275a658eb4004e177c081a","w":559,"h":446,"e":1,"u":"","p":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAi8AAAG+CAYAAABbBuQ/AAAAAXNSR0IArs4c6QAAIABJREFUeF7svQeUXWd57v/sesoUjapVZmTZliwDLtgmhN4xNZAQAqabYockBJLcJCu55N7kJv/cNAhJ/it3kZtCclMAm2IbG2wIJXAJ2BgbsI1tucmWZJXpZ07d9a73/fY+ZSTZsixZs2ee4yWfmVP2/vbv++Z8z3mrBd5IgARIgARIgARIoEAErAKNlUMlARIgARIgARIgAVC8cBGQAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQAAmQAAkUigDFS6Gmi4MlARIgARIgARKgeOEaIAESIAESIAESKBQBipdCTRcHSwIkQAIkQAIkQPHCNUACJEACJEACJFAoAhQvhZouDpYESIAESIAESIDihWuABEiABEiABEigUAQoXgo1XRwsCZAACZAACZAAxQvXAAmQAAmQAAmQQKEIULwUaro4WBIgARIgARIgAYoXrgESIAESIAESIIFCEaB4KdR0cbAkQAIkQAIkQAIUL1wDJEACJEACJEAChSJA8VKo6eJgSYAESIAESIAEKF64BkiABEiABEiABApFgOKlUNPFwZIACZAACZAACVC8cA2QAAmQ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SIAESIAESKBcBCheyuVvWksCJEACJEAChSdA8VJ4F9IAEiABEiABEigXAYqXcvmb1pIACZAACZBA4QlQvBTehTSABEiABEiABMpFgOKlXP6mtSRAAiRAAiRQeAIUL4V3IQ0gARIgARIggXIRoHgpl79pLQmQAAmQAAkUngDFS+FdSANIgARIgARIoFwEKF7K5W9aSwIkQAIkQAKFJ0DxUngX0gASIAESIAESKBcBipdy+ZvWkgAJkAAJkEDhCVC8FN6FNIAESIAESIAEykWA4qVc/qa1JEACJEACJFB4AhQvhXchDSABEiABEiCBchGgeCmXv2ktCZAACZAACRSeAMVL4V1IA0iABEiABEigXAQoXsrlb1pLAiRAAiRAAoUnQPFSeBfSABIgARIgARIoFwGKl3L5m9aSAAmQAAmQQOEJULwU3oU0gARIgARIgATKRYDipVz+prUkQAIkQAIkUHgCFC+FdyENIAESIAESIIFyEaB4KZe/aS0JkAAJkAAJFJ4AxUvhXUgDSIAESIAESKBcBCheyuVvWksCJEACJEAChSdA8VJ4F9IAEiABEiABEigXAYqXcvmb1pIACZAACZBA4QlQvBTehTSABEiABEiABMpFgOKlXP6mtSRAAiRAAiRQeAIUL4V3IQ0gARIgARIggXIRoHgpl79pLQmQAAmQAAkUngDFS+FdSANIgARIgARIoFwEKF7K5W9aSwIkQAIkQAKFJ0DxUngX0gASIAESIAESKBcBipdy+ZvWkgAJkAAJkEDhCVC8FN6FNIAESIAESIAEykWA4qVc/qa1JEACJEACJFB4AhQvhXchDSABEiABEiCBchGgeCmXv2ktCZAACZAACRSeAMVL4V1IA0iABEiABEigXAQoXsrlb1pLAiRAAiRAAoUnQPFSeBfSABIgARIgARIoFwGKl3L5m9aSAAmQAAmQQOEJULwU3oU0gARIgARIgATKRYDipVz+prUkQAIkQAIkUHgCFC+FdyENIAESIAESIIFyEaB4KZe/aS0JkAAJkAAJFJ4AxUvhXUgDSIAESIAESKBcBCheyuVvWksCJEACJEAChSdA8VJ4F9IAEiABEiABEigXAYqXcvmb1pIACZAACZBA4QlQvBTehTSABEiABEiABMpFgOKlXP6mtSRAAiRAAiRQeAIUL4V3IQ0gARIgARIggXIRoHgpl79pLQmQAAmQAAkUngDFS+FdSANIgARIgARIoFwEKF7K5W9aSwIkQAIkQAKFJ0DxUngX0gASIAESIAESKBcBipdy+ZvWkgAJkAAJkEDhCVC8FN6FNIAESIAESIAEykWA4qVc/qa1JEACJEACJFB4AhQvhXchDSABEiABEiCBchGgeCmXv2ktCZAACZAACRSeAMVL4V1IA0iABEiABEigXAQoXsrlb1pLAiRAAiRAAoUnQPFSeBfSABIgARIgARIoFwGKl3L5m9aSAAmQAAmQQOEJULwU3oU0gARIgARIgATKReD/A97VvHAKMCcXAAAAAElFTkSuQmCC"},{"id":"0d1b4cbb196ebe57c98ebb30e9aaa893eb8d4373","w":559,"h":446,"e":1,"u":"","p":"data:image/png;base64,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"},{"nm":"Frame 6","fr":60,"id":"ltvk178yqukzepk9j3","layers":[{"ty":3,"ddd":0,"ind":5,"hd":false,"nm":"Frame 6 - Null","ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"st":0,"ip":0,"op":300,"bm":0,"sr":1},{"ty":3,"ddd":0,"ind":6,"hd":false,"nm":"TEAHUB - Null","parent":5,"ks":{"a":{"a":0,"k":[31.5,10]},"o":{"a":1,"k":[{"t":89.4,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":137.4,"s":[0]}]},"p":{"a":1,"k":[{"t":89.4,"s":[130.5,184],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]},"ti":[0,0],"to":[0,0]},{"t":137.4,"s":[193.5,184]}]},"r":{"a":1,"k":[{"t":0,"s":[0],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":18.000000000000004,"s":[30],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":36.00000000000001,"s":[-20],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":53.99999999999999,"s":[10],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":72.00000000000001,"s":[-5],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":90,"s":[0]}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"st":0,"ip":0,"op":300,"bm":0,"sr":1},{"ty":4,"ddd":0,"ind":7,"hd":false,"nm":"TEAHUB","parent":6,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":89.4,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":137.4,"s":[0]}]}},"st":0,"ip":0,"op":300,"bm":0,"sr":1,"shapes":[{"ty":"gr","nm":"Group","hd":false,"np":11,"it":[{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[4.056,16],[4.056,5.288],[0.112,5.288],[0.112,4.16],[9.296,4.16],[9.296,5.288],[5.352,5.288],[5.352,16],[4.056,16]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[10.7583,16],[10.7583,4.16],[18.0863,4.16],[18.0863,5.256],[12.0463,5.256],[12.0463,14.904],[18.1663,14.904],[18.1663,16],[10.7583,16]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[11.5743,10.472],[11.5743,9.376],[17.3022,9.376],[17.3022,10.472],[11.5743,10.472]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[18.6851,16],[22.9331,4.16],[24.7651,4.16],[29.0131,16],[27.6931,16],[23.7251,4.776],[23.9491,4.776],[19.9811,16],[18.6851,16]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[20.9091,12.168],[21.2131,11.072],[26.4771,11.072],[26.7811,12.168],[20.9091,12.168]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[30.602,16],[30.602,4.16],[31.898,4.16],[31.898,9.336],[38.154,9.336],[38.154,4.16],[39.458,4.16],[39.458,16],[38.154,16],[38.154,10.512],[31.898,10.512],[31.898,16],[30.602,16]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[46.4925,16.152],[44.0125,15.656],[42.5725,14.136],[42.1085,11.52],[42.1085,4.16],[43.4045,4.16],[43.4045,11.664],[44.1485,14.224],[46.4925,15.032],[48.8445,14.224],[49.5885,11.664],[49.5885,4.16],[50.8525,4.16],[50.8525,11.52],[50.3885,14.136],[48.9645,15.656],[46.4925,16.152],[46.4925,16.152]],"i":[[0,0],[0.6453,0.3307],[0.3147,0.6827],[0,1.056],[0,0],[0,0],[0,0],[-0.496,-0.5387],[-1.0613,0],[-0.496,0.5387],[0,1.168],[0,0],[0,0],[0,0],[0.3093,-0.688],[0.6453,-0.3307],[1.008,0],[0,0]],"o":[[-1.0080000000000027,0],[-0.6452999999999989,-0.3307000000000002],[-0.30930000000000035,-0.6880000000000006],[0,0],[0,0],[0,0],[0,1.1679999999999993],[0.5013000000000005,0.5387000000000004],[1.0720000000000027,0],[0.4960000000000022,-0.5387000000000004],[0,0],[0,0],[0,0],[0,1.056000000000001],[-0.30400000000000205,0.6827000000000005],[-0.6400000000000006,0.3307000000000002],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[56.4126,16.104],[55.4526,16.08],[54.4846,16.016],[53.4926,15.912],[53.4926,4.36],[54.4926,4.184],[55.5726,4.072],[56.7486,4.032],[59.3406,4.384],[60.8206,5.432],[61.2926,7.192],[61.0446,8.456],[60.2606,9.424],[58.8606,9.952],[58.8766,9.84],[60.9486,10.776],[61.6286,12.784],[61.3406,14.216],[60.4366,15.256],[58.8206,15.888],[56.4126,16.104],[56.4126,16.104]],"i":[[0,0],[0.3254,0.016],[0.3254,0.0267],[0.336,0.0427],[0,0],[-0.3413,0.048],[-0.3733,0.0267],[-0.4106,0],[-0.6666,-0.2347],[-0.3146,-0.4693],[0,-0.7093],[0.1654,-0.3893],[0.3574,-0.2613],[0.576,-0.0907],[0,0],[-0.4533,-0.5173],[0,-0.8213],[0.192,-0.416],[0.416,-0.2827],[0.6667,-0.144],[0.944,0],[0,0]],"o":[[-0.31459999999999866,0],[-0.3200000000000003,-0.015999999999998238],[-0.3252999999999986,-0.026699999999999946],[0,0],[0.3254000000000019,-0.06932999999999989],[0.34669999999999845,-0.04800000000000004],[0.3733999999999966,-0.026670000000000194],[1.061399999999999,0],[0.671999999999997,0.22933000000000003],[0.314700000000002,0.4640000000000004],[0,0.45333000000000023],[-0.165300000000002,0.38400000000000034],[-0.35730000000000217,0.2613299999999992],[0,0],[0.9279999999999973,0.10666999999999938],[0.453400000000002,0.5173000000000005],[0,0.5387000000000004],[-0.18659999999999854,0.4107000000000003],[-0.4106000000000023,0.2773000000000003],[-0.6612999999999971,0.14400000000000013],[0,0],[0,0]]}}},{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[56.6766,15.072],[58.8846,14.816],[60.0446,14.048],[60.3966,12.744],[59.6526,11.008],[57.3166,10.448],[54.5886,10.448],[54.5886,9.4],[57.0846,9.4],[58.8046,9.16],[59.7486,8.44],[60.0446,7.24],[59.3166,5.576],[56.8606,5.064],[55.7166,5.112],[54.7726,5.232],[54.7726,14.96],[55.6926,15.048],[56.6766,15.072],[56.6766,15.072]],"i":[[0,0],[-0.5386,0.1707],[-0.2293,0.3413],[0,0.5227],[0.496,0.3733],[1.0667,0],[0,0],[0,0],[0,0],[-0.432,0.16],[-0.192,0.32],[0,0.48],[0.4854,0.336],[1.1574,0],[0.3307,-0.032],[0.2987,-0.0533],[0,0],[-0.304,-0.016],[-0.3466,0],[0,0]],"o":[[0.9333999999999989,0],[0.5439999999999969,-0.17070000000000007],[0.23469999999999658,-0.34670000000000023],[0,-0.7840000000000007],[-0.4906000000000006,-0.3733000000000004],[0,0],[0,0],[0,0],[0.7147000000000006,0],[0.4373999999999967,-0.16000000000000014],[0.1974000000000018,-0.3200000000000003],[0,-0.7733299999999996],[-0.4799999999999969,-0.34133000000000013],[-0.43200000000000216,0],[-0.3305999999999969,0.026670000000000194],[0,0],[0.30939999999999657,0.04269999999999996],[0.30939999999999657,0.016000000000000014],[0,0],[0,0]]}}},{"ty":"gf","o":{"a":0,"k":100},"g":{"p":2,"k":{"a":0,"k":[0,0.37254901960784315,0.8549019607843137,0.8549019607843137,1,0.13333333333333333,0.2784313725490196,0.2784313725490196,0,1,1,1]}},"s":{"a":0,"k":[0,10]},"e":{"a":0,"k":[63,10]},"t":1,"nm":"Fill","hd":false,"r":1},{"ty":"tr","a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":0,"k":100}}]}]},{"ty":3,"ddd":0,"ind":8,"hd":false,"nm":"image 2 - Null","parent":5,"ks":{"a":{"a":0,"k":[113.5,90.5]},"o":{"a":1,"k":[{"t":103.99999999999993,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":151.99999999999994,"s":[0]}]},"p":{"a":1,"k":[{"t":103.99999999999993,"s":[131.5,121.5],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]},"ti":[0,0],"to":[0,0]},{"t":151.99999999999994,"s":[358.5,121.5]}]},"r":{"a":1,"k":[{"t":0,"s":[0],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":18.000000000000004,"s":[30],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":36.00000000000001,"s":[-20],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":53.99999999999999,"s":[10],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":72.00000000000001,"s":[-5],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":90,"s":[0]}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"st":0,"ip":0,"op":300,"bm":0,"sr":1},{"ty":4,"ddd":0,"ind":9,"hd":false,"nm":"image 2 - Shape Mask","parent":8,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":103.99999999999993,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":151.99999999999994,"s":[0]}]}},"st":0,"ip":0,"op":300,"bm":0,"sr":1,"shapes":[{"ty":"gr","nm":"Group","hd":false,"np":3,"it":[{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[0,0],[227,0],[227,0],[227,181],[227,181],[0,181],[0,181],[0,0]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"fl","o":{"a":0,"k":100},"c":{"a":0,"k":[0,1,0,1]},"nm":"Fill","hd":false,"r":1},{"ty":"tr","a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"td":1},{"ty":2,"ddd":0,"ind":10,"hd":false,"nm":"image 2","parent":8,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,-0.05635062611806063]},"s":{"a":0,"k":[40.608228980322004,40.608228980322]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":103.99999999999993,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":151.99999999999994,"s":[0]}]}},"st":0,"ip":0,"op":300,"bm":0,"sr":1,"refId":"778796669799b1b3fe275a658eb4004e177c081a","tt":1},{"ty":3,"ddd":0,"ind":11,"hd":false,"nm":"image 1 - Null","parent":5,"ks":{"a":{"a":0,"k":[136,116.5]},"o":{"a":1,"k":[{"t":103.99999999999993,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":151.99999999999994,"s":[0]}]},"p":{"a":1,"k":[{"t":103.99999999999993,"s":[132,121.5],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]},"ti":[0,0],"to":[0,0]},{"t":151.99999999999994,"s":[404,121.5]}]},"r":{"a":1,"k":[{"t":0,"s":[0],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":18.000000000000004,"s":[30],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":36.00000000000001,"s":[-20],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":53.99999999999999,"s":[10],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":72.00000000000001,"s":[-5],"o":{"x":[0.5],"y":[0]},"i":{"x":[0.5],"y":[1]}},{"t":90,"s":[0]}]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"st":0,"ip":0,"op":300,"bm":0,"sr":1},{"ty":4,"ddd":0,"ind":12,"hd":false,"nm":"image 1 - Shape Mask","parent":11,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":103.99999999999993,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":151.99999999999994,"s":[0]}]}},"st":0,"ip":0,"op":300,"bm":0,"sr":1,"shapes":[{"ty":"gr","nm":"Group","hd":false,"np":3,"it":[{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[0,0],[272,0],[272,0],[272,233],[272,233],[0,233],[0,233],[0,0]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"fl","o":{"a":0,"k":100},"c":{"a":0,"k":[0,1,0,1]},"nm":"Fill","hd":false,"r":1},{"ty":"tr","a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"td":1},{"ty":2,"ddd":0,"ind":13,"hd":false,"nm":"image 1","parent":11,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[52.242152466367706,52.242152466367706]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":1,"k":[{"t":103.99999999999993,"s":[100],"o":{"x":[0.5],"y":[0.35]},"i":{"x":[0.15],"y":[1]}},{"t":151.99999999999994,"s":[0]}]}},"st":0,"ip":0,"op":300,"bm":0,"sr":1,"refId":"0d1b4cbb196ebe57c98ebb30e9aaa893eb8d4373","tt":1},{"ty":4,"ddd":0,"ind":14,"hd":false,"nm":"Frame 6","parent":5,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"st":0,"ip":0,"op":300,"bm":0,"sr":1,"shapes":[{"ty":"gr","nm":"Group","hd":false,"np":3,"it":[{"ty":"sh","nm":"Path","hd":false,"ks":{"a":0,"k":{"c":true,"v":[[0,0],[263,0],[263,0],[263,243],[263,243],[0,243],[0,243],[0,0]],"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]}}},{"ty":"gf","o":{"a":0,"k":28.999999165534966},"g":{"p":2,"k":{"a":0,"k":[0.3206430077552795,0.0784313725490196,0.9686274509803922,0.807843137254902,0.5370110273361206,0.6352941176470588,0.8274509803921568,0.6039215686274509,0.3206430077552795,1,0.5370110273361206,1]}},"s":{"a":0,"k":[131.5,-7.439729629454895e-15]},"e":{"a":0,"k":[131.5,242.99999999999997]},"t":1,"nm":"Fill","hd":false,"r":1},{"ty":"tr","a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":0,"k":100}}]}]}]}],"layers":[{"ty":3,"ddd":0,"ind":5,"hd":false,"nm":"Frame 6 - Null","ks":{"a":{"a":0,"k":[0,0]},"o":{"a":0,"k":100},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0}},"st":0,"ip":0,"op":300,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":0,"nm":"Frame 6","refId":"ltvk178yqukzepk9j3","sr":1,"ks":{"a":{"a":0,"k":[0,0]},"p":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"r":{"a":0,"k":0},"o":{"a":0,"k":100}},"ao":0,"w":263,"h":243,"ip":0,"op":300,"st":0,"hd":false,"bm":0}],"meta":{"a":"","d":"","tc":"","g":"Aninix"}} \ No newline at end of file diff --git a/assets/splashscreen/loader.json b/assets/splashscreen/loader.json new file mode 100644 index 0000000..22b6173 --- /dev/null +++ b/assets/splashscreen/loader.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.1.0","a":"","k":"","d":"","tc":"#-1ffff"},"fr":50,"ip":0,"op":100,"w":1920,"h":1080,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.177],"y":[1]},"o":{"x":[0.619],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.347],"y":[1]},"o":{"x":[0.806],"y":[0]},"t":50,"s":[360]},{"t":100,"s":[720]}],"ix":10},"p":{"a":0,"k":[960,540,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"ip":0,"op":100.1001001001,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":2,"ty":4,"nm":"Ellipse 5","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[100]},{"t":97.91796875,"s":[80]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":[-5.422,30.78,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[-32.529,184.683,0],"to":[0,0,0],"ti":[-5.422,30.78,0]},{"t":97.91796875,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 4 Stroke","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8.332,"s":[0.1012,0.8188,0.3882,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83.332,"s":[0.1012,0.8188,0.3882,1]},{"t":91.66796875,"s":[0.1327,0.8873,0.4345,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 4 Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":100.1001001001,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":3,"ty":4,"nm":"Ellipse 4","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[100]},{"t":97.91796875,"s":[80]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":[-31.447,3.79,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[-188.683,22.739,0],"to":[0,0,0],"ti":[-31.447,3.79,0]},{"t":97.91796875,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 4 Stroke","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8.332,"s":[0.1024,0.9376,0.4365,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83.332,"s":[0.1024,0.9376,0.4365,1]},{"t":91.66796875,"s":[0.1327,0.8873,0.4345,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 4 Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":100.1001001001,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":4,"ty":4,"nm":"Ellipse 3","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[100]},{"t":97.91796875,"s":[80]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":[28.75,12.877,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[172.499,77.265,0],"to":[0,0,0],"ti":[28.75,12.877,0]},{"t":97.91796875,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 3 Stroke","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8.332,"s":[0.3059,0.7961,0.5059,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83.332,"s":[0.3059,0.7961,0.5059,1]},{"t":91.66796875,"s":[0.1327,0.8873,0.4345,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 3 Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":100.1001001001,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":5,"ty":4,"nm":"Ellipse 2","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":50,"s":[100]},{"t":97.91796875,"s":[80]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":null,"ti":null},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[134,-134,0],"to":null,"ti":null},{"t":97.91796875,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 2 Stroke","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8.332,"s":[0.069,0.851,0.3818,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83.332,"s":[0.069,0.851,0.3818,1]},{"t":91.66796875,"s":[0.1327,0.8873,0.4345,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 2 Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":100.1001001001,"st":0,"bm":0,"completed":true},{"ddd":0,"ind":6,"ty":4,"nm":"Ellipse 1","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.188],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[80]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.899],"y":[-0.919]},"t":50,"s":[100]},{"t":97.91796875,"s":[80]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[0,0,0],"to":[-14.904,-28.412,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[-89.422,-170.473,0],"to":[0,0,0],"ti":[-14.904,-28.412,0]},{"t":97.91796875,"s":[0,0,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"op","nm":"Offset Paths 1","a":{"a":0,"k":-0.5,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 1 Stroke","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false,"_render":true},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[118,118],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false,"_render":true},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":8.332,"s":[0.28,0.92,0.536,1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":83.332,"s":[0.28,0.92,0.536,1]},{"t":91.66796875,"s":[0.1327,0.8873,0.4345,1]}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false,"_render":true},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform","_render":true}],"nm":"Ellipse 1 Fill","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false,"_render":true}],"ip":0,"op":100.1001001001,"st":0,"bm":0,"completed":true}],"markers":[],"__complete":true} \ No newline at end of file diff --git a/assets/teaPage/hamburger_menu.png b/assets/teaPage/hamburger_menu.png new file mode 100644 index 0000000..2d9a6ec Binary files /dev/null and b/assets/teaPage/hamburger_menu.png differ diff --git a/assets/teaPage/notification_icon.png b/assets/teaPage/notification_icon.png new file mode 100644 index 0000000..4a2b0bd Binary files /dev/null and b/assets/teaPage/notification_icon.png differ diff --git a/assets/teabot.png b/assets/teabot.png new file mode 100644 index 0000000..f46bb6b Binary files /dev/null and b/assets/teabot.png differ diff --git a/assets/weather_animation/clear_day.json b/assets/weather_animation/clear_day.json new file mode 100644 index 0000000..a2595ff --- /dev/null +++ b/assets/weather_animation/clear_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-clearsky","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"ray-l","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[120]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[150]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[180]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[210]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[240]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[270]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[300]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[330]},{"t":100,"s":[360]}],"ix":10},"p":{"a":0,"k":[135,66,0],"ix":2},"a":{"a":0,"k":[11,22,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[9.37,0],[0,-24.85]],"o":[[-7.19,-4.95],[-24.71,0],[0,0]],"v":[[35,-14.66],[9.75,-22.5],[-35,22.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[10.525,21.373],"ix":2},"a":{"a":0,"k":[10.525,21.373],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ray-l","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"ray-r","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":16,"s":[60]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[90]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[120]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[150]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[180]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":56,"s":[210]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":64,"s":[240]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[270]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":80,"s":[300]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[330]},{"t":100,"s":[360]}],"ix":10},"p":{"a":0,"k":[135.5,65.75,0],"ix":2},"a":{"a":0,"k":[-22,-21.75,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,24.85]],"o":[[24.85,0],[0,0]],"v":[[-22.5,22.5],[22.5,-22.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ray-r","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-3,"op":102,"st":7,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"sun","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[135,66,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[70,70],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"sun","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[68.277,68.277],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":40,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.396,-0.844],"ix":2},"a":{"a":0,"k":[-0.153,-0.731],"ix":1},"s":{"a":0,"k":[120.056,120.056],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":72,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[135.5,65.75,0],"ix":2},"a":{"a":0,"k":[88.5,-80.25,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":72,"s":[200,200,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-17.042,18.458,0],"ti":[17.042,-18.458,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[21.25,-17.75,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[103,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.850980401039,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.588235318661,0.850980401039,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.655,0.937,1,0.5,0.567,0.825,1,1,0.478,0.714,1],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/clear_night.json b/assets/weather_animation/clear_night.json new file mode 100644 index 0000000..c739923 --- /dev/null +++ b/assets/weather_animation/clear_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-clearsky","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"stars","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"moon-spot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[148.4,72.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.2,11.2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"moon-spot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[116.8,66.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.8,8.8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"moon-spot-large","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[142.8,55.6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[17.6,17.6],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot-large","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"moon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[134,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.929411768913,0.870588243008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[134,62,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[134,134,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53.5,114.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.5,134.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,162.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":1,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[100,100,100]},{"t":95,"s":[70,70,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.85,126.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"comment 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[149.81,94.35,0],"to":[0,-0.833,0],"ti":[15.099,-16.165,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[149.31,94.85,0],"to":[-28.718,30.744,0],"ti":[11.439,-13.207,0]},{"t":101,"s":[62.975,187.288,0]}],"ix":2},"a":{"a":0,"k":[-0.104,-0.208,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-0.652],[6.379,-6.119],[0.756,0.002],[0.077,1.171],[-0.623,2.371],[-2.577,2.525],[-2.423,0.471],[-1.223,-0.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.152,-0.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"commet","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":104,"st":15,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"comment","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[0]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[122.975,60.288,0],"to":[-18.333,21.167,0],"ti":[18.333,-21.167,0]},{"t":99,"s":[12.975,187.288,0]}],"ix":2},"a":{"a":0,"k":[-0.104,-0.208,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-0.652],[6.379,-6.119],[0.756,0.002],[0.077,1.171],[-0.623,2.371],[-2.577,2.525],[-2.423,0.471],[-1.223,-0.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.152,-0.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"commet","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[71.85,71.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.85,91.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.85,112.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"moon","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[131,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784313725,0.427450980392,0.760784313725,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705882353,0.8,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.702,0.902,0.5,0.608,0.467,0.778,1,0.298,0.231,0.655],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/cloudy_day.json b/assets/weather_animation/cloudy_day.json new file mode 100644 index 0000000..dc4c1b5 --- /dev/null +++ b/assets/weather_animation/cloudy_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-brokenclouds","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"cloud-small","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,68,0],"to":[1.333,0.417,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70.5,0],"to":[0,0,0],"ti":[1.333,0.417,0]},{"t":101,"s":[49.5,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.66,0],[-3.71,-3.81],[-0.2,-5.48],[-1.77,-2.13],[0,-3.18],[2.35,-2.35],[3.59,0],[0,0],[0,0],[2.35,2.35],[0,3.59],[-2.35,2.35],[-3.59,0],[0,0],[0,0],[-3.49,3.58]],"o":[[5.66,0],[3.54,3.62],[2.77,0.72],[1.91,2.28],[0,3.59],[-2.35,2.35],[0,0],[0,0],[-3.59,0],[-2.35,-2.35],[0,-3.59],[2.35,-2.35],[0,0],[0,0],[0.25,-5.4],[3.71,-3.81]],"v":[[3,-23],[17.5,-16.84],[23.49,-2.8],[30.45,1.62],[33.5,10],[29.69,19.19],[20.5,23],[20.5,23],[-20.5,23],[-29.69,19.19],[-33.5,10],[-29.69,0.81],[-20.5,-3],[-20.5,-3],[-17.48,-3],[-11.5,-16.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-14.987,-2.784],"ix":5},"e":{"a":0,"k":[24.236,24.103],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"cloud-small-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,67.5,0],"to":[1.333,0.417,0],"ti":[0.083,-0.083,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70,0],"to":[-0.083,0.083,0],"ti":[1.417,0.333,0]},{"t":101,"s":[49,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.22,0],[-4.08,-4.18],[-0.53,-5.42],[-1.73,-2.08],[0,-3.67],[2.71,-2.72],[3.98,-0.1],[0,0],[0,0],[2.72,2.71],[0,4.14],[-2.71,2.72],[-3.98,0.1],[0,0],[0,0],[-3.4,3.49]],"o":[[6.22,0],[3.55,3.65],[2.6,0.95],[2.19,2.63],[0,4.14],[-2.63,2.62],[0,0],[0,0],[-4.14,0],[-2.71,-2.72],[0,-4.14],[2.63,-2.62],[0,0],[0,0],[0.65,-5.14],[4.08,-4.18]],"v":[[3,-25],[18.94,-18.24],[25.39,-4.3],[31.99,0.34],[35.5,10],[31.11,20.61],[20.91,24.99],[20.91,24.99],[-20.5,25],[-31.11,20.61],[-35.5,10],[-31.11,-0.61],[-20.91,-4.99],[-20.91,-4.99],[-19.31,-5],[-12.94,-18.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small-shadow","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"ray-l","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":101,"s":[360]}],"ix":10},"p":{"a":0,"k":[90,57.5,0],"ix":2},"a":{"a":0,"k":[8,17.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.49,0],[0,-19.88]],"o":[[-5.75,-3.95],[-19.77,0],[0,0]],"v":[[28,-11.73],[7.8,-18],[-28,18]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ray-l","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"sun","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,58.8,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"sun","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[57.203,57.203],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.862745098039,0.474509803922,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.283,0.192],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.625,114.625],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.850980401039,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.482352942228,0.729411780834,0.949019610882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.459,0.725,0.871,0.5,0.365,0.627,0.853,1,0.271,0.529,0.835],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/cloudy_night.json b/assets/weather_animation/cloudy_night.json new file mode 100644 index 0000000..15c4f8b --- /dev/null +++ b/assets/weather_animation/cloudy_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-brokenclouds","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53.5,114.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.5,134.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,162.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":1,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[100,100,100]},{"t":95,"s":[70,70,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.85,126.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"comment","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[0]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[122.975,60.288,0],"to":[-18.333,21.167,0],"ti":[18.333,-21.167,0]},{"t":99,"s":[12.975,187.288,0]}],"ix":2},"a":{"a":0,"k":[-0.104,-0.208,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-0.652],[6.379,-6.119],[0.756,0.002],[0.077,1.171],[-0.623,2.371],[-2.577,2.525],[-2.423,0.471],[-1.223,-0.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.152,-0.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"commet","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[71.85,71.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.85,91.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.85,112.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"moon-spot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.4,62.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.2,11.2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"moon-spot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[76.8,56.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.8,8.8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"moon-spot-large","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[102.8,45.6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[17.6,17.6],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot-large","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"moon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94,52,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.929411768913,0.870588243008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94,52,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[110,110,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"cloud-small","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,68,0],"to":[1.333,0.417,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70.5,0],"to":[0,0,0],"ti":[1.333,0.417,0]},{"t":101,"s":[49.5,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.66,0],[-3.71,-3.81],[-0.2,-5.48],[-1.77,-2.13],[0,-3.18],[2.35,-2.35],[3.59,0],[0,0],[0,0],[2.35,2.35],[0,3.59],[-2.35,2.35],[-3.59,0],[0,0],[0,0],[-3.49,3.58]],"o":[[5.66,0],[3.54,3.62],[2.77,0.72],[1.91,2.28],[0,3.59],[-2.35,2.35],[0,0],[0,0],[-3.59,0],[-2.35,-2.35],[0,-3.59],[2.35,-2.35],[0,0],[0,0],[0.25,-5.4],[3.71,-3.81]],"v":[[3,-23],[17.5,-16.84],[23.49,-2.8],[30.45,1.62],[33.5,10],[29.69,19.19],[20.5,23],[20.5,23],[-20.5,23],[-29.69,19.19],[-33.5,10],[-29.69,0.81],[-20.5,-3],[-20.5,-3],[-17.48,-3],[-11.5,-16.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-14.987,-2.784],"ix":5},"e":{"a":0,"k":[24.236,24.103],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"cloud-small-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,67.5,0],"to":[1.333,0.417,0],"ti":[0.083,-0.083,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70,0],"to":[-0.083,0.083,0],"ti":[1.417,0.333,0]},{"t":101,"s":[49,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.22,0],[-4.08,-4.18],[-0.53,-5.42],[-1.73,-2.08],[0,-3.67],[2.71,-2.72],[3.98,-0.1],[0,0],[0,0],[2.72,2.71],[0,4.14],[-2.71,2.72],[-3.98,0.1],[0,0],[0,0],[-3.4,3.49]],"o":[[6.22,0],[3.55,3.65],[2.6,0.95],[2.19,2.63],[0,4.14],[-2.63,2.62],[0,0],[0,0],[-4.14,0],[-2.71,-2.72],[0,-4.14],[2.63,-2.62],[0,0],[0,0],[0.65,-5.14],[4.08,-4.18]],"v":[[3,-25],[18.94,-18.24],[25.39,-4.3],[31.99,0.34],[35.5,10],[31.11,20.61],[20.91,24.99],[20.91,24.99],[-20.5,25],[-31.11,20.61],[-35.5,10],[-31.11,-0.61],[-20.91,-4.99],[-20.91,-4.99],[-19.31,-5],[-12.94,-18.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small-shadow","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"stars","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"moon","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784313725,0.427450980392,0.760784313725,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705882353,0.8,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.702,0.902,0.5,0.608,0.467,0.778,1,0.298,0.231,0.655],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/loading.json b/assets/weather_animation/loading.json new file mode 100644 index 0000000..60f03b2 --- /dev/null +++ b/assets/weather_animation/loading.json @@ -0,0 +1 @@ +{"v":"4.8.0","meta":{"g":"LottieFiles AE 1.0.0","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":100,"h":100,"nm":"loader","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":10},"p":{"a":0,"k":[62,62,0],"ix":2},"a":{"a":0,"k":[0.576,4.576,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.152,89.152],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50.1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[70.1]},{"t":59.0000024031193,"s":[50.1]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[49.9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[29.9]},{"t":59.0000024031193,"s":[49.9]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.2,0.7372549019607844,0.30196078431372547,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.576,4.576],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":10},"p":{"a":0,"k":[62,62,0],"ix":2},"a":{"a":0,"k":[0.576,4.576,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.152,89.152],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50.1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[70.1]},{"t":59.0000024031193,"s":[50.1]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[49.9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[19.9]},{"t":59.0000024031193,"s":[49.9]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.25098039215686274,0.6627450980392157,0.32941176470588235,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.576,4.576],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":10},"p":{"a":0,"k":[62,62,0],"ix":2},"a":{"a":0,"k":[0.576,4.576,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.152,89.152],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50.1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[70.1]},{"t":59.0000024031193,"s":[50.1]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[49.9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[9.9]},{"t":59.0000024031193,"s":[49.9]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.19607843137254902,0.5372549019607843,0.2784313725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.576,4.576],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":10},"p":{"a":0,"k":[62,62,0],"ix":2},"a":{"a":0,"k":[0.576,4.576,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[89.152,89.152],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[50.1]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[70.1]},{"t":59.0000024031193,"s":[50.1]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[49.9]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[0]},{"t":59.0000024031193,"s":[49.9]}],"ix":2},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.836]},"o":{"x":[0.167],"y":[0.164]},"t":0,"s":[0]},{"t":59.0000024031193,"s":[360]}],"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.14901960784313725,0.396078431372549,0.20784313725490197,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0.576,4.576],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":90.0000036657751,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Pre-comp 1","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":180,"ix":10},"p":{"a":0,"k":[50,50,0],"ix":2},"a":{"a":0,"k":[62,62,0],"ix":1},"s":{"a":0,"k":[75,75,100],"ix":6}},"ao":0,"w":124,"h":124,"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/mist_day.json b/assets/weather_animation/mist_day.json new file mode 100644 index 0000000..213b6b0 --- /dev/null +++ b/assets/weather_animation/mist_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-mist","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud-misty","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,92,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.52,-5.52],[0,-8.42],[0.12,-1.08],[-1.78,-2.72],[0,-3.64],[3.26,-3.26],[4.97,0],[3.3,3.68],[0,0],[0,0],[1.45,1.44],[0,2.21],[-1.44,1.45],[-2.21,0],[0,0],[0,0],[0,2.09],[-3.8,3.8],[-5.8,0],[-1.03,-0.15],[-4.86,3.39],[-6.49,0]],"o":[[8.42,0],[5.52,5.52],[0,1.11],[2.95,1.42],[1.87,2.83],[0,4.97],[-3.26,3.26],[-5.33,0],[0,0],[0,0],[-2.21,0],[-1.44,-1.45],[0,-2.21],[1.45,-1.44],[0,0],[0,0],[-0.57,-1.9],[0,-5.8],[3.8,-3.8],[1.07,0],[2.22,-5.58],[4.95,-3.45],[0,0]],"v":[[20,-34],[41.57,-25.07],[50.5,-3.5],[50.32,-0.21],[57.55,6.13],[60.5,16],[55.23,28.73],[42.5,34],[29.08,28],[29.08,28],[-52.5,28],[-58.16,25.66],[-60.5,20],[-58.16,14.34],[-52.5,12],[-52.5,12],[-31.63,12],[-32.5,6],[-26.35,-8.85],[-11.5,-15],[-8.35,-14.77],[2.55,-28.52],[20,-34]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.937,0.937,0.5,0.882,0.882,0.882,1,0.827,0.827,0.827],"ix":9}},"s":{"a":0,"k":[-27.066,-4.116],"ix":5},"e":{"a":0,"k":[43.77,35.631],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-misty","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"cloud-misty-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,92,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.34,0],[-6.25,-6.24],[0,-9.53],[0.01,-0.35],[-1.68,-2.54],[0,-4.46],[3.98,-3.98],[6.08,0],[3.9,3.56],[0,0],[0,0],[2.17,2.17],[0,3.31],[-2.17,2.18],[-3.16,0.1],[0,0],[0,0],[0,0.67],[-4.52,4.53],[-6.9,0],[-0.23,-0.01],[-4.68,3.27]],"o":[[9.53,0],[6.24,6.25],[0,0.35],[2.56,1.66],[2.27,3.47],[0,6.08],[-3.98,3.98],[-5.7,0],[0,0],[0,0],[-3.31,0],[-2.17,-2.18],[0,-3.31],[2.09,-2.08],[0,0],[0,0],[-0.05,-0.66],[0,-6.9],[4.53,-4.52],[0.22,0],[2.58,-5.14],[5.59,-3.91]],"v":[[20,-38],[44.4,-27.9],[54.5,-3.5],[54.48,-2.45],[60.9,3.93],[64.5,16],[58.06,31.56],[42.5,38],[27.71,32.28],[27.71,32.28],[-52.51,32],[-60.99,28.49],[-64.5,20],[-60.99,11.51],[-52.88,8.01],[-52.88,8.01],[-36.42,8],[-36.5,6],[-29.18,-11.68],[-11.5,-19],[-10.83,-18.99],[0.26,-31.8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-misty","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"mist-long","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114,141.5,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[109,141.5,0],"to":[0,0,0],"ti":[-0.833,0,0]},{"t":101,"s":[114,141.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[160,100,100]},{"t":100,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[48,9],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.937,0.937,0.5,0.882,0.882,0.882,1,0.827,0.827,0.827],"ix":9}},"s":{"a":0,"k":[-10.737,-0.545],"ix":5},"e":{"a":0,"k":[17.363,4.716],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"mist-long","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"mist-short","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[106.5,129.5,0],"to":[-2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[91.5,129.5,0],"to":[0,0,0],"ti":[-2.5,0,0]},{"t":101,"s":[106.5,129.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[63,9],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.937,0.937,0.5,0.882,0.882,0.882,1,0.827,0.827,0.827],"ix":9}},"s":{"a":0,"k":[-14.092,-0.545],"ix":5},"e":{"a":0,"k":[22.789,4.716],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"mist-short","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"cloud-small","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[62.5,83,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[57.5,83,0],"to":[0,0,0],"ti":[-0.833,0,0]},{"t":101,"s":[62.5,83,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.96,0],[-2.25,-2.17],[-0.2,-3.2],[0,-2.04],[1.27,-1.41],[1.83,-0.31],[2.58,0],[1.32,0.97],[0.96,-0.59],[1.57,0],[1.37,0.98],[0.66,1.43],[1.21,1.29],[0,2.11],[-1.44,1.45],[-2.21,0],[0,0],[0,0],[-1.98,1.59]],"o":[[3.37,0],[2.17,2.09],[1.26,1.41],[0,2.05],[-1.18,1.33],[-1.46,1.89],[-1.77,0],[-0.67,0.93],[-1.26,0.79],[-1.77,0],[-1.22,-0.89],[-1.83,-0.27],[-1.34,-1.43],[0,-2.21],[1.45,-1.44],[0,0],[0,0],[0.72,-2.5],[2.14,-1.71]],"v":[[5,-15],[13.68,-11.49],[17.47,-3.32],[19.5,2],[17.46,7.33],[12.83,9.89],[6.5,13],[1.77,11.45],[-0.7,13.76],[-5,15],[-9.78,13.45],[-12.66,9.92],[-17.34,7.47],[-19.5,2],[-17.16,-3.66],[-11.5,-6],[-11.5,-6],[-7,-6],[-2.81,-12.26]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"mist-lense","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":101,"s":[20]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.389,110.145,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,-100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.22,2.94],[-2.75,29.71],[9.74,12.44],[9.64,3.61],[16.77,-3.87],[4.37,-3.69],[-3.32,0],[31.69,-5.24],[-9.23,-0.9],[-17.35,0],[9.65,0],[4.5,0],[2.43,-2.58],[-15.3,-9.27],[-21.677,-2.664]],"o":[[10.26,-3.65],[1.71,-18.42],[-7.41,-9.46],[-9.21,-3.46],[-2.05,0.48],[-5.53,4.68],[21.73,0],[-2.46,0.41],[15.26,6.27],[11.86,0],[-9.66,0],[-29.58,0],[-6.48,6.84],[21.5,13.03],[14.372,1.766]],"v":[[7.635,63.049],[46.505,7.059],[33.915,-40.861],[4.295,-63.051],[-38.135,-66.281],[-26.955,-53.511],[-44.905,-41.461],[-34.935,-24.531],[-18.375,-18.271],[-42.765,-5.741],[-13.385,1.309],[-30.615,6.789],[-20.805,17.899],[-39.545,30.159],[-33.685,68.059]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.729411780834,0.776470601559,0.815686285496,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.761,0.855,0.875,0.5,0.482,0.584,0.657,1,0.204,0.314,0.439],"ix":9}},"s":{"a":0,"k":[46.122,-47.958],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[63,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.537254929543,0.568627476692,0.592156887054,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/mist_night.json b/assets/weather_animation/mist_night.json new file mode 100644 index 0000000..de1f237 --- /dev/null +++ b/assets/weather_animation/mist_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-mist","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud-misty","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,92,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.52,-5.52],[0,-8.42],[0.12,-1.08],[-1.78,-2.72],[0,-3.64],[3.26,-3.26],[4.97,0],[3.3,3.68],[0,0],[0,0],[1.45,1.44],[0,2.21],[-1.44,1.45],[-2.21,0],[0,0],[0,0],[0,2.09],[-3.8,3.8],[-5.8,0],[-1.03,-0.15],[-4.86,3.39],[-6.49,0]],"o":[[8.42,0],[5.52,5.52],[0,1.11],[2.95,1.42],[1.87,2.83],[0,4.97],[-3.26,3.26],[-5.33,0],[0,0],[0,0],[-2.21,0],[-1.44,-1.45],[0,-2.21],[1.45,-1.44],[0,0],[0,0],[-0.57,-1.9],[0,-5.8],[3.8,-3.8],[1.07,0],[2.22,-5.58],[4.95,-3.45],[0,0]],"v":[[20,-34],[41.57,-25.07],[50.5,-3.5],[50.32,-0.21],[57.55,6.13],[60.5,16],[55.23,28.73],[42.5,34],[29.08,28],[29.08,28],[-52.5,28],[-58.16,25.66],[-60.5,20],[-58.16,14.34],[-52.5,12],[-52.5,12],[-31.63,12],[-32.5,6],[-26.35,-8.85],[-11.5,-15],[-8.35,-14.77],[2.55,-28.52],[20,-34]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.937,0.937,0.5,0.882,0.882,0.882,1,0.827,0.827,0.827],"ix":9}},"s":{"a":0,"k":[-27.066,-4.116],"ix":5},"e":{"a":0,"k":[43.77,35.631],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-misty","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"cloud-misty-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[115.5,92,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.34,0],[-6.25,-6.24],[0,-9.53],[0.01,-0.35],[-1.68,-2.54],[0,-4.46],[3.98,-3.98],[6.08,0],[3.9,3.56],[0,0],[0,0],[2.17,2.17],[0,3.31],[-2.17,2.18],[-3.16,0.1],[0,0],[0,0],[0,0.67],[-4.52,4.53],[-6.9,0],[-0.23,-0.01],[-4.68,3.27]],"o":[[9.53,0],[6.24,6.25],[0,0.35],[2.56,1.66],[2.27,3.47],[0,6.08],[-3.98,3.98],[-5.7,0],[0,0],[0,0],[-3.31,0],[-2.17,-2.18],[0,-3.31],[2.09,-2.08],[0,0],[0,0],[-0.05,-0.66],[0,-6.9],[4.53,-4.52],[0.22,0],[2.58,-5.14],[5.59,-3.91]],"v":[[20,-38],[44.4,-27.9],[54.5,-3.5],[54.48,-2.45],[60.9,3.93],[64.5,16],[58.06,31.56],[42.5,38],[27.71,32.28],[27.71,32.28],[-52.51,32],[-60.99,28.49],[-64.5,20],[-60.99,11.51],[-52.88,8.01],[-52.88,8.01],[-36.42,8],[-36.5,6],[-29.18,-11.68],[-11.5,-19],[-10.83,-18.99],[0.26,-31.8]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-misty","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"mist-long","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114,141.5,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[109,141.5,0],"to":[0,0,0],"ti":[-0.833,0,0]},{"t":101,"s":[114,141.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":76,"s":[160,100,100]},{"t":100,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[48,9],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.937,0.937,0.5,0.882,0.882,0.882,1,0.827,0.827,0.827],"ix":9}},"s":{"a":0,"k":[-10.737,-0.545],"ix":5},"e":{"a":0,"k":[17.363,4.716],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"mist-long","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"mist-short","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[106.5,129.5,0],"to":[-2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[91.5,129.5,0],"to":[0,0,0],"ti":[-2.5,0,0]},{"t":101,"s":[106.5,129.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[63,9],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":5,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.937,0.937,0.937,0.5,0.882,0.882,0.882,1,0.827,0.827,0.827],"ix":9}},"s":{"a":0,"k":[-14.092,-0.545],"ix":5},"e":{"a":0,"k":[22.789,4.716],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"mist-short","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"cloud-small","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[62.5,83,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[57.5,83,0],"to":[0,0,0],"ti":[-0.833,0,0]},{"t":101,"s":[62.5,83,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.96,0],[-2.25,-2.17],[-0.2,-3.2],[0,-2.04],[1.27,-1.41],[1.83,-0.31],[2.58,0],[1.32,0.97],[0.96,-0.59],[1.57,0],[1.37,0.98],[0.66,1.43],[1.21,1.29],[0,2.11],[-1.44,1.45],[-2.21,0],[0,0],[0,0],[-1.98,1.59]],"o":[[3.37,0],[2.17,2.09],[1.26,1.41],[0,2.05],[-1.18,1.33],[-1.46,1.89],[-1.77,0],[-0.67,0.93],[-1.26,0.79],[-1.77,0],[-1.22,-0.89],[-1.83,-0.27],[-1.34,-1.43],[0,-2.21],[1.45,-1.44],[0,0],[0,0],[0.72,-2.5],[2.14,-1.71]],"v":[[5,-15],[13.68,-11.49],[17.47,-3.32],[19.5,2],[17.46,7.33],[12.83,9.89],[6.5,13],[1.77,11.45],[-0.7,13.76],[-5,15],[-9.78,13.45],[-12.66,9.92],[-17.34,7.47],[-19.5,2],[-17.16,-3.66],[-11.5,-6],[-11.5,-6],[-7,-6],[-2.81,-12.26]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"mist-lense","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75,"s":[100]},{"t":101,"s":[20]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[68.389,110.145,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,-100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8.22,2.94],[-2.75,29.71],[9.74,12.44],[9.64,3.61],[16.77,-3.87],[4.37,-3.69],[-3.32,0],[31.69,-5.24],[-9.23,-0.9],[-17.35,0],[9.65,0],[4.5,0],[2.43,-2.58],[-15.3,-9.27],[-21.677,-2.664]],"o":[[10.26,-3.65],[1.71,-18.42],[-7.41,-9.46],[-9.21,-3.46],[-2.05,0.48],[-5.53,4.68],[21.73,0],[-2.46,0.41],[15.26,6.27],[11.86,0],[-9.66,0],[-29.58,0],[-6.48,6.84],[21.5,13.03],[14.372,1.766]],"v":[[7.635,63.049],[46.505,7.059],[33.915,-40.861],[4.295,-63.051],[-38.135,-66.281],[-26.955,-53.511],[-44.905,-41.461],[-34.935,-24.531],[-18.375,-18.271],[-42.765,-5.741],[-13.385,1.309],[-30.615,6.789],[-20.805,17.899],[-39.545,30.159],[-33.685,68.059]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.611764729023,0.498039215803,0.690196096897,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.69,0.498,0.678,0.5,0.465,0.339,0.606,1,0.239,0.18,0.533],"ix":9}},"s":{"a":0,"k":[46.122,-47.958],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[63,75,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784339905,0.427450984716,0.760784327984,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/partly_cloudy_day.json b/assets/weather_animation/partly_cloudy_day.json new file mode 100644 index 0000000..4808cb3 --- /dev/null +++ b/assets/weather_animation/partly_cloudy_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":""},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-fewclouds","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[125,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[94.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[125,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[125,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[94.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[125,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"ray-l","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":101,"s":[360]}],"ix":10},"p":{"a":0,"k":[90,57.5,0],"ix":2},"a":{"a":0,"k":[8,17.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.49,0],[0,-19.88]],"o":[[-5.75,-3.95],[-19.77,0],[0,0]],"v":[[28,-11.73],[7.8,-18],[-28,18]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ray-l","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"sun","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,58.8,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"sun","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[57.203,57.203],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.862745098039,0.474509803922,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.283,0.192],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.625,114.625],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.850980401039,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.588235318661,0.850980401039,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.655,0.937,1,0.5,0.567,0.825,1,1,0.478,0.714,1],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/partly_cloudy_night.json b/assets/weather_animation/partly_cloudy_night.json new file mode 100644 index 0000000..bd75b08 --- /dev/null +++ b/assets/weather_animation/partly_cloudy_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-fewclouds","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":0,"nm":"stars","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"moon-spot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[108.4,62.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[11.2,11.2],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"moon-spot","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[76.8,56.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[8.8,8.8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"moon-spot-large","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[102.8,45.6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[17.6,17.6],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.941176474094,0.843137264252,0.749019622803,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon-spot-large","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"moon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94,52,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156863213,0.929411768913,0.870588243008,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94,52,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[110,110,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"moon","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53.5,114.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.5,134.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,162.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":1,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":43,"s":[100,100,100]},{"t":95,"s":[70,70,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.85,126.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"comment 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":57,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[149.81,94.35,0],"to":[0,-0.833,0],"ti":[15.099,-16.165,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":57,"s":[149.31,94.85,0],"to":[-28.718,30.744,0],"ti":[11.439,-13.207,0]},{"t":101,"s":[62.975,187.288,0]}],"ix":2},"a":{"a":0,"k":[-0.104,-0.208,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-0.652],[6.379,-6.119],[0.756,0.002],[0.077,1.171],[-0.623,2.371],[-2.577,2.525],[-2.423,0.471],[-1.223,-0.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.152,-0.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"commet","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":104,"st":15,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"comment","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[0]},{"t":99,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[122.975,60.288,0],"to":[-18.333,21.167,0],"ti":[18.333,-21.167,0]},{"t":99,"s":[12.975,187.288,0]}],"ix":2},"a":{"a":0,"k":[-0.104,-0.208,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-0.652],[6.379,-6.119],[0.756,0.002],[0.077,1.171],[-0.623,2.371],[-2.577,2.525],[-2.423,0.471],[-1.223,-0.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-0.152,-0.163],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"commet","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[71.85,71.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.85,91.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.85,112.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"moon","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[131,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784313725,0.427450980392,0.760784313725,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.964705882353,0.8,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.918,0.702,0.902,0.5,0.608,0.467,0.778,1,0.298,0.231,0.655],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/partly_rain_day.json b/assets/weather_animation/partly_rain_day.json new file mode 100644 index 0000000..36a3645 --- /dev/null +++ b/assets/weather_animation/partly_rain_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-rain","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"rain-bkgnd 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[105.25,46.438,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":65,"s":[105.25,135.188,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"rain-bkgnd 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[83.75,95.188,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":66,"s":[83.75,183.938,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rain-bkgnd 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[71,58.438,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[71,158.438,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rain-bkgnd 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[76,40,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[76,140,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rain-bkgnd 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[87,62.75,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[87,162.75,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rain-bkgnd 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82.5,52.5,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[82.5,152.5,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"rain-bkgnd 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,85,0],"to":[0,8.375,0],"ti":[0,-8.375,0]},{"t":65,"s":[100,135.25,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"rain-bkgnd","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,78.25,0],"to":[0,11.625,0],"ti":[0,-11.625,0]},{"t":65,"s":[75,148,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"drop-right-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[150.833,102,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[150.833,227,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[146.439,102.124,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[146.439,227.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-left-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[118.833,112,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-left","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114.439,112.124,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"drop-left-second-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[118.833,99.5,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[118.833,169.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"drop-left-second","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[114.439,99.624,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[114.439,169.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"drop-left-next-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[143.833,72,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[143.833,134.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[143.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"drop-left-next","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[139.439,72.124,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[139.439,134.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[139.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.850980401039,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[102.5,124.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":11,"op":76,"st":11,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[65,87.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":27,"op":71,"st":27,"bm":0},{"ddd":0,"ind":20,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[150,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":19,"op":83,"st":17,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.482352942228,0.729411780834,0.949019610882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.459,0.725,0.871,0.5,0.365,0.627,0.853,1,0.271,0.529,0.835],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":-4,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/partly_rain_night.json b/assets/weather_animation/partly_rain_night.json new file mode 100644 index 0000000..5012e74 --- /dev/null +++ b/assets/weather_animation/partly_rain_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-rain","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53.5,114.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.5,134.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.5,162.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.85,126.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"star 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[71.85,71.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.85,91.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.85,112.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"rain-bkgnd 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[105.25,46.438,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":65,"s":[105.25,135.188,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"rain-bkgnd 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[83.75,95.188,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":66,"s":[83.75,183.938,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rain-bkgnd 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[71,58.438,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[71,158.438,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rain-bkgnd 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[76,40,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[76,140,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rain-bkgnd 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[87,62.75,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[87,162.75,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rain-bkgnd 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82.5,52.5,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[82.5,152.5,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"rain-bkgnd 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,85,0],"to":[0,8.375,0],"ti":[0,-8.375,0]},{"t":65,"s":[100,135.25,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"rain-bkgnd","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,78.25,0],"to":[0,11.625,0],"ti":[0,-11.625,0]},{"t":65,"s":[75,148,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"stars","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-right-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[150.833,102,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[150.833,227,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[146.439,102.124,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[146.439,227.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-left-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[118.833,112,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"drop-left","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114.439,112.124,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"drop-left-second-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[118.833,99.5,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[118.833,169.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"drop-left-second","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[114.439,99.624,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[114.439,169.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"drop-left-next-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[143.833,72,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[143.833,134.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[143.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"drop-left-next","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[139.439,72.124,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[139.439,134.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[139.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784339905,0.427450984716,0.760784327984,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"rain-bkgnd","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[102.5,124.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":11,"op":76,"st":11,"bm":0},{"ddd":0,"ind":20,"ty":0,"nm":"rain-bkgnd","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[65,87.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":27,"op":71,"st":27,"bm":0},{"ddd":0,"ind":21,"ty":0,"nm":"rain-bkgnd","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[150,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":19,"op":83,"st":17,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.611764729023,0.498039215803,0.690196096897,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.69,0.498,0.678,0.5,0.465,0.339,0.606,1,0.239,0.18,0.533],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":-4,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/rain_day.json b/assets/weather_animation/rain_day.json new file mode 100644 index 0000000..10c96c4 --- /dev/null +++ b/assets/weather_animation/rain_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-showerrain","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"oval","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53,163.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[15,15],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.905882358551,0.572549045086,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path 2 Copy 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[61.082,169.296,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.29,3.61],[-0.01,-4.61],[-2.79,0],[0.01,4.7]],"o":[[-1.48,3.58],[0.01,4.73],[2.79,0],[-0.01,-4.66]],"v":[[0.1,-9],[-6,2.54],[-0.07,9],[6,2.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path 2 Copy 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43.688,168.6,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.29,3.61],[-0.01,-4.61],[-2.79,0],[0.01,4.7]],"o":[[-1.48,3.58],[0.01,4.73],[2.79,0],[-0.01,-4.66]],"v":[[0.1,-9],[-6,2.54],[-0.07,9],[6,2.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":60,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Path 2 Copy 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[61.082,159.096,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.29,3.61],[-0.01,-4.61],[-2.79,0],[0.01,4.7]],"o":[[-1.48,3.58],[0.01,4.73],[2.79,0],[-0.01,-4.66]],"v":[[0.1,-9],[-6,2.54],[-0.07,9],[6,2.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":120,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Path 2 Copy 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[43.688,158.4,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.29,3.61],[-0.01,-4.61],[-2.79,0],[0.01,4.7]],"o":[[-1.48,3.58],[0.01,4.73],[2.79,0],[-0.01,-4.66]],"v":[[0.1,-9],[-6,2.54],[-0.07,9],[6,2.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":120,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Path 2 Copy 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.088,153,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,-100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.29,3.61],[-0.01,-4.61],[-2.79,0],[0.01,4.7]],"o":[[-1.48,3.58],[0.01,4.73],[2.79,0],[-0.01,-4.66]],"v":[[0.1,-9],[-6,2.54],[-0.07,9],[6,2.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2 Copy 4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Path 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[52.088,174,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.29,3.61],[-0.01,-4.61],[-2.79,0],[0.01,4.7]],"o":[[-1.48,3.58],[0.01,4.73],[2.79,0],[-0.01,-4.66]],"v":[[0.1,-9],[-6,2.54],[-0.07,9],[6,2.63]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"drop-4-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[116.417,128.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[101.417,128.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[116.417,128.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-4-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"drop-4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114.219,128.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.219,128.562,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[114.219,128.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"drop-5-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[132.417,128.5,0],"to":[-2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[117.417,128.5,0],"to":[0,0,0],"ti":[-2.5,0,0]},{"t":101,"s":[132.417,128.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-5-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130.219,128.562,0],"to":[-2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[115.219,128.562,0],"to":[0,0,0],"ti":[-2.5,0,0]},{"t":101,"s":[130.219,128.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-6-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[105.417,148.5,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[100.417,148.5,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[108.358,148.5,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[105.417,148.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-6-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[103.219,148.562,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[98.219,148.562,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[106.16,148.562,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[103.219,148.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"drop-7-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[121.417,148.5,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[116.417,148.5,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[124.358,148.5,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[121.417,148.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-7-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"drop-7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[119.219,148.562,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[114.219,148.562,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[122.16,148.562,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[119.219,148.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-7","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"drop-1-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[48.917,109.5,0],"to":[1.375,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[57.167,109.5,0],"to":[0,0,0],"ti":[1.375,0,0]},{"t":101,"s":[48.917,109.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-1-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"drop-1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[46.719,109.562,0],"to":[1.375,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[54.969,109.562,0],"to":[0,0,0],"ti":[1.375,0,0]},{"t":101,"s":[46.719,109.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"drop-2-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":1.375,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[37.917,129.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[42.917,129.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[37.917,129.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-2-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":1.375,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[35.719,129.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[40.719,129.562,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[35.719,129.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-3-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[53.917,132,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[58.917,132,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":101,"s":[53.917,132,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-3-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[51.719,132.062,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[56.719,132.062,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":101,"s":[51.719,132.062,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"rain-bkgnd 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[83.75,83.938,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[83.75,183.938,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"rain-bkgnd 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[71,58.438,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[71,158.438,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rain-bkgnd 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[76,40,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[76,140,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rain-bkgnd 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[87,62.75,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[87,162.75,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rain-bkgnd 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82.5,52.5,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[82.5,152.5,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rain-bkgnd","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,78.25,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[75,178.25,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"flower","refId":"comp_0","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":88,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[83.5,156,0],"to":[2.75,-9.333,0],"ti":[-2.75,9.333,0]},{"t":82,"s":[100,100,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[100,100,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82,"s":[100,100,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":40,"s":[30,30,100]},{"t":82,"s":[100,100,100]}],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"leaf","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":82,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[54.5,178.128,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[0,0,100]},{"t":73,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.8,-3.35],[0,4.42],[9.02,0],[0,0]],"o":[[7.8,3.35],[0,-4.42],[-9.01,0],[0,0]],"v":[[5.46,5.872],[19.5,0.872],[3.17,-7.128],[-19.5,1.772]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.631372570992,0.89411765337,0.443137258291,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":180,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"leaf","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"rain-four-drops","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"cloud-small","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,68,0],"to":[1.333,0.417,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70.5,0],"to":[0,0,0],"ti":[1.333,0.417,0]},{"t":101,"s":[49.5,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.66,0],[-3.71,-3.81],[-0.2,-5.48],[-1.77,-2.13],[0,-3.18],[2.35,-2.35],[3.59,0],[0,0],[0,0],[2.35,2.35],[0,3.59],[-2.35,2.35],[-3.59,0],[0,0],[0,0],[-3.49,3.58]],"o":[[5.66,0],[3.54,3.62],[2.77,0.72],[1.91,2.28],[0,3.59],[-2.35,2.35],[0,0],[0,0],[-3.59,0],[-2.35,-2.35],[0,-3.59],[2.35,-2.35],[0,0],[0,0],[0.25,-5.4],[3.71,-3.81]],"v":[[3,-23],[17.5,-16.84],[23.49,-2.8],[30.45,1.62],[33.5,10],[29.69,19.19],[20.5,23],[20.5,23],[-20.5,23],[-29.69,19.19],[-33.5,10],[-29.69,0.81],[-20.5,-3],[-20.5,-3],[-17.48,-3],[-11.5,-16.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-14.987,-2.784],"ix":5},"e":{"a":0,"k":[24.236,24.103],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"cloud-small-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,67.5,0],"to":[1.333,0.417,0],"ti":[0.083,-0.083,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70,0],"to":[-0.083,0.083,0],"ti":[1.417,0.333,0]},{"t":101,"s":[49,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.22,0],[-4.08,-4.18],[-0.53,-5.42],[-1.73,-2.08],[0,-3.67],[2.71,-2.72],[3.98,-0.1],[0,0],[0,0],[2.72,2.71],[0,4.14],[-2.71,2.72],[-3.98,0.1],[0,0],[0,0],[-3.4,3.49]],"o":[[6.22,0],[3.55,3.65],[2.6,0.95],[2.19,2.63],[0,4.14],[-2.63,2.62],[0,0],[0,0],[-4.14,0],[-2.71,-2.72],[0,-4.14],[2.63,-2.62],[0,0],[0,0],[0.65,-5.14],[4.08,-4.18]],"v":[[3,-25],[18.94,-18.24],[25.39,-4.3],[31.99,0.34],[35.5,10],[31.11,20.61],[20.91,24.99],[20.91,24.99],[-20.5,25],[-31.11,20.61],[-35.5,10],[-31.11,-0.61],[-20.91,-4.99],[-20.91,-4.99],[-19.31,-5],[-12.94,-18.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small-shadow","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"rain-three-drops","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,100,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[105,100,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":101,"s":[100,100,0]}],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ray-l","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":101,"s":[360]}],"ix":10},"p":{"a":0,"k":[90,57.5,0],"ix":2},"a":{"a":0,"k":[8,17.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[7.49,0],[0,-19.88]],"o":[[-5.75,-3.95],[-19.77,0],[0,0]],"v":[[28,-11.73],[7.8,-18],[-28,18]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"ray-l","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"sun","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,58.8,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[56,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"sun","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[57.203,57.203],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":0,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.862745098039,0.474509803922,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0.283,0.192],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[114.625,114.625],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":32,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":77,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":77,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":56,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":77,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":56,"s":[100,100,100]},{"t":77,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.850980401039,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[102.5,124.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":73,"op":121,"st":73,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[82.5,139.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":40,"op":88,"st":40,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[67.5,90,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":54,"op":102,"st":54,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[65,87.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":27,"op":93,"st":27,"bm":0},{"ddd":0,"ind":18,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[150,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":19,"op":66,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[130,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":36,"op":102,"st":36,"bm":0},{"ddd":0,"ind":20,"ty":0,"nm":"rain-bkgnd","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[110,130,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":15,"op":81,"st":15,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.482352942228,0.729411780834,0.949019610882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.459,0.725,0.871,0.5,0.365,0.627,0.853,1,0.271,0.529,0.835],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/rain_night.json b/assets/weather_animation/rain_night.json new file mode 100644 index 0000000..ca48d02 --- /dev/null +++ b/assets/weather_animation/rain_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-showerrain","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[53.5,144.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[123.5,134.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[77.5,160.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[30,30,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":60,"s":[100,100,100]},{"t":95,"s":[70,70,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.09,-3.5],[1.23,-1.23],[3.5,-0.09],[1.23,1.23],[-0.09,3.5],[-1.23,1.23],[-3.5,-0.09],[-1.23,-1.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.501960813999],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91.85,126.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"star 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[71.85,71.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[41.85,101.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"star","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[87.85,112.85,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-0.05,-1.85],[0.65,-0.65],[1.85,-0.05],[0.65,0.65],[-0.05,1.85],[-0.65,0.65],[-1.85,-0.05],[-0.65,-0.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"star","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"drop-4-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[116.417,128.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[101.417,128.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[116.417,128.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-4-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"drop-4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114.219,128.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.219,128.562,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[114.219,128.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-4","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"drop-5-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[132.417,128.5,0],"to":[-2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[117.417,128.5,0],"to":[0,0,0],"ti":[-2.5,0,0]},{"t":101,"s":[132.417,128.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-5-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130.219,128.562,0],"to":[-2.5,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[115.219,128.562,0],"to":[0,0,0],"ti":[-2.5,0,0]},{"t":101,"s":[130.219,128.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-6-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[105.417,148.5,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[100.417,148.5,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[108.358,148.5,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[105.417,148.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-6-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[103.219,148.562,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[98.219,148.562,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[106.16,148.562,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[103.219,148.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-6","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"drop-7-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[121.417,148.5,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[116.417,148.5,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[124.358,148.5,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[121.417,148.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-7-shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"drop-7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[119.219,148.562,0],"to":[-0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[114.219,148.562,0],"to":[0,0,0],"ti":[-1.396,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[122.16,148.562,0],"to":[0.897,0,0],"ti":[-0.326,0,0]},{"t":101,"s":[119.219,148.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-7","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"drop-1-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[48.917,109.5,0],"to":[1.375,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[57.167,109.5,0],"to":[0,0,0],"ti":[1.375,0,0]},{"t":101,"s":[48.917,109.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-1-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"drop-1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[46.719,109.562,0],"to":[1.375,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[54.969,109.562,0],"to":[0,0,0],"ti":[1.375,0,0]},{"t":101,"s":[46.719,109.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"drop-2-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":1.375,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[37.917,129.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[42.917,129.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[37.917,129.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-2-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":1.375,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[35.719,129.562,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[40.719,129.562,0],"to":[0,0,0],"ti":[0,0,0]},{"t":101,"s":[35.719,129.562,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-3-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[53.917,132,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[58.917,132,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":101,"s":[53.917,132,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.15,3.02],[-0.01,-3.91],[-2.43,0],[0.01,3.99]],"o":[[-1.29,3.03],[0.01,4],[2.42,0],[-0.01,-3.94]],"v":[[2.073,-7.5],[-2.917,2.03],[2.243,7.5],[-0.227,1.27]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-3-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[51.719,132.062,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[56.719,132.062,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":101,"s":[51.719,132.062,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,3.03],[-0.01,-3.88],[-2.43,0],[0.01,3.95]],"o":[[-1.28,3],[0.01,3.97],[2.42,0],[-0.01,-3.91]],"v":[[0.081,-7.562],[-5.219,2.138],[-0.059,7.558],[5.221,2.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-3","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784339905,0.427450984716,0.760784327984,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"rain-bkgnd 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[83.75,83.938,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[83.75,183.938,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"rain-bkgnd 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[71,58.438,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[71,158.438,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rain-bkgnd 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[76,40,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[76,140,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rain-bkgnd 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[87,62.75,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[87,162.75,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rain-bkgnd 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82.5,52.5,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[82.5,152.5,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rain-bkgnd","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,78.25,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[75,178.25,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"stars","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,105,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"rain-four-drops","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-3.417,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[109.5,78.5,0],"to":[0,0,0],"ti":[-3.417,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"cloud-small","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,68,0],"to":[1.333,0.417,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70.5,0],"to":[0,0,0],"ti":[1.333,0.417,0]},{"t":101,"s":[49.5,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[120,120,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.66,0],[-3.71,-3.81],[-0.2,-5.48],[-1.77,-2.13],[0,-3.18],[2.35,-2.35],[3.59,0],[0,0],[0,0],[2.35,2.35],[0,3.59],[-2.35,2.35],[-3.59,0],[0,0],[0,0],[-3.49,3.58]],"o":[[5.66,0],[3.54,3.62],[2.77,0.72],[1.91,2.28],[0,3.59],[-2.35,2.35],[0,0],[0,0],[-3.59,0],[-2.35,-2.35],[0,-3.59],[2.35,-2.35],[0,0],[0,0],[0.25,-5.4],[3.71,-3.81]],"v":[[3,-23],[17.5,-16.84],[23.49,-2.8],[30.45,1.62],[33.5,10],[29.69,19.19],[20.5,23],[20.5,23],[-20.5,23],[-29.69,19.19],[-33.5,10],[-29.69,0.81],[-20.5,-3],[-20.5,-3],[-17.48,-3],[-11.5,-16.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1.6,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-14.987,-2.784],"ix":5},"e":{"a":0,"k":[24.236,24.103],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"cloud-small-shadow","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[49.5,67.5,0],"to":[1.333,0.417,0],"ti":[0.083,-0.083,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[57.5,70,0],"to":[-0.083,0.083,0],"ti":[1.417,0.333,0]},{"t":101,"s":[49,68,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[124,124,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-6.22,0],[-4.08,-4.18],[-0.53,-5.42],[-1.73,-2.08],[0,-3.67],[2.71,-2.72],[3.98,-0.1],[0,0],[0,0],[2.72,2.71],[0,4.14],[-2.71,2.72],[-3.98,0.1],[0,0],[0,0],[-3.4,3.49]],"o":[[6.22,0],[3.55,3.65],[2.6,0.95],[2.19,2.63],[0,4.14],[-2.63,2.62],[0,0],[0,0],[-4.14,0],[-2.71,-2.72],[0,-4.14],[2.63,-2.62],[0,0],[0,0],[0.65,-5.14],[4.08,-4.18]],"v":[[3,-25],[18.94,-18.24],[25.39,-4.3],[31.99,0.34],[35.5,10],[31.11,20.61],[20.91,24.99],[20.91,24.99],[-20.5,25],[-31.11,20.61],[-35.5,10],[-31.11,-0.61],[-20.91,-4.99],[-20.91,-4.99],[-19.31,-5],[-12.94,-18.24]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":5,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud-small-shadow","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"rain-three-drops","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,100,0],"to":[0.833,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[105,100,0],"to":[0,0,0],"ti":[0.833,0,0]},{"t":101,"s":[100,100,0]}],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"light-lense","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[100,100,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[102.5,124.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":73,"op":121,"st":73,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[82.5,139.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":40,"op":88,"st":40,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[67.5,90,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":54,"op":102,"st":54,"bm":0},{"ddd":0,"ind":14,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[65,87.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":27,"op":93,"st":27,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[150,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":19,"op":66,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[130,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":36,"op":102,"st":36,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"rain-bkgnd","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[110,130,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":15,"op":81,"st":15,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.611764729023,0.498039215803,0.690196096897,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.69,0.498,0.678,0.5,0.465,0.339,0.606,1,0.239,0.18,0.533],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/thunder_storm_night.json b/assets/weather_animation/thunder_storm_night.json new file mode 100644 index 0000000..73c8680 --- /dev/null +++ b/assets/weather_animation/thunder_storm_night.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-night-thunderstorm","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"rain-bkgnd 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[105.25,46.438,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":65,"s":[105.25,135.188,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"rain-bkgnd 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[83.75,95.188,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":66,"s":[83.75,183.938,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rain-bkgnd 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[71,58.438,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[71,158.438,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rain-bkgnd 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[76,40,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[76,140,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rain-bkgnd 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[87,62.75,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[87,162.75,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rain-bkgnd 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82.5,52.5,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[82.5,152.5,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"rain-bkgnd 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,85,0],"to":[0,8.375,0],"ti":[0,-8.375,0]},{"t":65,"s":[100,135.25,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"rain-bkgnd","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,78.25,0],"to":[0,11.625,0],"ti":[0,-11.625,0]},{"t":65,"s":[75,148,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Lightning","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[100]},{"t":78,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[85.78,101.5,0],"to":[0,7.5,0],"ti":[0,-7.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[85.78,146.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[85.78,146.5,0],"to":[1.667,-5.833,0],"ti":[-1.667,0.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[95.78,111.5,0],"to":[1.667,-0.833,0],"ti":[0,-5,0]},{"t":70,"s":[95.78,141.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.22,-36.5],[19.5,-36.5],[2.49,-6.47],[18.67,-6.47],[-17.84,36.5],[-3.73,4.38],[-19.5,4.38]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.647058844566,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-right-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[150.833,102,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[150.833,227,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[146.439,102.124,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[146.439,227.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-left-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[118.833,112,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"drop-left","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114.439,112.124,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"drop-left-second-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[118.833,99.5,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[118.833,169.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"drop-left-second","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[114.439,99.624,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[114.439,169.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"drop-left-next-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[143.833,72,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[143.833,134.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[143.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"drop-left-next","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[139.439,72.124,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[139.439,134.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[139.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":48,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34,"s":[100,100,100]},{"t":48,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.560784339905,0.427450984716,0.760784327984,1],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[102.5,124.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":11,"op":76,"st":11,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[65,87.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":27,"op":71,"st":27,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[150,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":19,"op":83,"st":17,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.611764729023,0.498039215803,0.690196096897,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.69,0.498,0.678,0.5,0.465,0.339,0.606,1,0.239,0.18,0.533],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":-4,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/assets/weather_animation/thunder_strom_day.json b/assets/weather_animation/thunder_strom_day.json new file mode 100644 index 0000000..a538a05 --- /dev/null +++ b/assets/weather_animation/thunder_strom_day.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.20","a":"","k":"","d":"","tc":"#FFFFFF"},"fr":36,"ip":0,"op":102,"w":200,"h":200,"nm":"weather-day-thunderstorm","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"rain-bkgnd 7","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[105.25,46.438,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":65,"s":[105.25,135.188,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"rain-bkgnd 6","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[83.75,95.188,0],"to":[0,14.792,0],"ti":[0,-14.792,0]},{"t":66,"s":[83.75,183.938,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"rain-bkgnd 5","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[71,58.438,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[71,158.438,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"rain-bkgnd 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[76,40,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[76,140,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,55.645,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"rain-bkgnd 3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[87,62.75,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[87,162.75,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"rain-bkgnd 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[82.5,52.5,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":66,"s":[82.5,152.5,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"rain-bkgnd 8","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,85,0],"to":[0,8.375,0],"ti":[0,-8.375,0]},{"t":65,"s":[100,135.25,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"rain-bkgnd","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"t":70,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[75,78.25,0],"to":[0,11.625,0],"ti":[0,-11.625,0]},{"t":65,"s":[75,148,0]}],"ix":2},"a":{"a":0,"k":[-84.25,78.25,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[3.118,9.396],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":20,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-84.691,77.448],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[33.515,227.006],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":66,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cloud","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-6.15,-6.15],[0,-9.39],[0.01,-0.38],[-1.94,-3.02],[0,-3.96],[3.54,-3.61],[5.45,-0.1],[0,0],[0,0],[4.51,4.7],[0,6.99],[-4.71,4.7],[-7.18,0],[-0.51,-0.02],[-5.42,3.72],[-7.12,0]],"o":[[9.39,0],[6.15,6.15],[0,0.38],[3.22,1.62],[1.99,3.11],[0,5.46],[-3.56,3.61],[0,0],[0,0],[-6.96,-0.28],[-4.49,-4.67],[0,-7.18],[4.7,-4.71],[0.52,0],[2.54,-6.15],[5.47,-3.74],[0,0]],"v":[[7,-36.5],[31.04,-26.54],[41,-2.5],[40.98,-1.37],[48.86,5.73],[52,16.5],[46.27,30.52],[32.35,36.5],[32.35,36.5],[-27.02,36.5],[-44.75,28.51],[-52,10.5],[-44.38,-7.88],[-26,-15.5],[-24.45,-15.46],[-12.2,-30.57],[7,-36.5]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,1,1,1,0.5,0.969,0.969,0.969,1,0.937,0.937,0.937],"ix":9}},"s":{"a":0,"k":[-23.264,-4.419],"ix":5},"e":{"a":0,"k":[37.62,38.251],"ix":6},"t":2,"h":{"a":0,"k":0,"ix":7},"a":{"a":0,"k":0,"ix":8},"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"cloud","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"shadow","sr":1,"ks":{"o":{"a":0,"k":20,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[130,78.5,0],"to":[-5.083,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":50,"s":[99.5,78.5,0],"to":[0,0,0],"ti":[-5.083,0,0]},{"t":101,"s":[130,78.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-7.75,0],[-6.69,-6.7],[-0.28,-9.78],[0,0],[0,0],[-1.83,-2.73],[0,0],[0,-4.56],[4.08,-4.15],[6.08,-0.22],[0,0],[0,0],[5.05,5.25],[0,7.8],[-5.24,5.25],[-8.01,0],[0,0],[0,0],[-5.02,3.56],[0,0]],"o":[[10.22,0],[6.46,6.45],[0,0],[0,0],[2.81,1.74],[0,0],[2.29,3.57],[0,6.28],[-3.99,4.06],[0,0],[0,0],[-7.79,-0.3],[-5,-5.22],[0,-8.01],[5.25,-5.24],[0,0],[0,0],[2.74,-5.57],[0,0],[5.94,-4.08]],"v":[[7,-39.5],[33.16,-28.66],[43.98,-3.59],[43.99,-3.13],[44.06,-3.09],[51.11,3.7],[51.38,4.12],[55,16.5],[48.41,32.62],[32.86,39.48],[32.86,39.48],[-27.08,39.5],[-46.92,30.59],[-55,10.5],[-46.51,-10.01],[-26,-18.5],[-26.37,-18.5],[-26.23,-18.79],[-14.38,-32.7],[-13.89,-33.04]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"shadow","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Lightning","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":38,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":51,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":61,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":66,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":70,"s":[20]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[100]},{"t":78,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[85.78,101.5,0],"to":[0,7.5,0],"ti":[0,-7.5,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[85.78,146.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":51,"s":[85.78,146.5,0],"to":[1.667,-5.833,0],"ti":[-1.667,0.833,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[95.78,111.5,0],"to":[1.667,-0.833,0],"ti":[0,-5,0]},{"t":70,"s":[95.78,141.5,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-6.22,-36.5],[19.5,-36.5],[2.49,-6.47],[18.67,-6.47],[-17.84,36.5],[-3.73,4.38],[-19.5,4.38]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.647058844566,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":26,"op":102,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"drop-right-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[150.833,102,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[150.833,227,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"drop-right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[146.439,102.124,0],"to":[0,20.833,0],"ti":[0,-20.833,0]},{"t":101,"s":[146.439,227.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-right","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"drop-left-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[118.833,112,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"drop-left","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[114.439,112.124,0],"to":[0,16.667,0],"ti":[0,-16.667,0]},{"t":58,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"drop-left-second-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[118.833,99.5,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[118.833,169.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[118.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"drop-left-second","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[114.439,99.624,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":95,"s":[114.439,169.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[114.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"drop-left-next-blick","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[143.833,72,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[143.833,134.584,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[143.833,212,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[-100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.29,6.03],[-0.02,-7.82],[-4.85,0],[0.02,7.96]],"o":[[-2.56,6.06],[0.02,8.01],[4.84,0],[-0.03,-7.89]],"v":[[4.137,-15],[-5.833,4.06],[4.487,15],[-0.453,2.55]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.349019616842,0.611764729023,0.890196084976,0.20000000298],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left-blick","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"drop-left-next","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[139.439,72.124,0],"to":[0,24.259,0],"ti":[0,-28.444,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":80,"s":[139.439,134.708,0],"to":[0,0.869,0],"ti":[0,-0.741,0]},{"t":101,"s":[139.439,212.124,0]}],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.25,6.06],[-0.02,-7.75],[-4.85,0],[0.02,7.9]],"o":[[-2.57,6.01],[0.02,7.95],[4.84,0],[-0.03,-7.82]],"v":[[0.171,-15.124],[-10.439,4.266],[-0.119,15.126],[10.441,4.416]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.929411768913,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"drop-left","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"light-lense-small-midsize","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":26,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":62,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":83,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":101,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[96,95.25,0],"to":[-1.25,2.5,0],"ti":[1.25,-2.5,0]},{"t":48,"s":[88.5,110.25,0]}],"ix":2},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[-0.5,0.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[-0.5,0.25,0]}],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":34,"s":[100,100,100]},{"t":48,"s":[400,400,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[38,38],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.86274510622,0.474509805441,1],"ix":4},"o":{"a":0,"k":20,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small-midsize","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"light-lense-small","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":6,"s":[100]},{"t":126,"s":[50]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[122.25,69.25,0],"to":[-23.141,0.692,0],"ti":[25.169,4.072,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":101,"s":[18.168,65.53,0],"to":[-13.764,-2.227,0],"ti":[4.401,-4.766,0]},{"t":126,"s":[20,180,0]}],"ix":2},"a":{"a":0,"k":[0.218,0.356,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":8,"s":[100,100,100]},{"t":126,"s":[320,320,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[22,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense-small","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"light-lense","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81,65,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[94,94],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.588235318661,0.850980401039,1,0.101960785687],"ix":4},"o":{"a":0,"k":10,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"light-lense","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[102.5,124.75,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":11,"op":76,"st":11,"bm":0},{"ddd":0,"ind":16,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[65,87.5,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":27,"op":71,"st":27,"bm":0},{"ddd":0,"ind":17,"ty":0,"nm":"rain-bkgnd","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":10,"ix":10},"p":{"a":0,"k":[150,115,0],"ix":2},"a":{"a":0,"k":[100,100,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":200,"h":200,"ip":19,"op":83,"st":17,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"oval-bkgnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[90,110,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[140,140],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.482352942228,0.729411780834,0.949019610882,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":3,"k":{"a":0,"k":[0,0.459,0.725,0.871,0.5,0.365,0.627,0.853,1,0.271,0.529,0.835],"ix":9}},"s":{"a":0,"k":[47.014,-48.799],"ix":5},"e":{"a":0,"k":[-53.112,45.573],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"oval-bkgnd","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":102,"st":-4,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/chatbotui.iml b/chatbotui.iml new file mode 100644 index 0000000..4a179b7 --- /dev/null +++ b/chatbotui.iml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 9625e10..e041d38 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -1,26 +1,26 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 11.0 - - + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 12.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..0b2d479 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1 @@ -#include "Generated.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Generated.xcconfig b/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..21f8e85 --- /dev/null +++ b/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=E:\TeaHub FrontEnd\flutter_windows_3.16.8-stable\flutter +FLUTTER_APPLICATION_PATH=C:\Users\vihanga\Desktop\new Project\TeaHub-Application +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib\main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..0b2d479 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1 @@ -#include "Generated.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh new file mode 100644 index 0000000..0d507ca --- /dev/null +++ b/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=E:\TeaHub FrontEnd\flutter_windows_3.16.8-stable\flutter" +export "FLUTTER_APPLICATION_PATH=C:\Users\vihanga\Desktop\new Project\TeaHub-Application" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib\main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 5137639..6627853 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -345,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -367,7 +367,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.teahub; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui; 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.teahub.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui.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.teahub.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui.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.teahub.RunnerTests; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; @@ -472,7 +472,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -521,7 +521,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -545,7 +545,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.teahub; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui; 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.teahub; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 919434a..c4b79bd 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index f9b0d7c..af0309c 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -1,8 +1,8 @@ - - - - - PreviewsEnabled - - - + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 87131a0..952169b 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,98 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..59c6d39 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings index f9b0d7c..af0309c 100644 --- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -1,8 +1,8 @@ - - - - - PreviewsEnabled - - - + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 70693e4..3763683 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -1,13 +1,13 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index d36b1fa..1950fd8 100644 --- a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,122 +1,122 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png index dc9ada4..2eb469c 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png index 7353c41..7df24b2 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png index 797d452..063d701 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index 6ed2d93..c8fe532 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png index 4cd7b00..52af468 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png index fe73094..221da09 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png index 321773c..fbd6372 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 797d452..063d701 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index 502f463..c8b4e28 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png index 0ec3034..42f39cc 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000..7890434 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png new file mode 100644 index 0000000..5eb451b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png new file mode 100644 index 0000000..93c2d1a Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000..1ca288b Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index 0ec3034..42f39cc 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index e9f5fea..9b48373 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000..c2b1864 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000..5dd84e7 Binary files /dev/null and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index 84ac32a..73664ac 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png index 8953cba..e41d181 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png index 0467bf1..b56671b 100644 Binary files a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json new file mode 100644 index 0000000..9f447e1 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "background.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png new file mode 100644 index 0000000..e37ebe3 Binary files /dev/null and b/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png differ diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json index 0bedcf2..d08a4de 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -1,23 +1,23 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md index 89c2725..65a94b5 100644 --- a/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -1,5 +1,5 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/ios/Runner/Base.lproj/LaunchScreen.storyboard b/ios/Runner/Base.lproj/LaunchScreen.storyboard index f2e259c..497371e 100644 --- a/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ b/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard index f3c2851..bbb83ca 100644 --- a/ios/Runner/Base.lproj/Main.storyboard +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/GeneratedPluginRegistrant.h b/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/ios/Runner/GeneratedPluginRegistrant.m b/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..09811ce --- /dev/null +++ b/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,105 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +#if __has_include() +#import +#else +@import firebase_auth; +#endif + +#if __has_include() +#import +#else +@import firebase_core; +#endif + +#if __has_include() +#import +#else +@import flutter_facebook_auth; +#endif + +#if __has_include() +#import +#else +@import flutter_native_splash; +#endif + +#if __has_include() +#import +#else +@import flutter_secure_storage; +#endif + +#if __has_include() +#import +#else +@import geocoding_ios; +#endif + +#if __has_include() +#import +#else +@import geolocator_apple; +#endif + +#if __has_include() +#import +#else +@import google_sign_in_ios; +#endif + +#if __has_include() +#import +#else +@import image_cropper; +#endif + +#if __has_include() +#import +#else +@import image_picker_ios; +#endif + +#if __has_include() +#import +#else +@import path_provider_foundation; +#endif + +#if __has_include() +#import +#else +@import permission_handler_apple; +#endif + +#if __has_include() +#import +#else +@import sqflite; +#endif + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { + [FLTFirebaseAuthPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseAuthPlugin"]]; + [FLTFirebaseCorePlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTFirebaseCorePlugin"]]; + [FlutterFacebookAuthPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterFacebookAuthPlugin"]]; + [FlutterNativeSplashPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterNativeSplashPlugin"]]; + [FlutterSecureStoragePlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterSecureStoragePlugin"]]; + [GeocodingPlugin registerWithRegistrar:[registry registrarForPlugin:@"GeocodingPlugin"]]; + [GeolocatorPlugin registerWithRegistrar:[registry registrarForPlugin:@"GeolocatorPlugin"]]; + [FLTGoogleSignInPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTGoogleSignInPlugin"]]; + [FLTImageCropperPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTImageCropperPlugin"]]; + [FLTImagePickerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FLTImagePickerPlugin"]]; + [PathProviderPlugin registerWithRegistrar:[registry registrarForPlugin:@"PathProviderPlugin"]]; + [PermissionHandlerPlugin registerWithRegistrar:[registry registrarForPlugin:@"PermissionHandlerPlugin"]]; + [SqflitePlugin registerWithRegistrar:[registry registrarForPlugin:@"SqflitePlugin"]]; +} + +@end diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 7e4ec4e..380be26 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -1,66 +1,49 @@ - - - - - - -CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLSchemes - - - - com.googleusercontent.apps.1015273066077-7cfcp445csabf493lmmp5u37cjscn0g9 - - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - Teahub - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - teahub - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - - - + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Chatbotui + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + chatbotui + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + + diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h index 308a2a5..fae207f 100644 --- a/ios/Runner/Runner-Bridging-Header.h +++ b/ios/Runner/Runner-Bridging-Header.h @@ -1 +1 @@ -#import "GeneratedPluginRegistrant.h" +#import "GeneratedPluginRegistrant.h" diff --git a/ios/RunnerTests/RunnerTests.swift b/ios/RunnerTests/RunnerTests.swift index 86a7c3b..4d206de 100644 --- a/ios/RunnerTests/RunnerTests.swift +++ b/ios/RunnerTests/RunnerTests.swift @@ -1,12 +1,12 @@ -import Flutter -import UIKit -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/lib/TeaDescriptionPage/main.dart b/lib/TeaDescriptionPage/main.dart new file mode 100644 index 0000000..77f247f --- /dev/null +++ b/lib/TeaDescriptionPage/main.dart @@ -0,0 +1,347 @@ +import 'package:chatbotui/TeaDescriptionPage/teaDetails.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatefulWidget{ + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + + TextEditingController searchController = TextEditingController(); + late List allTeas; // List to hold all teas. + late List filteredTeas; // List to hold teas after a search is performed. + + @override + void initState() { + super.initState(); + allTeas = []; // Initialize to an empty list. + filteredTeas = []; // Initialize to an empty list. + fetchData(); // Fetch your tea data from the API. + searchController.addListener(() { + filterSearchResults(searchController.text); + }); + } + + @override + void dispose() { + searchController.dispose(); + super.dispose(); + } + + Future> fetchData() async { + final String response = await rootBundle.loadString('images/tea.json'); + final List jsonData = json.decode(response) as List; + List teas = jsonData.map((json) => Tea.fromJson(json)).toList(); + return teas; + } + + void filterSearchResults(String query) { + List dummySearchList = []; + if (query.isNotEmpty) { + dummySearchList.addAll(allTeas); + dummySearchList = dummySearchList.where((item) { + return item.name.toLowerCase().contains(query.toLowerCase()); + }).toList(); + } else { + dummySearchList = List.from(allTeas); + } + setState(() { + filteredTeas = dummySearchList; + }); + } + + + + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: Column( + + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top:35.0,left: 20.0,right: 20.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + IconButton( + icon: Image.asset('assets/teaPage/hamburger_menu.png'), + onPressed: () { + // Handle menu button press + }, + ), + Spacer(), // This will create space between the elements + IconButton( + icon: Image.asset('assets/teaPage/notification_icon.png'), + onPressed: () { + // Handle notifications button press + }, + ), + ], + ), + ), + Padding( + padding: EdgeInsets.only(left: 30.0,top:8.0), // Adjust the padding as needed + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, // Align text to the left + children: [ + Text( + "Let's find your", + style: TextStyle( + color: Color(0xFF4ecb81), // The specified green color + fontWeight: FontWeight.w900, + fontSize: 36, // Increased font size + ), + ), + Text( + "plants", + style: TextStyle( + color: Color(0xFF4ecb81), // The specified green color + fontWeight: FontWeight.w900, + fontSize: 36, // Same font size for uniformity + ), + ), + ], + ), + ), + SizedBox(height: 24), // Spacing between title and search bar + Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + decoration: InputDecoration( + hintText: 'Search', + prefixIcon: Icon(Icons.search), + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(24), + borderSide: BorderSide.none, + ), + filled: true, + fillColor: Colors.greenAccent.shade100, + ), + onChanged: (value) { + filterSearchResults(value); + }, + ), + ), + SizedBox(height:16), + Expanded( + child: searchController.text.isNotEmpty + ? GridView.builder( + itemCount: filteredTeas.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.0, + crossAxisSpacing: 10.0, + childAspectRatio: 160 / 242, + ), + itemBuilder: (BuildContext context, int index) { + return Frame1Widget(tea: filteredTeas[index]); + }, + ) + : FutureBuilder>( + future: fetchData(), // Replace with your data fetching logic + builder: (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Center(child: CircularProgressIndicator()); + } else if (snapshot.hasError) { + return Center(child: Text('Error: ${snapshot.error}')); + } else if (snapshot.hasData) { + allTeas = snapshot.data!; + filteredTeas = allTeas; + return GridView.builder( + itemCount: filteredTeas.length, + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, + mainAxisSpacing: 10.0, + crossAxisSpacing: 10.0, + childAspectRatio: 160 / 242, + ), + itemBuilder: (BuildContext context, int index) { + return Frame1Widget(tea: filteredTeas[index]); + }, + ); + }else { + return Center(child: Text("No data found")); + } + }, + ), + ), + ], + + ), + ), + ); + } + + + +} + + +class Tea { + final String name; + final String imageUrl; + final String alternativeName; + final String origin; + final String type; + final String caffeine; + final String caffeineLevel; + final String mainIngredients; + final String description; + final String colourDescription; + + Tea({ + required this.name, + required this.imageUrl, + required this.alternativeName, + required this.origin, + required this.type, + required this.caffeine, + required this.caffeineLevel, + required this.mainIngredients, + required this.description, + required this.colourDescription + }); + + factory Tea.fromJson(Map json) { + // A helper function to get value or return a default + String getOrDefault(String key, String defaultValue) { + var value = json[key]; + return (value == null || value.isEmpty) ? defaultValue : value; + } + + return Tea( + name: getOrDefault('name', 'None'), + imageUrl: getOrDefault('image', '.noimage.webp'), + alternativeName: getOrDefault('altnames', 'None'), + origin: getOrDefault('origin', 'None'), + type: getOrDefault('type', 'None'), + caffeine: getOrDefault('caffeine', 'None'), + caffeineLevel: getOrDefault('caffeineLevel', 'None'), + description: getOrDefault('description', 'None'), + colourDescription: getOrDefault('colorDescription', 'None'), + mainIngredients: getOrDefault('tasteDescription', 'None'), + ); + } +} + +class Frame1Widget extends StatelessWidget { + final Tea tea; + + Frame1Widget({required this.tea}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + // Navigate to TeaDetailsPage and pass the tea object + Navigator.push( + context, + MaterialPageRoute(builder: (context) => TeaDetailsPage(), settings: RouteSettings(arguments: tea)), + ); + }, + child: Container( + width: 140, + height: 220, + margin: EdgeInsets.fromLTRB(10, 10, 10, 0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.15), + offset: Offset(0, 20), + blurRadius: 52, + ), + ], + color: Colors.white, + ), + child: Stack( + children: [ + Positioned( + top: 250, + left: 25, + child: Text( + tea.name, + textAlign: TextAlign.left, + style: TextStyle( + color: Color.fromRGBO(48, 64, 34, 1), + fontFamily: 'Lexend', + fontSize: 12, + fontWeight: FontWeight.normal, + height: 1, + ), + ), + ), + Positioned( + top: 241, + left: 125, + child: Container( + width: 28, + height: 27, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(18), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.15), + offset: Offset(0, 8), + blurRadius: 17, + ), + ], + gradient: LinearGradient( + begin: Alignment(-2.9608793639113173e-8, 0.6136363744735718), + end: Alignment(-0.6136363744735718, -2.753164629609728e-8), + colors: [ + Color.fromRGBO(213, 235, 203, 1), + Color.fromRGBO(156, 237, 107, 1), + Color.fromRGBO(87, 145, 51, 1) + ], + ), + ), + ), + ), + Positioned( + top: -3, + left: 0, + right: 0, // Make the image take the same width as the grid cell + child: Container( + height: 200, // Half of the grid cell height + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(18), + topRight: Radius.circular(18), + ), + image: DecorationImage( + image: NetworkImage(tea.imageUrl), + fit: BoxFit.cover, + ), + ), + ), + ), + Positioned( + top: 242, + left: 128, + bottom: 120, + child: GestureDetector( + onTap: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => TeaDetailsPage(), settings: RouteSettings(arguments: tea)), + ); + }, + child: Icon(Icons.arrow_forward, color: Colors.white), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/TeaDescriptionPage/teaDetails.dart b/lib/TeaDescriptionPage/teaDetails.dart new file mode 100644 index 0000000..e46ad79 --- /dev/null +++ b/lib/TeaDescriptionPage/teaDetails.dart @@ -0,0 +1,161 @@ +import 'package:chatbotui/TeaDescriptionPage/main.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(TeaDetailsApp()); +} + +class TeaDetailsApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Tea Details', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: TeaDetailsPage(), + ); + } +} + +class TeaDetailsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + // Extracting the tea object passed from main.dart + final Tea tea = ModalRoute.of(context)!.settings.arguments as Tea; + + return Scaffold( + appBar: AppBar( + title: Text('Tea Details'), + ), + body: SingleChildScrollView( + child: Center( + child: TeaDetailsWidget(tea: tea), // Pass the tea object to TeaDetailsWidget + ), + ), + ); + } +} + +class TeaDetailsWidget extends StatelessWidget { + final Tea tea; + + TeaDetailsWidget({required this.tea}); + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Expanded( + child:Padding( + padding: const EdgeInsets.only(top: 20, left: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 23,top:15), // Adding padding to the bottom of "Green Tea" text + child: Text( + tea.name, + style: TextStyle( + fontSize: 32, + fontWeight: FontWeight.bold, + color: Color(0xFF4ECB81), + ), + ), + ), + SizedBox(height: 10), + _buildInfoTag(context, 'Alternative Name:', tea.alternativeName), + _buildInfoTag(context, 'Origin:', tea.origin), + _buildInfoTag(context, 'Type:', tea.type), + _buildInfoTag(context, 'Caffeine:', tea.caffeine), + _buildInfoTag(context, 'Caffeine Level:', tea.caffeineLevel), + _buildInfoTag(context, 'Main Ingredients:', tea.mainIngredients), + _buildInfoTag( + context, + 'Description:', + tea.description), + _buildInfoTag(context, 'Color Description:', tea.colourDescription), + ], + ), + ), + ), + SizedBox(width: 10), + Container( + height: MediaQuery.of(context).size.height * 0.5, // Half the height of the screen + width: MediaQuery.of(context).size.width * 0.4, + child: Stack( + children: [ + Positioned.fill( + top:50, + right:0, + bottom:0, + left:20, + child: Container( + height: MediaQuery.of(context).size.height * 0.5, + width: MediaQuery.of(context).size.width * 0.2, + + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(MediaQuery.of(context).size.height * 0.25), + bottomLeft: Radius.circular(MediaQuery.of(context).size.height * 0.25), + ), + image: DecorationImage( + image: NetworkImage(tea.imageUrl), + fit: BoxFit.cover, + ), // You can change the color or use an image here + ), + ), + ), + ], + ), + ), + ], + ); + } + + Widget _buildInfoTag(BuildContext context, String title, String content) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + RichText( + text: TextSpan( + children: [ + TextSpan( + text: title[0], + style: TextStyle( + fontSize: 20, // Set the font size of the first letter to 20 + fontWeight: FontWeight.bold, + color: Colors.black, + ), + ), + TextSpan( + text: title.substring(1), + style: TextStyle( + fontSize: 18, // Set the font size of the rest of the label to 18 + color: Colors.black, + ), + ), + ], + ), + ), + SizedBox(height: 5), + + Text( + content, + style: TextStyle( + fontSize: 18, + color: Color(0xFF4ECB81), + fontWeight: FontWeight.bold, + height: 1.5, // Line spacing + ), + ), + SizedBox(height: 10), + + ], + ); + } + } +} + + + diff --git a/lib/TeaPrice_widget/TeaPrice_model.dart b/lib/TeaPrice_widget/TeaPrice_model.dart new file mode 100644 index 0000000..36fbb19 --- /dev/null +++ b/lib/TeaPrice_widget/TeaPrice_model.dart @@ -0,0 +1,218 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:http/http.dart' as http; +import 'dart:convert' show json; +import 'package:flutter/services.dart' show rootBundle; + +class priceWidget extends StatefulWidget { + @override + _priceWidgetState createState() => _priceWidgetState(); +} + +class _priceWidgetState extends State { + late Future> _albumFuture; + + Future> fetchAlbum() async { + final response = await http.get( + Uri.parse('https://mocki.io/v1/09da860c-0e99-412e-bb12-a96aa37ad21c')); + //https://mocki.io/v1/09da860c-0e99-412e-bb12-a96aa37ad21c + if (response.statusCode == 200) { + // If the server returns a 200 OK response, parse the JSON. + final Map data = json.decode(response.body); + print(data); + + return data; + } else { + String jsonData = await rootBundle.loadString('assets/TeaPrice_data.json'); + Map data = json.decode(jsonData); + + // Throw an exception indicating failure to load album + return data; + } + } + + @override + void initState() { + super.initState(); + _fetchAlbum(); + } + + void _fetchAlbum() { + _albumFuture = fetchAlbum(); + _albumFuture.then((response) { + print('Response body: ${response}'); + }).catchError((error) { + print('Error fetching album: $error'); + }); + } + + Widget build(BuildContext context) { + return Center( + child: FutureBuilder>( + future: _albumFuture, + builder: (context, snapshot) { + double? thisMonth; + double? lastMonth; + + if (snapshot.data != null) { + thisMonth = double.tryParse(snapshot.data!["Last Value"] ?? ''); + + lastMonth = + double.tryParse(snapshot.data!["Value from Last Month"] ?? ''); + } + + IconData iconData = Icons.error; // Default icon for error + Color iconColor = Colors.grey; // Default color for error + + if (thisMonth != null && lastMonth != null) { + if (thisMonth > lastMonth) { + iconData = Icons.trending_up; + iconColor = const Color.fromARGB(255, 81, 255, 0); + } else if (thisMonth < lastMonth) { + iconData = Icons.trending_down; + iconColor = Colors.red; + } else { + // If values are equal + iconData = Icons.horizontal_rule; + iconColor = Colors.blue; + } + } + + if (snapshot.connectionState == ConnectionState.waiting || + snapshot.hasError) { + // return CircularProgressIndicator(); + return Center( + child: Container( + decoration: BoxDecoration( + color: const Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 4, + blurRadius: 7, + offset: const Offset(0, 3), + ), + ], + ), + margin: const EdgeInsets.symmetric(vertical: 0, horizontal: 20), + height: 150, + width: MediaQuery.of(context).size.width, + child: const Center( + child: SizedBox( + width: 40, + height: 40, + child: CircularProgressIndicator( + strokeWidth: + 4, // You can adjust the stroke width as needed + valueColor: AlwaysStoppedAnimation( + Colors.white), // Color of the progress indicator + backgroundColor: Colors + .transparent, // Background color of the progress indicator + value: null, // Set value to null to make it indeterminate + ), + ), + ), + ), + ); + } else { + return Container( + decoration: BoxDecoration( + color: Color(0xFFDDB892).withOpacity(0.8), + borderRadius: BorderRadius.circular(15), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 4, + blurRadius: 7, + offset: const Offset(0, 3), + ), + ], + ), + margin: const EdgeInsets.symmetric( + vertical: 0, + horizontal: 20, + ), + height: 150, + width: MediaQuery.of(context).size.width, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(20, 5, 0, 0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'Tea Price', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + Text( + '${snapshot.data!["Last Value"]} (USD/Kgs)', + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + const SizedBox(width: 30), // Adjust as needed + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon( + iconData, + color: iconColor, + size: 60, + ), + ], + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(20, 0, 0, 0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Average Growth Rate\t\t\t\t\t\t\t\t\t: ${snapshot.data!["Average Growth Rate"]}', + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'Value from Last Month\t\t\t\t\t\t: ${snapshot.data!["Value from Last Month"]}', + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + Text( + 'Change Rate Last Month\t\t\t: ${snapshot.data!["Change from Last Month"]}', + style: const TextStyle( + fontSize: 15, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ], + ), + ); + } + }, + ), + ); + } +} diff --git a/lib/chatbot_ui_updated/ChatScreen.dart b/lib/chatbot_ui_updated/ChatScreen.dart new file mode 100644 index 0000000..7f33930 --- /dev/null +++ b/lib/chatbot_ui_updated/ChatScreen.dart @@ -0,0 +1,351 @@ +import 'dart:convert'; +import 'package:chat_bubbles/bubbles/bubble_normal.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; +import './message.dart'; // Make sure this file exists and contains the Message class + +class ChatScreen extends StatefulWidget { + const ChatScreen({Key? key}) : super(key: key); + + @override + State createState() => _ChatScreenState(); +} + +class _ChatScreenState extends State { + final TextEditingController controller = TextEditingController(); + final ScrollController scrollController = ScrollController(); + List msgs = [null];// Include a null at the start for the header + bool isTyping = false; + bool showScrollToTopButton = false; + List teaQuestions = []; + + + void sendMsg() async { + String text = controller.text.trim(); + if (text.isEmpty) { + return; + } + + controller.clear(); + + setState(() { + msgs.add(Message(sender: true, text: text)); + + isTyping = true; + }); + + + if (!checkIfTeaRelated(text)) { + setState(() { + msgs.add(Message(sender: false, text: "I'm only specializing in tea. Please ask something related to tea.")); + }); + return; + } + + String apiKey = "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"; // Replace with your actual API key + + + + // Clear input field and animate scroll + + + scrollController.animateTo( + scrollController.position.maxScrollExtent + 100.0, + duration: const Duration(milliseconds: 300), + curve: Curves.easeOut, + ); + + try { + var response = await http.post( + Uri.parse("https://api.openai.com/v1/chat/completions"), + headers: { + "Authorization": "Bearer $apiKey", + "Content-Type": "application/json", + }, + body: jsonEncode({ + "model": "gpt-3.5-turbo", // Replace with the model you are using + "messages": [{"role": "user", "content": text}], + }), + ); + + if (response.statusCode == 200) { + var data = jsonDecode(response.body); + var reply = data["choices"][0]["message"]["content"].toString().trimLeft(); + setState(() { + isTyping = false; + msgs.add(Message(sender: false, text: reply)); + }); + } else { + throw Exception('Failed to load data'); + } + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text("Some error occurred, please try again!")), + ); + } + } + + @override + void initState() { + super.initState(); + loadTeaQuestions(); + scrollController.addListener(() { + const scrollThreshold = 50; // Change this value as needed + if (scrollController.offset >= scrollThreshold && !showScrollToTopButton) { + setState(() => showScrollToTopButton = true); + } else if (scrollController.offset < scrollThreshold && showScrollToTopButton) { + setState(() => showScrollToTopButton = false); + } + }); + } + + @override + void dispose() { + scrollController.dispose(); + controller.dispose(); + super.dispose(); + } + + void loadTeaQuestions() async { + final rawData = await rootBundle.loadString('assets/Teahub.csv'); + List> csvTable = const CsvToListConverter().convert(rawData); + setState(() { + teaQuestions = csvTable.map((row) => row[0].toString().toLowerCase().trim()).toList(); + }); + } + + bool checkIfTeaRelated(String text) { + // Normalize text for comparison + String normalizedText = text.toLowerCase().trim(); + + // Keywords related to tea cultivation, diseases, and treatment plans + List teaKeywords = [ + 'tea', + 'blister blight', + 'cultivation', + 'fertilization', + 'pruning', + 'harvesting', + 'withering', + 'oxidation', + 'fermentation', + 'drying', + 'steaming', + 'rolling', + 'pests', + 'fungal', + 'disease', + 'treatment', + // Add more relevant keywords as needed + ]; + + // Add normalized questions from CSV to the keywords list for a comprehensive check + List allTeaRelatedWords = List.from(teaKeywords) + ..addAll(teaQuestions.map((q) => q.toLowerCase().trim()).toList()); + + // Check if normalized text contains any of the tea-related words or vice versa + return allTeaRelatedWords.any((word) => + normalizedText.contains(word) || word.contains(normalizedText)); + } + + + + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + icon: Icon(Icons.arrow_back, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: Colors.white, + elevation: 0, + ), + body: Stack( + children: [ + Column( + children: [ + Expanded( + child: ListView.builder( + padding: EdgeInsets.only(bottom: 200), // Adjust for text field space + controller: scrollController, + itemCount: msgs.length, + itemBuilder: (context, index) { + if (index == 0) { + return buildHeader(); + } else { + Message message = msgs[index]!; + return Padding( + padding: EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: buildMessage(message, message.sender), + ); + } + }, + ), + ), + buildInputField(), + ], + ), + if (showScrollToTopButton) // Conditionally display the 3D effect FAB + Positioned( + bottom: 170, // Adjusted to move the button a bit higher + right: 0, + left: 0, + child: Align( + alignment: Alignment.center, + child: GestureDetector( + onTap: () { + scrollController.animateTo( + 0.0, + duration: Duration(seconds: 1), + curve: Curves.fastOutSlowIn, + ); + }, + child: Container( + width: 60, + height: 60, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [Colors.green[700]!, Colors.green[400]!], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + borderRadius: BorderRadius.circular(30), + boxShadow: [ + BoxShadow( + color: Colors.green.withOpacity(0.4), + offset: Offset(4, 4), + blurRadius: 10, + ), + ], + ), + child: Icon(Icons.arrow_upward, color: Colors.white), + ), + ), + ), + ), + ], + ), + ); + } + + Widget buildHeader() { + // Build your header widget here + return Column( + children: [ + SizedBox(height: 16), + IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset('assets/teabot.png', width: 150), + SizedBox(width: 25), + Text( + "Hello!\nI'm TeaBot", + style: TextStyle( + color: Colors.black, + fontSize: 36, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + ], + ), + ), + SizedBox(height: 20), + ], + ); + } + + Widget buildMessage(Message message, bool isSender) { + bool isSpecialMessage = message.text == "I'm only specializing in tea. Please ask something related to tea."; + + // Build your message widget here + return Row( + mainAxisAlignment: isSender ? MainAxisAlignment.end : MainAxisAlignment.start, + children: [ + if (!isSender) ...[ + Icon(Icons.chat, color: Color(0xFF4ECB81)), + SizedBox(width: 8), + ], + Expanded( + child: BubbleNormal( + text: message.text, + isSender: isSender, + color: isSender ? Colors.blue : (isSpecialMessage ? Colors.red : Color(0xFF4ECB81)), + tail: true, + textStyle: TextStyle( + fontSize: 16, + color: isSender ? Colors.white : Colors.black87, + ), + ), + ), + if (isSender) ...[ + SizedBox(width: 8), + Icon(Icons.account_circle, color: Colors.blue), + ], + ], + ); + } + + Widget buildInputField() { + // Build your input field widget here + return Container( + width: MediaQuery.of(context).size.width, + height: 150, + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + color: const Color.fromRGBO(78, 203, 113, 1), + ), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 16), + child: Row( + children: [ + Expanded( + child: TextField( + controller: controller, + textCapitalization: TextCapitalization.sentences, + decoration: InputDecoration( + hintText: "Enter text", + border: InputBorder.none, + filled: true, + fillColor: Colors.white, + contentPadding: const EdgeInsets.symmetric(horizontal: 16), + enabledBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(30), + borderSide: BorderSide.none, + ), + focusedBorder: OutlineInputBorder( + borderRadius: BorderRadius.circular(30), + borderSide: BorderSide.none, + ), + ), + onSubmitted: (_) => sendMsg(), + ), + ), + const SizedBox(width: 8), + GestureDetector( + onTap: sendMsg, + child: Container( + padding: const EdgeInsets.all(8), + decoration: const BoxDecoration( + color: Colors.blue, + shape: BoxShape.circle, + ), + child: const Icon(Icons.send, color: Colors.white), + ), + ), + ], + ), + ), + ); + } +} + + + diff --git a/lib/chatbot_ui_updated/main.dart b/lib/chatbot_ui_updated/main.dart new file mode 100644 index 0000000..b264078 --- /dev/null +++ b/lib/chatbot_ui_updated/main.dart @@ -0,0 +1,23 @@ +import './ChatScreen.dart'; +import 'package:flutter/material.dart'; + + + +void main() async { + + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + Widget build(BuildContext context) { + return MaterialApp( + title: 'TeaBot Chat UI', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: ChatScreen(), + ); + } +} diff --git a/lib/chatbot_ui_updated/message.dart b/lib/chatbot_ui_updated/message.dart new file mode 100644 index 0000000..5315462 --- /dev/null +++ b/lib/chatbot_ui_updated/message.dart @@ -0,0 +1,6 @@ +class Message { + final bool sender; + final String text; + + Message({required this.sender, required this.text}); +} \ No newline at end of file diff --git a/lib/components/login_button.dart b/lib/components/login_button.dart index 9cb730f..c0f1321 100644 --- a/lib/components/login_button.dart +++ b/lib/components/login_button.dart @@ -1,31 +1,31 @@ -import 'package:flutter/material.dart'; - -class LoginButton extends StatelessWidget { - final Function()? onTap; - - const LoginButton({super.key, required this.onTap}); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - padding: const EdgeInsets.all(18), - margin: const EdgeInsets.symmetric(horizontal: 25), - decoration: BoxDecoration( - color: Color.fromARGB(255, 78, 203, 128), - borderRadius: BorderRadius.circular(5)), - child: const Center( - child: Text( - 'Login', - style: TextStyle( - color: Colors.black, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - ), - ), - ); - } -} +import 'package:flutter/material.dart'; + +class LoginButton extends StatelessWidget { + final Function()? onTap; + + const LoginButton({super.key, required this.onTap}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(18), + margin: const EdgeInsets.symmetric(horizontal: 25), + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(5)), + child: const Center( + child: Text( + 'Login', + style: TextStyle( + color: Colors.black, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ); + } +} diff --git a/lib/components/my_textfield.dart b/lib/components/my_textfield.dart index 723bae1..1419dd7 100644 --- a/lib/components/my_textfield.dart +++ b/lib/components/my_textfield.dart @@ -1,37 +1,37 @@ -import 'package:flutter/material.dart'; - -class MyTextField extends StatelessWidget { - final controller; - final String hintText; - final bool obscureText; - - const MyTextField({ - super.key, - required this.controller, - required this.hintText, - required this.obscureText, - }); - - @override - Widget build(BuildContext context) { - return Padding( - padding: const EdgeInsets.symmetric(horizontal: 25.0), - child: TextField( - controller: controller, - obscureText: obscureText, - decoration: InputDecoration( - enabledBorder: const OutlineInputBorder( - borderSide: BorderSide(color: Colors.grey), - ), - focusedBorder: const OutlineInputBorder( - borderSide: BorderSide(color: Colors.black), - ), - fillColor: Colors.grey.shade100, - filled: true, - hintText: hintText, - hintStyle: TextStyle(color: Colors.grey[500]), - ), - ), - ); - } -} +import 'package:flutter/material.dart'; + +class MyTextField extends StatelessWidget { + final controller; + final String hintText; + final bool obscureText; + + const MyTextField({ + super.key, + required this.controller, + required this.hintText, + required this.obscureText, + }); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 25.0), + child: TextField( + controller: controller, + obscureText: obscureText, + decoration: InputDecoration( + enabledBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Colors.grey), + ), + focusedBorder: const OutlineInputBorder( + borderSide: BorderSide(color: Colors.black), + ), + fillColor: Colors.grey.shade100, + filled: true, + hintText: hintText, + hintStyle: TextStyle(color: Colors.grey[500]), + ), + ), + ); + } +} diff --git a/lib/components/signin_button.dart b/lib/components/signin_button.dart new file mode 100644 index 0000000..8037122 --- /dev/null +++ b/lib/components/signin_button.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; + +class MyButton extends StatelessWidget { + final Function()? onTap; + final String text; + + const MyButton({ + super.key, + required this.onTap, + required this.text, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + padding: const EdgeInsets.all(18), + margin: const EdgeInsets.symmetric(horizontal: 25), + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(5), + ), + child: Center( + child: Text( + text, + style: const TextStyle( + color: Colors.black, + fontWeight: FontWeight.bold, + fontSize: 20, + ), + ), + ), + ), + ); + } +} diff --git a/lib/components/square_tile.dart b/lib/components/square_tile.dart index 1f715dc..9be7d9c 100644 --- a/lib/components/square_tile.dart +++ b/lib/components/square_tile.dart @@ -1,33 +1,33 @@ -import 'package:flutter/material.dart'; - -class SquareTile extends StatelessWidget { - final String imagePath; - final Function()? onTap; - const SquareTile({ - super.key, - required this.imagePath, - required this.onTap, - }); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: onTap, - child: Container( - //padding: EdgeInsets.all(20), - padding: const EdgeInsets.symmetric( - horizontal: 25.0, // Horizontal padding - vertical: 10.0, // Vertical padding - ), - decoration: BoxDecoration( - border: Border.all(color: Colors.grey.shade400), - borderRadius: BorderRadius.circular(5), - ), - child: Image.asset( - imagePath, - height: 40, - ), - ), - ); - } -} +import 'package:flutter/material.dart'; + +class SquareTile extends StatelessWidget { + final String imagePath; + final Function()? onTap; + const SquareTile({ + super.key, + required this.imagePath, + required this.onTap, + }); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: onTap, + child: Container( + //padding: EdgeInsets.all(20), + padding: const EdgeInsets.symmetric( + horizontal: 25.0, // Horizontal padding + vertical: 10.0, // Vertical padding + ), + decoration: BoxDecoration( + border: Border.all(color: Colors.grey.shade400), + borderRadius: BorderRadius.circular(5), + ), + child: Image.asset( + imagePath, + height: 40, + ), + ), + ); + } +} diff --git a/lib/core/app_export.dart b/lib/core/app_export.dart new file mode 100644 index 0000000..b9f78bb --- /dev/null +++ b/lib/core/app_export.dart @@ -0,0 +1 @@ +// TODO Implement this library. \ No newline at end of file diff --git a/lib/disease_description/diseases.dart b/lib/disease_description/diseases.dart new file mode 100644 index 0000000..d510d32 --- /dev/null +++ b/lib/disease_description/diseases.dart @@ -0,0 +1,335 @@ +import 'package:flutter/material.dart'; +import 'dart:ui'; +import 'package:google_fonts/google_fonts.dart'; + +class MyCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} + +class Disease extends StatelessWidget { + const Disease({Key? key}); + + @override + Widget build(BuildContext context) { + double baseWidth = 375; + double fem = MediaQuery.of(context).size.width / baseWidth; + double ffem = fem * 0.97; + return Container( + width: double.infinity, + child: Container( + // diseaseSYf (128:230) + padding: EdgeInsets.fromLTRB(0 * fem, 7 * fem, 0 * fem, 0 * fem), + width: double.infinity, + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/bgimag.png', + ), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // navvTq (128:231) + margin: EdgeInsets.fromLTRB(19 * fem, 0 * fem, 14 * fem, 284 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // pmePq (I128:231;1:11) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 222 * fem, 0 * fem), + child: Text( + '9:40PM', + style: GoogleFonts.poppins( + fontSize: 14 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + Container( + // autogroup1vq1W4f (9njwAy638d8DChbuKN1VQ1) + padding: EdgeInsets.fromLTRB(11 * fem, 38 * fem, 6 * fem, 0 * fem), + width: double.infinity, + decoration: BoxDecoration( + color: const Color(0xffffffff), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30 * fem), + topRight: Radius.circular(30 * fem), + ), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // greyblightpestalotiopsisBwV (128:237) + margin: EdgeInsets.fromLTRB(7 * fem, 0 * fem, 0 * fem, 23 * fem), + constraints: BoxConstraints( + maxWidth: 136 * fem, + ), + child: RichText( + text: TextSpan( + style: GoogleFonts.poppins( + fontSize: 24 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + children: [ + const TextSpan( + text: 'Grey Blight\n', + ), + TextSpan( + text: 'Pestalotiopsis', + style: GoogleFonts.poppins( + fontSize: 16 * ffem, + fontWeight: FontWeight.w700, + height: 1.5 * ffem / fem, + color: const Color(0xff4ecb81), + ), + ), + ], + ), + ), + ), + Container( + // autogroupnverEYP (9njwT8HnBeUeJnzCQvNvER) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 8 * fem, 38 * fem), + padding: EdgeInsets.fromLTRB(13.5 * fem, 4.5 * fem, 37.5 * fem, 4.5 * fem), + width: double.infinity, + height: 47 * fem, + decoration: BoxDecoration( + color: const Color(0xffe5ffd6), + borderRadius: BorderRadius.circular(28 * fem), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // autogrouprqsbiTZ (9njwaCvKJemfjtLRtArqsB) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 9 * fem, 0 * fem), + width: 180 * fem, + height: double.infinity, + decoration: const BoxDecoration( + image: DecorationImage( + fit: BoxFit.cover, + image: AssetImage( + 'assets/images/rectangle-8.png', + ), + ), + ), + child: Center( + child: Center( + child: Text( + 'Description', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 14 * ffem, + fontWeight: FontWeight.w600, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ), + ), + Center( + // treatmentplanZj5 (130:249) + child: Container( + margin: EdgeInsets.fromLTRB(0 * fem, 2 * fem, 0 * fem, 0 * fem), + child: Text( + 'Treatment Plan', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 14 * ffem, + fontWeight: FontWeight.w600, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ), + ], + ), + ), + Container( + // autogrouphapm4vj (9njwfnbMKPzQVYfnjdHapm) + margin: EdgeInsets.fromLTRB(13.49 * fem, 0 * fem, 12.49 * fem, 35 * fem), + padding: EdgeInsets.fromLTRB(24.51 * fem, 13.63 * fem, 24.51 * fem, 6 * fem), + width: double.infinity, + decoration: BoxDecoration( + color: const Color(0x33088a6a), + borderRadius: BorderRadius.circular(19.4736843109 * fem), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // autogroupghz5m4T (9njwpHMCGCk31f64u8GHz5) + margin: EdgeInsets.fromLTRB(1.63 * fem, 0 * fem, 96 * fem, 19.63 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // headsetsvgrepocomHHh (188:315) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 20.63 * fem, 0 * fem), + width: 21.75 * fem, + height: 21.75 * fem, + child: Image.asset( + 'assets/images/headsetsvgrepocom.png', + width: 21.75 * fem, + height: 21.75 * fem, + ), + ), + Container( + // listentothesymptomsBts (188:314) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 0 * fem), + child: Text( + 'Listen to the symptoms', + style: GoogleFonts.poppins( + fontSize: 12 * ffem, + fontWeight: FontWeight.w600, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + Container( + // autogroupyejqVef (9njwtwt69uCGEn2LbbYeJq) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 89 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // playbuttonsvgrepocomE6T (188:322) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 17.66 * fem, 0.66 * fem), + width: 26.34 * fem, + height: 26.34 * fem, + child: Image.asset( + 'assets/images/play-buttonsvgrepocom.png', + width: 26.34 * fem, + height: 26.34 * fem, + ), + ), + Container( + // usetheplaybuttontolistentothec (188:326) + constraints: BoxConstraints( + maxWidth: 150 * fem, + ), + child: Text( + 'Use the play button to \nlisten to the content', + style: GoogleFonts.poppins( + fontSize: 13 * ffem, + height: 1.5 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + ], + ), + ), + Container( + // autogroupfjbbRwd (9njx5C624LsEDZHy9XFjbB) + margin: EdgeInsets.fromLTRB(9 * fem, 0 * fem, 0 * fem, 0 * fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // autogroupbg5kxwZ (9njxCBtMttYa4EhNhEBG5K) + margin: EdgeInsets.fromLTRB(0 * fem, 9 * fem, 14 * fem, 0 * fem), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // vectorh8T (188:329) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 32 * fem), + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-8MD.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + Container( + // vectorQoZ (188:330) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 37 * fem), + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-SuD.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + Container( + // vectorhXm (188:331) + margin: EdgeInsets.fromLTRB(0 * fem, 0 * fem, 0 * fem, 36 * fem), + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-pGX.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + Container( + // vectorBC3 (188:332) + width: 8 * fem, + height: 8 * fem, + child: Image.asset( + 'assets/images/vector-UWj.png', + width: 8 * fem, + height: 8 * fem, + ), + ), + ], + ), + ), + Container( + // smallovalpaleyellowgreenspotsf (188:327) + constraints: BoxConstraints( + maxWidth: 327 * fem, + ), + child: Text( + 'Small, oval, pale yellow-green spots first appear on young leaves.\n\nOften the spots are surrounded by a narrow, yellow zone.\n\nAs the spots grow and turn brown or gray, concentric rings with scattered, tiny black dots become visible and eventually the dried tissue falls, leading to defoliation\n\nLeaves of any age can be affected.\n\n\n\n\n', + style: GoogleFonts.roboto( + fontSize: 13 * ffem, + fontWeight: FontWeight.w100, + height: 1.1725 * ffem / fem, + color: const Color(0xff000000), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/disease_description/main.dart b/lib/disease_description/main.dart new file mode 100644 index 0000000..dfbee14 --- /dev/null +++ b/lib/disease_description/main.dart @@ -0,0 +1,24 @@ + +import 'package:chatbotui/disease_description/diseases.dart'; + +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); // Fixing the key parameter + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Disease Detection', + theme: ThemeData( + primarySwatch: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: const Disease(), // Using the Disease widget as the home screen + ); + } +} diff --git a/lib/disease_description_treatment/colors.dart b/lib/disease_description_treatment/colors.dart new file mode 100644 index 0000000..8c47e8d --- /dev/null +++ b/lib/disease_description_treatment/colors.dart @@ -0,0 +1,9 @@ +import 'package:flutter/material.dart'; + +class colors { + static final whiteClr = Color(0xFFFFFFFF); + static final grnClr = Color(0xFF55AA9C); + static final grn2Clr = Color(0xFFD1EAC0); + static final gryClr = Color(0xFFE8E8E8); + static final blClr = Color(0xFF0E0E0E); +} diff --git a/lib/disease_description_treatment/home_screen.dart b/lib/disease_description_treatment/home_screen.dart new file mode 100644 index 0000000..1eef11a --- /dev/null +++ b/lib/disease_description_treatment/home_screen.dart @@ -0,0 +1,380 @@ +import 'package:TeaHub/disease_description_treatment/product_screen.dart'; +import 'package:TeaHub/disease_description_treatment/product_screen2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'colors.dart'; + +class HomeScreen extends StatelessWidget { + final String disease; + HomeScreen({required this.disease}); + List catergories = []; + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: colors.whiteClr, + body: SafeArea( + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox(height: 20), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "", + style: TextStyle( + fontSize: 25, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + SizedBox(height: 30), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Stack( + children: [ + Container( + height: 110, + width: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: colors.grn2Clr, + ), + ), + Container( + height: 120, + width: MediaQuery.of(context).size.width, + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "", + style: TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + Text( + "", + style: TextStyle( + fontWeight: FontWeight.w500, + color: Colors.black54, + ), + ) + ], + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/plant.jpg", + ), + ], + ), + ) + ], + ), + ), + SizedBox( + height: 10, + ), + SizedBox( + height: 40, + child: ListView.builder( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: catergories.length, + itemBuilder: (context, index) { + return Container( + margin: EdgeInsets.symmetric(horizontal: 15), + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + border: Border.all( + color: index == 1 ? Colors.black : Colors.black26, + ), + ), + child: Center( + child: Text( + catergories[index], + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.w500, + color: index == 1 ? Colors.black : Colors.black26, + ), + ), + ), + ); + }, + ), + ), + SizedBox( + height: 20, + ), + Padding( + padding: const EdgeInsets.only(left: 15), + child: SizedBox( + height: 350, + child: ListView.builder( + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemCount: 2, + itemBuilder: (context, index) { + if (index == 0) { + // First gray box + return Stack( + children: [ + Container( + margin: EdgeInsets.only( + right: 15, + top: 5, + left: 5, + bottom: 5, + ), + width: MediaQuery.of(context).size.width / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: colors.gryClr, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + spreadRadius: 1, + ), + ], + ), + child: Column( + children: [ + Container( + height: 280, + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ProductScreen( + selectedDisease: disease), + ), + ); + }, + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(15), + child: Image.asset( + "assets/images/disease_description_and_treatment_imgs/plant${index + 1}.png", + ), + ), + Positioned( + left: 140, + top: 10, + child: Text( + "", + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: colors.blClr, + ), + ), + ), + ], + ), + ), + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen( + selectedDisease: disease), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(14), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(30), + color: Colors.white, + ), + child: Text( + "Description", + style: TextStyle( + fontSize: 16, + color: colors.blClr, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen( + selectedDisease: disease), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: colors.blClr, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ); + } else { + // Second gray box + return Stack( + children: [ + Container( + margin: EdgeInsets.only( + right: 15, + top: 5, + left: 5, + bottom: 5, + ), + width: MediaQuery.of(context).size.width / 2, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: colors.gryClr, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 2, + spreadRadius: 1, + ), + ], + ), + child: Column( + children: [ + Container( + height: 280, + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen2( + selectedDisease: disease), + ), + ); + }, + child: Stack( + children: [ + Padding( + padding: const EdgeInsets.all(15), + child: Image.asset( + "assets/images/disease_description_and_treatment_imgs/plant${index + 1}.png", + ), + ), + Positioned( + left: 140, + top: 10, + child: Text( + "", + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: colors.blClr, + ), + ), + ), + ], + ), + ), + ), + Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen2( + selectedDisease: disease), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(14), + decoration: BoxDecoration( + borderRadius: + BorderRadius.circular(30), + color: Colors.white, + ), + child: Text( + "Treatment", + style: TextStyle( + fontSize: 16, + color: colors.blClr, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + ProductScreen2( + selectedDisease: disease), + ), + ); + }, + child: Container( + padding: EdgeInsets.all(12), + decoration: BoxDecoration( + shape: BoxShape.circle, + color: colors.blClr, + ), + ), + ), + ], + ), + ], + ), + ), + ], + ); + } + }, + ), + ), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/disease_description_treatment/main.dart b/lib/disease_description_treatment/main.dart new file mode 100644 index 0000000..d917359 --- /dev/null +++ b/lib/disease_description_treatment/main.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:TeaHub/disease_description_treatment/welcome_screen.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: WelcomeScreen( + disease: "Initial Disease"), // Pass the disease parameter here + ); + } +} diff --git a/lib/disease_description_treatment/product_screen.dart b/lib/disease_description_treatment/product_screen.dart new file mode 100644 index 0000000..b2d98b8 --- /dev/null +++ b/lib/disease_description_treatment/product_screen.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:TeaHub/disease_description_treatment/colors.dart'; + +class ProductScreen extends StatelessWidget { + final String selectedDisease; + ProductScreen({required this.selectedDisease}); + + String getDescription(String disease) { + switch (disease) { + case 'Algal Leaf Spot': + return 'Algar leaf spot is a plant disease found in warm, humid areas or in places like greenhouses. It is caused by a green parasitic alga called Cephaleuros virescens. This alga usually lives on plants that have tough, leathery leaves. Tea plants are more likely to get infected when the soil does not drain properly, when the nutrients aren’t balanced, and they’re in hot and humid places.'; // Change the description text here + case 'Brown Blight': + return 'Brown blight is a widespread leaf disease found in all tea fields. It appears in weakened or injured bushes due to hard plucking, herbicide exposure, sun damage, waterlogging, and stem issues.'; + case 'Gray Blight': + return 'Gray blight is caused by the Pestalotiopsis fungus and affects both young and old leaves. When new shoots are infected, they start dying.'; + case 'Helopeltis': + return 'Helopeltis is a genus of insects in the family Miridae, commonly known as mosquito bugs. These insects are known for their economic significance as pests, particularly in agriculture. There are several species in the genus Helopeltis that can damage a variety of crops. Helopeltis Antoni, H. Brady, H. Sabora is the predominant species that attacks crops. Affected crops include cocoa, cashews, cotton, and tea.'; + case 'Red Leaf Spot': + return 'Red leaf spot is a disease that occurs on creeping bentgrass when it’s warm and wet in spring, summer, or fall. It is caused by a type of disease called "Helminthosporium" which includes several diseases caused by fungi. These fungi create big, cigar-shaped spores.'; + default: + return 'Description not found'; + } + } + + @override + Widget build(BuildContext context) { + String description = getDescription(selectedDisease); + return Scaffold( + backgroundColor: colors.whiteClr, + body: SafeArea( + child: Column( + children: [ + SizedBox(height: 15), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black12, + ), + ), + ), + Text( + "Description", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black12, + ), + ), + ), + ], + ), + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/welcome.jpg", + height: MediaQuery.of(context).size.height / 2, + ), + SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + selectedDisease, // Display the selected disease + style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + ), + Row( + children: [], + ) + ], + ), + ), + SizedBox(height: 15), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Text(description), + ), + ], + ), + ), + ); + } +} diff --git a/lib/disease_description_treatment/product_screen2.dart b/lib/disease_description_treatment/product_screen2.dart new file mode 100644 index 0000000..2809862 --- /dev/null +++ b/lib/disease_description_treatment/product_screen2.dart @@ -0,0 +1,94 @@ +import 'package:flutter/material.dart'; +import 'package:TeaHub/disease_description_treatment/colors.dart'; + +class ProductScreen2 extends StatelessWidget { + final String selectedDisease; + ProductScreen2({required this.selectedDisease}); + + String getDescription(String disease) { + switch (disease) { + case 'Algal Leaf Spot': + return 'Algar leaf spot is a plant disease found in warm, humid areas or in places like greenhouses. It is caused by a green parasitic alga called Cephaleuros virescens. This alga usually lives on plants that have tough, leathery leaves. Tea plants are more likely to get infected when the soil does not drain properly, when the nutrients aren’t balanced, and they’re in hot and humid places.'; // Change the description text here + case 'Brown Blight': + return 'Brown blight is a widespread leaf disease found in all tea fields. It appears in weakened or injured bushes due to hard plucking, herbicide exposure, sun damage, waterlogging, and stem issues.'; + case 'Gray Blight': + return 'Gray blight is caused by the Pestalotiopsis fungus and affects both young and old leaves. When new shoots are infected, they start dying.'; + case 'Helopeltis': + return 'Helopeltis is a genus of insects in the family Miridae, commonly known as mosquito bugs. These insects are known for their economic significance as pests, particularly in agriculture. There are several species in the genus Helopeltis that can damage a variety of crops. Helopeltis Antoni, H. Brady, H. Sabora is the predominant species that attacks crops. Affected crops include cocoa, cashews, cotton, and tea.'; + case 'Red Leaf Spot': + return 'Red leaf spot is a disease that occurs on creeping bentgrass when it’s warm and wet in spring, summer, or fall. It is caused by a type of disease called "Helminthosporium" which includes several diseases caused by fungi. These fungi create big, cigar-shaped spores.'; + default: + return 'Description not found'; + } + } + + @override + Widget build(BuildContext context) { + String description = getDescription(selectedDisease); + return Scaffold( + backgroundColor: colors.whiteClr, + body: SafeArea( + child: Column( + children: [ + SizedBox(height: 15), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black12, + ), + ), + ), + Text( + "Treatment", + style: TextStyle(fontSize: 18, fontWeight: FontWeight.bold), + ), + Container( + padding: EdgeInsets.all(10), + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black12, + ), + ), + ), + ], + ), + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/welcome.jpg", + height: MediaQuery.of(context).size.height / 2, + ), + SizedBox(height: 10), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + selectedDisease, // Display the selected disease + style: TextStyle(fontSize: 22, fontWeight: FontWeight.bold), + ), + Row( + children: [], + ) + ], + ), + ), + SizedBox(height: 15), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15), + child: Text(description), + ), + ], + ), + ), + ); + } +} diff --git a/lib/disease_description_treatment/welcome_screen.dart b/lib/disease_description_treatment/welcome_screen.dart new file mode 100644 index 0000000..8ef3496 --- /dev/null +++ b/lib/disease_description_treatment/welcome_screen.dart @@ -0,0 +1,69 @@ +import 'package:TeaHub/disease_description_treatment/home_screen.dart'; +import 'package:flutter/material.dart'; +import 'package:TeaHub/disease_description_treatment/colors.dart'; + +class WelcomeScreen extends StatelessWidget { + final String disease; + const WelcomeScreen({Key? key, required this.disease}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + color: colors.whiteClr, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + disease, + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 50, + fontWeight: FontWeight.bold, + letterSpacing: 1, + wordSpacing: 1, + ), + ), + Image.asset( + "assets/images/disease_description_and_treatment_imgs/welcome.jpg", + fit: BoxFit.cover, + scale: 1.2, + ), + SizedBox(height: 50), + InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => HomeScreen( + disease: disease, + ), + )); + }, + child: Container( + padding: EdgeInsets.all(14), + decoration: BoxDecoration( + color: colors.grnClr, + shape: BoxShape.circle, + boxShadow: [ + BoxShadow( + color: Colors.black12, + blurRadius: 6, + spreadRadius: 4, + ), + ], + ), + child: Text( + "GO", + style: TextStyle( + color: Colors.white, + fontSize: 17, + fontWeight: FontWeight.w500), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/disease_treatment/AppNavigationScreen.dart b/lib/disease_treatment/AppNavigationScreen.dart new file mode 100644 index 0000000..2a88deb --- /dev/null +++ b/lib/disease_treatment/AppNavigationScreen.dart @@ -0,0 +1,268 @@ +import 'package:flutter/material.dart'; + +class AppNavigationScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Positioned.fill( + child: Image.asset( + 'images/your_image.jpg', + fit: BoxFit.cover, + ), + ), + Positioned( + top: 312, + left: 0, + right: 0, + child: Container( + width: 375, + height: 500, + decoration: BoxDecoration( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + color: Colors.white, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: 343, + height: 76, + margin: EdgeInsets.only(left: 18, top: 30), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'Heading', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 16, + fontWeight: FontWeight.w700, + letterSpacing: 0, + ), + ), + Text( + 'Subheading', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 24, + fontWeight: FontWeight.w700, + letterSpacing: 0, + color: Colors.lightGreen, + ), + ), + ], + ), + ), + ], + ), + ), + ), + Positioned( + top: 433, + left: 11, + child: Container( + width: 350, + height: 47, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(28), + color: Color(0xFFE6FFD6), // #E6FFD6 + ), + ), + ), + Positioned( + top: 450, + left: 36, + child: Container( + width: 134, + height: 17, + child: Text( + 'Description', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.w600, + letterSpacing: 0, + height: 1.5, // Line height equivalent to 21px + color: Colors.black, // Assuming text color is black + ), + textAlign: TextAlign.center, + ), + ), + ), + Positioned( + top: 447, + left: 198, + child: Container( + width: 141, + height: 21, + child: Text( + 'Treatment', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.w600, + letterSpacing: 0, + height: 1.5, // Line height equivalent to 21px + color: Colors.black, // Assuming text color is black + ), + textAlign: TextAlign.center, + ), + ), + ), + Positioned( + top: 512, + left: 18, + child: Container( + width: 273, + height: 34, + child: Text( + 'Treatment with Biological Agents', + style: TextStyle( + fontFamily: 'Inter', + fontSize: 16, + fontWeight: FontWeight.w700, + letterSpacing: 0, + height: 1.1875, // Line height equivalent to 19px + color: Color(0xFF4ECB81), // #4ECB81 + ), + textAlign: TextAlign.left, + ), + ), + ), + // Container 1 + Positioned( + top: 572, + left: 25, + child: Container( + width: 117, + height: 115, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: const Color.fromARGB(255, 255, 255, 255), + boxShadow: [ + BoxShadow( + color: Color(0x40000000), + blurRadius: 4, + offset: Offset(4, 4), + ), + ], + ), + ), + ), + // Image 1 + Positioned( + top: 572, + left: 44, + child: Image.asset( + 'images/med 1.png', + width: 80, + height: 81, + ), + ), + // Container 2 + Positioned( + top: 572, + left: 222, + child: Container( + width: 117, + height: 115, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(15), + color: const Color.fromARGB(255, 255, 255, 255), + boxShadow: [ + BoxShadow( + color: Color(0x40000000), + blurRadius: 4, + offset: Offset(4, 4), + ), + ], + ), + ), + ), + // Image 2 + Positioned( + top: 572, + left: 241, + child: Image.asset( + 'images/med 1.png', + width: 80, + height: 81, + ), + ), + // Container with line 1 + Positioned( + top: 659, + left: 24, + child: Container( + width: 118, + height: 1, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 1, + color: Color(0xFFF0F0F0), + ), + ), + ), + ), + ), + // Text below line 1 + Positioned( + top: 674, + left: 24, + child: Text( + 'Medicine 1', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.w600, + letterSpacing: 0, + height: 1.5, + color: Colors.black, + ), + ), + ), + + // Container with line 2 + Positioned( + top: 661, + left: 222, + child: Container( + width: 118, + height: 1, + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + width: 1, + color: Color(0xFFF0F0F0), + ), + ), + ), + ), + ), + // Text below line 2 + Positioned( + top: 676, + left: 222, + child: Text( + 'Medicine 2', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 14, + fontWeight: FontWeight.w600, + letterSpacing: 0, + height: 1.5, + color: Colors.black, + ), + ), + ), + ], + ), + ); + } +} \ No newline at end of file diff --git a/lib/disease_treatment/main.dart b/lib/disease_treatment/main.dart new file mode 100644 index 0000000..c3084b6 --- /dev/null +++ b/lib/disease_treatment/main.dart @@ -0,0 +1,21 @@ +// main.dart + +import 'package:chatbotui/disease_treatment/AppNavigationScreen.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Your App Name', + theme: ThemeData( + primarySwatch: Colors.blue, + ), + home: AppNavigationScreen(), + ); + } +} diff --git a/lib/editor_page/core/app_export.dart b/lib/editor_page/core/app_export.dart new file mode 100644 index 0000000..53add88 --- /dev/null +++ b/lib/editor_page/core/app_export.dart @@ -0,0 +1,7 @@ +export '../core/utils/image_constant.dart'; +export '../routes/app_routes.dart'; +export '../theme/app_decoration.dart'; +export '../theme/theme_helper.dart'; +export '../widgets/custom_image_view.dart'; +export '../theme/custom_button_style.dart'; +export '../core/utils/date_time_utils.dart'; diff --git a/lib/editor_page/core/utils/date_time_utils.dart b/lib/editor_page/core/utils/date_time_utils.dart new file mode 100644 index 0000000..baead04 --- /dev/null +++ b/lib/editor_page/core/utils/date_time_utils.dart @@ -0,0 +1,17 @@ +import 'package:intl/date_symbol_data_local.dart'; +import 'package:intl/intl.dart'; + +const String dateTimeFormatPattern = 'dd/MM/yyyy'; + +extension DateTimeExtension on DateTime { + /// Return a string representing [date] formatted according to our locale + String format({ + String pattern = dateTimeFormatPattern, + String? locale, + }) { + if (locale != null && locale.isNotEmpty) { + initializeDateFormatting(locale); + } + return DateFormat(pattern, locale).format(this); + } +} diff --git a/lib/editor_page/core/utils/image_constant.dart b/lib/editor_page/core/utils/image_constant.dart new file mode 100644 index 0000000..5f0d89d --- /dev/null +++ b/lib/editor_page/core/utils/image_constant.dart @@ -0,0 +1,27 @@ +class ImageConstant { + // Image folder path + static String imagePath = 'assets/images'; + + // Common images + static String imgArrowLeft = '$imagePath/img_arrow_left.svg'; + + static String imgSrilanka1 = '$imagePath/img_srilanka_1.png'; + + static String imgArrowdropdown = '$imagePath/img_arrowdropdown.svg'; + + static String imgGroup10 = '$imagePath/img_group_10.png'; + + static String imgHome1SvgrepoCom = '$imagePath/img_home_1_svgrepo_com.svg'; + + static String imgContrast = '$imagePath/img_contrast.svg'; + + static String imgScanSvgrepoCom = '$imagePath/img_scan_svgrepo_com.svg'; + + static String imgPlantPotSvgrepoCom = + '$imagePath/img_plant_pot_svgrepo_com.svg'; + + static String imgUserCircleSvgrepoCom = + '$imagePath/img_user_circle_svgrepo_com.svg'; + + static String imageNotFound = 'assets/images/image_not_found.png'; +} diff --git a/lib/editor_page/presentation/app_navigation_screen/app_navigation_screen.dart b/lib/editor_page/presentation/app_navigation_screen/app_navigation_screen.dart new file mode 100644 index 0000000..a8d57a6 --- /dev/null +++ b/lib/editor_page/presentation/app_navigation_screen/app_navigation_screen.dart @@ -0,0 +1,122 @@ +import 'package:flutter/material.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + + +class AppNavigationScreen extends StatelessWidget { + const AppNavigationScreen({Key? key}) + : super( + key: key, + ); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + backgroundColor: Color(0XFFFFFFFF), + body: SizedBox( + width: double.maxFinite, + child: Column( + children: [ + Container( + decoration: BoxDecoration( + color: Color(0XFFFFFFFF), + ), + child: Column( + children: [ + SizedBox(height: 10.v), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.h), + child: Text( + "App Navigation", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0XFF000000), + fontSize: 20.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + SizedBox(height: 10.v), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.only(left: 20.h), + child: Text( + "Check your app's UI from the below demo screens of your app.", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0XFF888888), + fontSize: 16.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + SizedBox(height: 5.v), + Divider( + height: 1.v, + thickness: 1.v, + color: Color(0XFF000000), + ), + ], + ), + ), + _buildGroupAP12(context), + ], + ), + ), + ), + ); + } + + /// Section Widget + Widget _buildGroupAP12(BuildContext context) { + return Expanded( + child: SingleChildScrollView( + child: Container( + decoration: BoxDecoration( + color: Color(0XFFFFFFFF), + ), + child: Container( + decoration: BoxDecoration( + color: Color(0XFFFFFFFF), + ), + child: Column( + children: [ + SizedBox(height: 10.v), + Align( + alignment: Alignment.centerLeft, + child: Padding( + padding: EdgeInsets.symmetric(horizontal: 20.h), + child: Text( + "Edit Profile - Container", + textAlign: TextAlign.center, + style: TextStyle( + color: Color(0XFF000000), + fontSize: 20.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + ), + ), + ), + SizedBox(height: 10.v), + SizedBox(height: 5.v), + Divider( + height: 1.v, + thickness: 1.v, + color: Color(0XFF888888), + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/editor_page/presentation/edit_profile_container_screen/edit_profile_container_screen.dart b/lib/editor_page/presentation/edit_profile_container_screen/edit_profile_container_screen.dart new file mode 100644 index 0000000..ea5c5ce --- /dev/null +++ b/lib/editor_page/presentation/edit_profile_container_screen/edit_profile_container_screen.dart @@ -0,0 +1,62 @@ +import '../../presentation/edit_profile_page/edit_profile_page.dart'; +import '../../widgets/custom_bottom_bar.dart'; +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; + +// ignore_for_file: must_be_immutable +class EditProfileContainerScreen extends StatelessWidget { + EditProfileContainerScreen({Key? key}) : super(key: key); + + GlobalKey navigatorKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + body: Navigator( + key: navigatorKey, + initialRoute: AppRoutes.editProfilePage, + onGenerateRoute: (routeSetting) => PageRouteBuilder( + pageBuilder: (ctx, ani, ani1) => + getCurrentPage(routeSetting.name!), + transitionDuration: Duration(seconds: 0) + ) + ), + bottomNavigationBar: _buildBottomBar(context) + ) + ); + } + + /// Section Widget + Widget _buildBottomBar(BuildContext context) { + return CustomBottomBar(onChanged: (BottomBarEnum type) { + Navigator.pushNamed(navigatorKey.currentContext!, getCurrentRoute(type)); + }); + } + + ///Handling route based on bottom click actions + String getCurrentRoute(BottomBarEnum type) { + switch (type) { + case BottomBarEnum.Home1svgrepocom: + return "/"; + case BottomBarEnum.Contrast: + return "/"; + case BottomBarEnum.Plantpotsvgrepocom: + return AppRoutes.editProfilePage; + case BottomBarEnum.Usercirclesvgrepocom: + return "/"; + default: + return "/"; + } + } + + ///Handling page based on route + Widget getCurrentPage(String currentRoute) { + switch (currentRoute) { + case AppRoutes.editProfilePage: + return EditProfilePage(); + default: + return DefaultWidget(); + } + } +} diff --git a/lib/editor_page/presentation/edit_profile_page/edit_profile_page.dart b/lib/editor_page/presentation/edit_profile_page/edit_profile_page.dart new file mode 100644 index 0000000..94c9ac8 --- /dev/null +++ b/lib/editor_page/presentation/edit_profile_page/edit_profile_page.dart @@ -0,0 +1,158 @@ +import '../../widgets/app_bar/custom_app_bar.dart'; +import '../../widgets/app_bar/appbar_leading_image.dart'; +import '../../widgets/app_bar/appbar_title.dart'; +import '../../widgets/custom_text_form_field.dart'; +import '../../widgets/custom_elevated_button.dart'; +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + + +// ignore_for_file: must_be_immutable +class EditProfilePage extends StatelessWidget { + EditProfilePage({Key? key}) : super(key: key); + + TextEditingController fullNameController = TextEditingController(); + + TextEditingController nameController = TextEditingController(); + + TextEditingController emailController = TextEditingController(); + + TextEditingController phoneNumberController = TextEditingController(); + + TextEditingController bigOutlineDefaultController = TextEditingController(); + + TextEditingController addressController = TextEditingController(); + + GlobalKey _formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + return SafeArea( + child: Scaffold( + resizeToAvoidBottomInset: false, + appBar: _buildAppBar(context), + body: SizedBox( + width: SizeUtils.width, + child: SingleChildScrollView( + padding: EdgeInsets.only( + bottom: MediaQuery.of(context).viewInsets.bottom), + child: Form( + key: _formKey, + child: Container( + width: double.maxFinite, + padding: EdgeInsets.symmetric( + horizontal: 24.h, vertical: 17.v), + child: Column(children: [ + _buildFullName(context), + SizedBox(height: 24.v), + _buildName(context), + SizedBox(height: 24.v), + _buildEmail(context), + SizedBox(height: 24.v), + _buildPhoneNumber(context), + SizedBox(height: 24.v), + _buildBigOutlineDefault(context), + SizedBox(height: 24.v), + _buildAddress(context), + SizedBox(height: 24.v), + _buildSubmit(context), + SizedBox(height: 5.v) + ]))))))); + } + + /// Section Widget + PreferredSizeWidget _buildAppBar(BuildContext context) { + return CustomAppBar( + leadingWidth: 48.h, + leading: AppbarLeadingImage( + imagePath: ImageConstant.imgArrowLeft, + margin: EdgeInsets.only(left: 24.h, top: 15.v, bottom: 16.v), + onTap: () { + onTapArrowLeft(context); + }), + title: AppbarTitle( + text: "Edit profile", + margin: EdgeInsets.only(left: 90.h))); + } + + /// Section Widget + Widget _buildFullName(BuildContext context) { + return CustomTextFormField( + controller: fullNameController, + hintText: "Full name"); + } + + /// Section Widget + Widget _buildName(BuildContext context) { + return CustomTextFormField( + controller: nameController, + hintText: "Nick name"); + } + + /// Section Widget + Widget _buildEmail(BuildContext context) { + return CustomTextFormField( + controller: emailController, + hintText: "Email", + textInputType: TextInputType.emailAddress); + } + + /// Section Widget + Widget _buildPhoneNumber(BuildContext context) { + return CustomTextFormField( + controller: phoneNumberController, + hintText: "Phone number", + textInputType: TextInputType.phone); + } + + /// Section Widget + Widget _buildBigOutlineDefault(BuildContext context) { + return CustomTextFormField( + controller: bigOutlineDefaultController, + hintText: "Gender", + textInputAction: TextInputAction.done); + } + + /// Section Widget + Widget _buildAddress(BuildContext context) { + return CustomTextFormField( + controller: addressController, + hintText: "Address", + textInputAction: TextInputAction.done); + } + + Widget _buildSubmit(BuildContext context) { + return CustomElevatedButton( + text: "submit".toUpperCase(), + onPressed: () async { + // Update user profile data here + String fullName = fullNameController.text; + String email = emailController.text; + + // You can use Firebase Firestore or any other database to update the user data + // For example, using Firebase Firestore: + try { + // Assuming you have a Firestore collection called 'users' + await FirebaseFirestore.instance.collection('users').doc(userId).update({ + 'fullName': fullName, + 'email': email, + // Add other fields as needed + }); + + // Notifying the main interface that the profile has been updated + Navigator.pop(context, true); // Passing true to indicate profile updated + } catch (error) { + // Handle error updating profile + print('Error updating profile: $error'); + // Optionally, you can show a snackbar or dialog to inform the user about the error + } + }, + ); +} + + /// Navigates back to the previous screen. + onTapArrowLeft(BuildContext context) { + Navigator.pop(context); + } +} diff --git a/lib/editor_page/routes/app_routes.dart b/lib/editor_page/routes/app_routes.dart new file mode 100644 index 0000000..05089c7 --- /dev/null +++ b/lib/editor_page/routes/app_routes.dart @@ -0,0 +1,17 @@ +import 'package:flutter/material.dart'; +import '../presentation/edit_profile_container_screen/edit_profile_container_screen.dart'; + + +class AppRoutes { + static const String editProfileContainerScreen = + '/edit_profile_container_screen'; + + static const String editProfilePage = '/edit_profile_page'; + + static const String appNavigationScreen = '/app_navigation_screen'; + + static Map routes = { + editProfileContainerScreen: (context) => EditProfileContainerScreen(), + + }; +} diff --git a/lib/editor_page/theme/app_decoration.dart b/lib/editor_page/theme/app_decoration.dart new file mode 100644 index 0000000..b0d46a5 --- /dev/null +++ b/lib/editor_page/theme/app_decoration.dart @@ -0,0 +1,29 @@ +import 'package:flutter/material.dart'; +import '../theme/theme_helper.dart'; + +class AppDecoration { + // Fill decorations + static BoxDecoration get fillWhiteA => BoxDecoration( + color: appTheme.whiteA700, + ); +} + +class BorderRadiusStyle {} + +// Comment/Uncomment the below code based on your Flutter SDK version. + +// For Flutter SDK Version 3.7.2 or greater. + +double get strokeAlignInside => BorderSide.strokeAlignInside; + +double get strokeAlignCenter => BorderSide.strokeAlignCenter; + +double get strokeAlignOutside => BorderSide.strokeAlignOutside; + +// For Flutter SDK Version 3.7.1 or less. + +// StrokeAlign get strokeAlignInside => StrokeAlign.inside; +// +// StrokeAlign get strokeAlignCenter => StrokeAlign.center; +// +// StrokeAlign get strokeAlignOutside => StrokeAlign.outside; diff --git a/lib/editor_page/theme/custom_button_style.dart b/lib/editor_page/theme/custom_button_style.dart new file mode 100644 index 0000000..b2f2fd8 --- /dev/null +++ b/lib/editor_page/theme/custom_button_style.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +/// A class that offers pre-defined button styles for customizing button appearance. +class CustomButtonStyles { + // text button style + static ButtonStyle get none => ButtonStyle( + backgroundColor: MaterialStateProperty.all(Colors.transparent), + elevation: MaterialStateProperty.all(0), + ); +} diff --git a/lib/editor_page/theme/theme_helper.dart b/lib/editor_page/theme/theme_helper.dart new file mode 100644 index 0000000..0c4bb91 --- /dev/null +++ b/lib/editor_page/theme/theme_helper.dart @@ -0,0 +1,124 @@ +import 'package:flutter/material.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + +String _appTheme = "primary"; + +/// Helper class for managing themes and colors. +class ThemeHelper { + // A map of custom color themes supported by the app + Map _supportedCustomColor = { + 'primary': PrimaryColors() + }; + +// A map of color schemes supported by the app + Map _supportedColorScheme = { + 'primary': ColorSchemes.primaryColorScheme + }; + + /// Changes the app theme to [_newTheme]. + void changeTheme(String _newTheme) { + _appTheme = _newTheme; + } + + /// Returns the primary colors for the current theme. + PrimaryColors _getThemeColors() { + //throw exception to notify given theme is not found or not generated by the generator + if (!_supportedCustomColor.containsKey(_appTheme)) { + throw Exception( + "$_appTheme is not found.Make sure you have added this theme class in JSON Try running flutter pub run build_runner"); + } + //return theme from map + + return _supportedCustomColor[_appTheme] ?? PrimaryColors(); + } + + /// Returns the current theme data. + ThemeData _getThemeData() { + //throw exception to notify given theme is not found or not generated by the generator + if (!_supportedColorScheme.containsKey(_appTheme)) { + throw Exception( + "$_appTheme is not found.Make sure you have added this theme class in JSON Try running flutter pub run build_runner"); + } + //return theme from map + + var colorScheme = + _supportedColorScheme[_appTheme] ?? ColorSchemes.primaryColorScheme; + return ThemeData( + visualDensity: VisualDensity.standard, + colorScheme: colorScheme, + textTheme: TextThemes.textTheme(colorScheme), + scaffoldBackgroundColor: appTheme.whiteA700, + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + backgroundColor: colorScheme.primary, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.h), + ), + visualDensity: const VisualDensity( + vertical: -4, + horizontal: -4, + ), + padding: EdgeInsets.zero, + ), + ), + ); + } + + /// Returns the primary colors for the current theme. + PrimaryColors themeColor() => _getThemeColors(); + + /// Returns the current theme data. + ThemeData themeData() => _getThemeData(); +} + +/// Class containing the supported text theme styles. +class TextThemes { + static TextTheme textTheme(ColorScheme colorScheme) => TextTheme( + bodySmall: TextStyle( + color: colorScheme.secondaryContainer, + fontSize: 10.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w400, + ), + titleLarge: TextStyle( + color: appTheme.black900, + fontSize: 22.fSize, + fontFamily: 'Poppins', + fontWeight: FontWeight.w600, + ), + titleMedium: TextStyle( + color: appTheme.whiteA700, + fontSize: 16.fSize, + fontFamily: 'Roboto', + fontWeight: FontWeight.w500, + ), + ); +} + +/// Class containing the supported color schemes. +class ColorSchemes { + static final primaryColorScheme = ColorScheme.light( + // Primary colors + primary: Color(0XFF4ECB81), + secondaryContainer: Color(0XFF757575), + + // On colors(text colors) + onPrimary: Color(0XFF1E1E1E), + onPrimaryContainer: Color(0X334ECB81), + ); +} + +/// Class containing custom colors for a primary theme. +class PrimaryColors { + // Black + Color get black900 => Color(0XFF000000); + + // Gray + Color get gray500 => Color(0XFF9E9E9E); + + // White + Color get whiteA700 => Color(0XFFFFFFFF); +} + +PrimaryColors get appTheme => ThemeHelper().themeColor(); +ThemeData get theme => ThemeHelper().themeData(); diff --git a/lib/editor_page/widgets/app_bar/appbar_leading_image.dart b/lib/editor_page/widgets/app_bar/appbar_leading_image.dart new file mode 100644 index 0000000..8001971 --- /dev/null +++ b/lib/editor_page/widgets/app_bar/appbar_leading_image.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + +// ignore: must_be_immutable +class AppbarLeadingImage extends StatelessWidget { + AppbarLeadingImage({ + Key? key, + this.imagePath, + this.margin, + this.onTap, + }) : super( + key: key, + ); + + String? imagePath; + + EdgeInsetsGeometry? margin; + + Function? onTap; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () { + onTap!.call(); + }, + child: Padding( + padding: margin ?? EdgeInsets.zero, + child: CustomImageView( + imagePath: imagePath, + height: 24.adaptSize, + width: 24.adaptSize, + fit: BoxFit.contain, + ), + ), + ); + } +} diff --git a/lib/editor_page/widgets/app_bar/appbar_title.dart b/lib/editor_page/widgets/app_bar/appbar_title.dart new file mode 100644 index 0000000..f3b5a53 --- /dev/null +++ b/lib/editor_page/widgets/app_bar/appbar_title.dart @@ -0,0 +1,38 @@ +import 'package:flutter/material.dart'; +import '../../core/app_export.dart'; + +// ignore: must_be_immutable +class AppbarTitle extends StatelessWidget { + AppbarTitle({ + Key? key, + required this.text, + this.margin, + this.onTap, + }) : super( + key: key, + ); + + String text; + + EdgeInsetsGeometry? margin; + + Function? onTap; + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + onTap!.call(); + }, + child: Padding( + padding: margin ?? EdgeInsets.zero, + child: Text( + text, + style: theme.textTheme.titleLarge!.copyWith( + color: appTheme.black900, + ), + ), + ), + ); + } +} diff --git a/lib/editor_page/widgets/app_bar/custom_app_bar.dart b/lib/editor_page/widgets/app_bar/custom_app_bar.dart new file mode 100644 index 0000000..c7dbed3 --- /dev/null +++ b/lib/editor_page/widgets/app_bar/custom_app_bar.dart @@ -0,0 +1,50 @@ +import 'package:flutter/material.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; +// ignore: must_be_immutable +class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { + CustomAppBar({ + Key? key, + this.height, + this.leadingWidth, + this.leading, + this.title, + this.centerTitle, + this.actions, + }) : super( + key: key, + ); + + final double? height; + + final double? leadingWidth; + + final Widget? leading; + + final Widget? title; + + final bool? centerTitle; + + final List? actions; + + @override + Widget build(BuildContext context) { + return AppBar( + elevation: 0, + toolbarHeight: height ?? 56.v, + automaticallyImplyLeading: false, + backgroundColor: Colors.transparent, + leadingWidth: leadingWidth ?? 0, + leading: leading, + title: title, + titleSpacing: 0, + centerTitle: centerTitle ?? false, + actions: actions, + ); + } + + @override + Size get preferredSize => Size( + SizeUtils.width, + height ?? 56.v, + ); +} diff --git a/lib/editor_page/widgets/base_button.dart b/lib/editor_page/widgets/base_button.dart new file mode 100644 index 0000000..0a57200 --- /dev/null +++ b/lib/editor_page/widgets/base_button.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; + +class BaseButton extends StatelessWidget { + BaseButton({ + Key? key, + required this.text, + this.onPressed, + this.buttonStyle, + this.buttonTextStyle, + this.isDisabled, + this.height, + this.width, + this.margin, + this.alignment, + }) : super( + key: key, + ); + + final String text; + + final VoidCallback? onPressed; + + final ButtonStyle? buttonStyle; + + final TextStyle? buttonTextStyle; + + final bool? isDisabled; + + final double? height; + + final double? width; + + final EdgeInsets? margin; + + final Alignment? alignment; + + @override + Widget build(BuildContext context) { + return const SizedBox.shrink(); + } +} diff --git a/lib/editor_page/widgets/custom_bottom_bar.dart b/lib/editor_page/widgets/custom_bottom_bar.dart new file mode 100644 index 0000000..8234e27 --- /dev/null +++ b/lib/editor_page/widgets/custom_bottom_bar.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + +class CustomBottomBar extends StatefulWidget { + CustomBottomBar({this.onChanged}); + + Function(BottomBarEnum)? onChanged; + + @override + CustomBottomBarState createState() => CustomBottomBarState(); +} + +class CustomBottomBarState extends State { + int selectedIndex = 0; + + List bottomMenuList = [ + BottomMenuModel( + icon: ImageConstant.imgHome1SvgrepoCom, + activeIcon: ImageConstant.imgHome1SvgrepoCom, + type: BottomBarEnum.Home1svgrepocom, + ), + BottomMenuModel( + icon: ImageConstant.imgContrast, + activeIcon: ImageConstant.imgContrast, + type: BottomBarEnum.Contrast, + ), + BottomMenuModel( + icon: ImageConstant.imgPlantPotSvgrepoCom, + activeIcon: ImageConstant.imgPlantPotSvgrepoCom, + type: BottomBarEnum.Plantpotsvgrepocom, + ), + BottomMenuModel( + icon: ImageConstant.imgUserCircleSvgrepoCom, + activeIcon: ImageConstant.imgUserCircleSvgrepoCom, + type: BottomBarEnum.Usercirclesvgrepocom, + ) + ]; + + @override + Widget build(BuildContext context) { + return Container( + height: 115.v, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage( + ImageConstant.imgGroup10, + ), + fit: BoxFit.cover, + ), + ), + child: BottomNavigationBar( + backgroundColor: Colors.transparent, + showSelectedLabels: false, + showUnselectedLabels: false, + selectedFontSize: 0, + elevation: 0, + currentIndex: selectedIndex, + type: BottomNavigationBarType.fixed, + items: List.generate(bottomMenuList.length, (index) { + return BottomNavigationBarItem( + icon: CustomImageView( + imagePath: bottomMenuList[index].icon, + height: 40.adaptSize, + width: 40.adaptSize, + color: appTheme.whiteA700, + ), + activeIcon: CustomImageView( + imagePath: bottomMenuList[index].activeIcon, + height: 40.adaptSize, + width: 40.adaptSize, + color: theme.colorScheme.onPrimary, + ), + label: '', + ); + }), + onTap: (index) { + selectedIndex = index; + widget.onChanged?.call(bottomMenuList[index].type); + setState(() {}); + }, + ), + ); + } +} + +enum BottomBarEnum { + Home1svgrepocom, + Contrast, + Plantpotsvgrepocom, + Usercirclesvgrepocom, +} + +class BottomMenuModel { + BottomMenuModel({ + required this.icon, + required this.activeIcon, + required this.type, + }); + + String icon; + + String activeIcon; + + BottomBarEnum type; +} + +class DefaultWidget extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Container( + color: Color(0xffffffff), + padding: EdgeInsets.all(10), + child: Center( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'Please replace the respective Widget here', + style: TextStyle( + fontSize: 18, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/editor_page/widgets/custom_drop_down.dart b/lib/editor_page/widgets/custom_drop_down.dart new file mode 100644 index 0000000..653ac83 --- /dev/null +++ b/lib/editor_page/widgets/custom_drop_down.dart @@ -0,0 +1,144 @@ +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + +class CustomDropDown extends StatelessWidget { + CustomDropDown({ + Key? key, + this.alignment, + this.width, + this.focusNode, + this.icon, + this.autofocus = true, + this.textStyle, + this.items, + this.hintText, + this.hintStyle, + this.prefix, + this.prefixConstraints, + this.suffix, + this.suffixConstraints, + this.contentPadding, + this.borderDecoration, + this.fillColor, + this.filled = true, + this.validator, + this.onChanged, String? value, + }) : super( + key: key, + ); + + final Alignment? alignment; + + final double? width; + + final FocusNode? focusNode; + + final Widget? icon; + + final bool? autofocus; + + final TextStyle? textStyle; + + final List? items; + + final String? hintText; + + final TextStyle? hintStyle; + + final Widget? prefix; + + final BoxConstraints? prefixConstraints; + + final Widget? suffix; + + final BoxConstraints? suffixConstraints; + + final EdgeInsets? contentPadding; + + final InputBorder? borderDecoration; + + final Color? fillColor; + + final bool? filled; + + final FormFieldValidator? validator; + + final Function(String)? onChanged; + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment ?? Alignment.center, + child: dropDownWidget, + ) + : dropDownWidget; + } + + Widget get dropDownWidget => SizedBox( + width: width ?? double.maxFinite, + child: DropdownButtonFormField( + focusNode: focusNode ?? FocusNode(), + icon: icon, + autofocus: autofocus!, + style: textStyle ?? theme.textTheme.bodySmall, + items: items?.map>((String value) { + return DropdownMenuItem( + value: value, + child: Text( + value, + overflow: TextOverflow.ellipsis, + style: hintStyle ?? theme.textTheme.bodySmall, + ), + ); + }).toList(), + decoration: decoration, + validator: validator, + onChanged: (value) { + onChanged!(value.toString()); + }, + ), + ); + InputDecoration get decoration => InputDecoration( + hintText: hintText ?? "", + hintStyle: hintStyle ?? theme.textTheme.bodySmall, + prefixIcon: prefix, + prefixIconConstraints: prefixConstraints, + suffixIcon: suffix, + suffixIconConstraints: suffixConstraints, + isDense: true, + contentPadding: contentPadding ?? + EdgeInsets.only( + left: 16.h, + top: 19.v, + bottom: 19.v, + ), + fillColor: fillColor ?? theme.colorScheme.onPrimaryContainer, + filled: filled, + border: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + enabledBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + focusedBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + ); +} diff --git a/lib/editor_page/widgets/custom_elevated_button.dart b/lib/editor_page/widgets/custom_elevated_button.dart new file mode 100644 index 0000000..324685b --- /dev/null +++ b/lib/editor_page/widgets/custom_elevated_button.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; +import 'base_button.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + +class CustomElevatedButton extends BaseButton { + CustomElevatedButton({ + Key? key, + this.decoration, + this.leftIcon, + this.rightIcon, + EdgeInsets? margin, + VoidCallback? onPressed, + ButtonStyle? buttonStyle, + Alignment? alignment, + TextStyle? buttonTextStyle, + bool? isDisabled, + double? height, + double? width, + required String text, + }) : super( + text: text, + onPressed: onPressed, + buttonStyle: buttonStyle, + isDisabled: isDisabled, + buttonTextStyle: buttonTextStyle, + height: height, + width: width, + alignment: alignment, + margin: margin, + ); + + final BoxDecoration? decoration; + + final Widget? leftIcon; + + final Widget? rightIcon; + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment ?? Alignment.center, + child: buildElevatedButtonWidget, + ) + : buildElevatedButtonWidget; + } + + Widget get buildElevatedButtonWidget => Container( + height: this.height ?? 44.v, + width: this.width ?? double.maxFinite, + margin: margin, + decoration: decoration, + child: ElevatedButton( + style: buttonStyle, + onPressed: isDisabled ?? false ? null : onPressed ?? () {}, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + leftIcon ?? const SizedBox.shrink(), + Text( + text, + style: buttonTextStyle ?? theme.textTheme.titleMedium, + ), + rightIcon ?? const SizedBox.shrink(), + ], + ), + ), + ); +} diff --git a/lib/editor_page/widgets/custom_image_view.dart b/lib/editor_page/widgets/custom_image_view.dart new file mode 100644 index 0000000..5d3b9d5 --- /dev/null +++ b/lib/editor_page/widgets/custom_image_view.dart @@ -0,0 +1,164 @@ +// ignore_for_file: must_be_immutable + +import 'dart:io'; + +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +class CustomImageView extends StatelessWidget { + ///[imagePath] is required parameter for showing image + String? imagePath; + + double? height; + double? width; + Color? color; + BoxFit? fit; + final String placeHolder; + Alignment? alignment; + VoidCallback? onTap; + EdgeInsetsGeometry? margin; + BorderRadius? radius; + BoxBorder? border; + + ///a [CustomImageView] it can be used for showing any type of images + /// it will shows the placeholder image if image is not found on network image + CustomImageView({ + this.imagePath, + this.height, + this.width, + this.color, + this.fit, + this.alignment, + this.onTap, + this.radius, + this.margin, + this.border, + this.placeHolder = 'assets/images/image_not_found.png', + }); + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment!, + child: _buildWidget(), + ) + : _buildWidget(); + } + + Widget _buildWidget() { + return Padding( + padding: margin ?? EdgeInsets.zero, + child: InkWell( + onTap: onTap, + child: _buildCircleImage(), + ), + ); + } + + ///build the image with border radius + _buildCircleImage() { + if (radius != null) { + return ClipRRect( + borderRadius: radius ?? BorderRadius.zero, + child: _buildImageWithBorder(), + ); + } else { + return _buildImageWithBorder(); + } + } + + ///build the image with border and border radius style + _buildImageWithBorder() { + if (border != null) { + return Container( + decoration: BoxDecoration( + border: border, + borderRadius: radius, + ), + child: _buildImageView(), + ); + } else { + return _buildImageView(); + } + } + + Widget _buildImageView() { + if (imagePath != null) { + switch (imagePath!.imageType) { + case ImageType.svg: + return Container( + height: height, + width: width, + child: SvgPicture.asset( + imagePath!, + height: height, + width: width, + fit: fit ?? BoxFit.contain, + colorFilter: color != null + ? ColorFilter.mode( + this.color ?? Colors.transparent, BlendMode.srcIn) + : null, + ), + ); + case ImageType.file: + return Image.file( + File(imagePath!), + height: height, + width: width, + fit: fit ?? BoxFit.cover, + color: color, + ); + case ImageType.network: + return CachedNetworkImage( + height: height, + width: width, + fit: fit, + imageUrl: imagePath!, + color: color, + placeholder: (context, url) => Container( + height: 30, + width: 30, + child: LinearProgressIndicator( + color: Colors.grey.shade200, + backgroundColor: Colors.grey.shade100, + ), + ), + errorWidget: (context, url, error) => Image.asset( + placeHolder, + height: height, + width: width, + fit: fit ?? BoxFit.cover, + ), + ); + case ImageType.png: + default: + return Image.asset( + imagePath!, + height: height, + width: width, + fit: fit ?? BoxFit.cover, + color: color, + ); + } + } + return SizedBox(); + } +} + +extension ImageTypeExtension on String { + ImageType get imageType { + if (this.startsWith('http') || this.startsWith('https')) { + return ImageType.network; + } else if (this.endsWith('.svg')) { + return ImageType.svg; + } else if (this.startsWith('file://')) { + return ImageType.file; + } else { + return ImageType.png; + } + } +} + +enum ImageType { svg, png, network, file, unknown } diff --git a/lib/editor_page/widgets/custom_text_form_field.dart b/lib/editor_page/widgets/custom_text_form_field.dart new file mode 100644 index 0000000..b544671 --- /dev/null +++ b/lib/editor_page/widgets/custom_text_form_field.dart @@ -0,0 +1,145 @@ +import 'package:flutter/material.dart'; +import '../core/app_export.dart'; +import 'package:chatbotui/chatbot_ui/core/utils/size_utils.dart'; + +class CustomTextFormField extends StatelessWidget { + CustomTextFormField({ + Key? key, + this.alignment, + this.width, + this.scrollPadding, + this.controller, + this.focusNode, + this.autofocus = true, + this.textStyle, + this.obscureText = false, + this.textInputAction = TextInputAction.next, + this.textInputType = TextInputType.text, + this.maxLines, + this.hintText, + this.hintStyle, + this.prefix, + this.prefixConstraints, + this.suffix, + this.suffixConstraints, + this.contentPadding, + this.borderDecoration, + this.fillColor, + this.filled = true, + this.validator, + }) : super( + key: key, + ); + + final Alignment? alignment; + + final double? width; + + final TextEditingController? scrollPadding; + + final TextEditingController? controller; + + final FocusNode? focusNode; + + final bool? autofocus; + + final TextStyle? textStyle; + + final bool? obscureText; + + final TextInputAction? textInputAction; + + final TextInputType? textInputType; + + final int? maxLines; + + final String? hintText; + + final TextStyle? hintStyle; + + final Widget? prefix; + + final BoxConstraints? prefixConstraints; + + final Widget? suffix; + + final BoxConstraints? suffixConstraints; + + final EdgeInsets? contentPadding; + + final InputBorder? borderDecoration; + + final Color? fillColor; + + final bool? filled; + + final FormFieldValidator? validator; + + @override + Widget build(BuildContext context) { + return alignment != null + ? Align( + alignment: alignment ?? Alignment.center, + child: textFormFieldWidget(context), + ) + : textFormFieldWidget(context); + } + + Widget textFormFieldWidget(BuildContext context) => SizedBox( + width: width ?? double.maxFinite, + child: TextFormField( + scrollPadding: + EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom), + controller: controller, + focusNode: focusNode ?? FocusNode(), + autofocus: autofocus!, + style: textStyle ?? theme.textTheme.bodySmall, + obscureText: obscureText!, + textInputAction: textInputAction, + keyboardType: textInputType, + maxLines: maxLines ?? 1, + decoration: decoration, + validator: validator, + ), + ); + InputDecoration get decoration => InputDecoration( + hintText: hintText ?? "", + hintStyle: hintStyle ?? theme.textTheme.bodySmall, + prefixIcon: prefix, + prefixIconConstraints: prefixConstraints, + suffixIcon: suffix, + suffixIconConstraints: suffixConstraints, + isDense: true, + contentPadding: contentPadding ?? + EdgeInsets.symmetric( + horizontal: 16.h, + vertical: 19.v, + ), + fillColor: fillColor ?? theme.colorScheme.onPrimaryContainer, + filled: filled, + border: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + enabledBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + focusedBorder: borderDecoration ?? + OutlineInputBorder( + borderRadius: BorderRadius.circular(8.h), + borderSide: BorderSide( + color: appTheme.gray500, + width: 1, + ), + ), + ); +} diff --git a/lib/emailVerification/emailVerification.dart b/lib/emailVerification/emailVerification.dart new file mode 100644 index 0000000..5e055f5 --- /dev/null +++ b/lib/emailVerification/emailVerification.dart @@ -0,0 +1,99 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + primarySwatch: Colors.green, + ), + home: SuccessScreen(), + ); + } +} + +class SuccessScreen extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Center( + child: Padding( + padding: EdgeInsets.all(24.0), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Image.asset( + 'assets/emailverificationui/tick.png', + width: 300, // Increased image size + height: 300, + ), + SizedBox(height: 24), + Text( + 'Successfully Login\nto the Account', // Text broken into two lines + style: TextStyle( + fontSize: 36, + fontWeight: FontWeight.bold, + color: Color(0xFF4ECB81), // Green text color + ), + textAlign: TextAlign.center, + ), + SizedBox(height: 24), + RichText( + textAlign: TextAlign.center, + text: TextSpan( + style: TextStyle(fontSize: 18, color: Colors.black, fontFamily: 'Poppins'), + children: [ + TextSpan(text: 'Verification email has been sent to "sender\'s email". Click on the link to complete the verification process.\n'), + TextSpan( + text: 'Wait 60 seconds to get new verification email.', + style: TextStyle(fontWeight: FontWeight.bold), + ), + ], + ), + ), + SizedBox(height: 40), + ElevatedButton( + onPressed: () { + // Add action for Resend Email button + }, + child: Text('Resend Email', style: TextStyle( + color: Color.fromRGBO(246, 237, 237, 1), + fontFamily: 'Poppins', + fontSize: 20, + )), + style: ElevatedButton.styleFrom( + primary: Color.fromRGBO(17, 136, 68, 1), + padding: EdgeInsets.symmetric(horizontal: 100, vertical: 20), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(15), + ), + ), + ), + SizedBox(height: 20), + TextButton( + onPressed: () { + // Add action for Cancel button + }, + child: Text('Cancel', style: TextStyle( + fontSize: 20, // Set font size to 20 + )), + style: TextButton.styleFrom( + primary: Colors.black, + textStyle: TextStyle( + fontFamily: 'Poppins', + ), + ), + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/forgot_password_page/forgot_password_page.dart b/lib/forgot_password_page/forgot_password_page.dart new file mode 100644 index 0000000..a3b71de --- /dev/null +++ b/lib/forgot_password_page/forgot_password_page.dart @@ -0,0 +1,353 @@ +import 'package:TeaHub/disease_description_treatment/colors.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; + +class ForgotPassword extends StatefulWidget { + const ForgotPassword({Key? key}) : super(key: key); + + @override + State createState() => _ForgotPasswordState(); +} + +class _ForgotPasswordState extends State { + final _emailController = TextEditingController(); + + @override + void dispose() { + _emailController.dispose(); + super.dispose(); + } + + Future passwordReset() async { + try { + await FirebaseAuth.instance + .sendPasswordResetEmail(email: _emailController.text.trim()); + + SendEmailMessage(); + } on FirebaseAuthException catch (e) { + print( + '------------------- Forgot Email Error : ${(e)} -------------------'); + + if (e.code == 'The email address is badly formatted') { + EmailFormatErrorMessage(); + } else if (e.code == 'Unable to establish connection on channel') { + EmptyEmailErrorMessage(); + } else { + NoEmailErrorMessage(); + } + } + } + + void SendEmailMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + content: Container( + width: 300, // Adjust width as needed + height: 250, // Adjust height as needed + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + 'Password Reset', + textAlign: TextAlign.center, // Align text to the center + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 27, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 10), + const Icon( + Icons.check_circle_sharp, // Replace with the appropriate icon + color: Color.fromARGB(255, 78, 203, 128), + size: 80, + ), + SizedBox(height: 10), // Adjust the height for spacing + Text.rich( + TextSpan( + text: "An email has been sent to ", + style: TextStyle( + fontSize: 17, + color: Theme.of(context).colorScheme.primary, + ), + children: [ + TextSpan( + text: _emailController.text.trim(), + style: TextStyle( + fontWeight: FontWeight.bold, + ), + ), + TextSpan( + text: " email address with a password reset link.", + ), + ], + ), + textAlign: TextAlign.center, // Align text to the center + ), + ], + ), + ), + actions: [ + Center( + child: Container( + width: 200, // Adjust width as needed + height: 40, // Adjust height as needed + + decoration: BoxDecoration( + borderRadius: BorderRadius.circular( + 5), // Adjust border radius for roundness + color: Colors.blue, // Set button background color + ), + child: TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + Navigator.pop(context); // closing the forgot password page + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.white, // Set text color + fontSize: 18, + ), + ), + ), + ), + ), + ], + ); + }, + ); + } + + void EmailFormatErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + "Invalid Email Format. Please enter a valid email address.", + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + void EmptyEmailErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Email Required', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + "Please enter your email address to reset your password.", + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + void NoEmailErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Theme.of(context).colorScheme.background, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: Text( + "Please ensure you have chosen the correct email address.", + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.background, + ), + body: SafeArea( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const SizedBox(height: 15), + Padding( + padding: EdgeInsets.only(top: 10.0), // Add padding here + child: Text( + 'Forgot Password', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 35, + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + const SizedBox(height: 30), + Image.asset( + 'assets/images/forgot_password/forgot_password.png', + height: 240, + width: 250, + ), + const SizedBox(height: 30), // Keeping the same size + Padding( + padding: EdgeInsets.all(10.0), + child: Text( + 'Enter the Email address associated\nwith your account and we\'ll send\nyou a link to reset your password', + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 18, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + const SizedBox(height: 20), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 30.0), + child: TextField( + controller: _emailController, + decoration: InputDecoration( + enabledBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).colorScheme.secondary, + ), + ), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide( + color: Theme.of(context).colorScheme.primary, + ), + ), + fillColor: Theme.of(context).colorScheme.tertiary, + filled: true, + hintText: 'Email', + hintStyle: TextStyle( + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + ), + const SizedBox(height: 25), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 20.0), + child: SizedBox( + height: 62, + width: 300, + child: MaterialButton( + onPressed: passwordReset, + color: const Color.fromARGB(255, 78, 203, 128), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 5.0), // Adjust the radius as needed + ), + child: Text( + 'Reset Password', + style: TextStyle( + fontSize: 18, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/home_page/constants.dart b/lib/home_page/constants.dart new file mode 100644 index 0000000..2324f70 --- /dev/null +++ b/lib/home_page/constants.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class Constants { + //Primary color + + static var primaryColor = Color.fromARGB(255, 87, 141, 111); + static var blackColor = Colors.black54; + + +} \ No newline at end of file diff --git a/lib/home_page/main_interface.dart b/lib/home_page/main_interface.dart new file mode 100644 index 0000000..94ddee1 --- /dev/null +++ b/lib/home_page/main_interface.dart @@ -0,0 +1,507 @@ +import 'package:flutter/material.dart'; +import 'utils.dart'; + +class Scene extends StatelessWidget { + @override + Widget build(BuildContext context) { + double baseWidth = 375; + double fem = MediaQuery.of(context).size.width / baseWidth; + double ffem = fem * 0.97; + return Scaffold(appBar: AppBar( + title: Text('Main Page'), + ), + body: Container( + width: double.infinity, + child: Container( + // maininterfaceQL4 (12:51) + width: double.infinity, + height: 792*fem, + decoration: const BoxDecoration ( + color: Color(0xffffffff), + ), + child: Stack( + children: [ + Positioned( + // navDB2 (12:52) + left: 19*fem, + top: 7*fem, + child: Container( + width: 342*fem, + height: 21*fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // pmfYp (I12:52;1:11) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 222*fem, 0*fem), + child: Text( + '9:40PM', + style: SafeGoogleFont ( + 'Poppins', + fontSize: 14*ffem, + fontWeight: FontWeight.w700, + height: 1.5*ffem/fem, + color: Color(0xff000000), + ), + ), + ), + Container( + // vector7fi (I12:52;1:10) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 9.04*fem, 1.48*fem), + width: 12.96*fem, + height: 11.52*fem, + child: Image.asset( + 'assets/page-1/images/vector-AHS.png', + width: 12.96*fem, + height: 11.52*fem, + ), + ), + Container( + // vectoro2k (I12:52;1:6) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 9*fem, 0.4*fem), + width: 18*fem, + height: 12.6*fem, + child: Image.asset( + 'assets/page-1/images/vector-8vg.png', + width: 18*fem, + height: 12.6*fem, + ), + ), + Container( + // vectorVgG (I12:52;1:8) + width: 18*fem, + height: 9*fem, + child: Image.asset( + 'assets/page-1/images/vector-ax4.png', + width: 18*fem, + height: 9*fem, + ), + ), + ], + ), + ), + ), + Positioned( + // scansvgrepocomE84 (12:54) + left: 168*fem, + top: 711*fem, + child: Align( + child: SizedBox( + width: 40*fem, + height: 40*fem, + child: Image.asset( + 'assets/page-1/images/scansvgrepocom.png', + width: 40*fem, + height: 40*fem, + ), + ), + ), + ), + Positioned( + // autogroupqeegHs2 (23pzynm8Ewa3Ug27APqeeG) + left: 21.0000991821*fem, + top: 65*fem, + child: Container( + width: 295*fem, + height: 56*fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // peperomiaobtusfoliaZJk (12:80) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 227.23*fem, 0*fem), + width: 43.77*fem, + height: 56*fem, + child: Image.asset( + 'assets/page-1/images/peperomia-obtusfolia.png', + fit: BoxFit.cover, + ), + ), + Container( + // stylelineareqz (12:86) + margin: EdgeInsets.fromLTRB(0*fem, 14*fem, 0*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/page-1/images/stylelinear.png', + width: 24*fem, + height: 24*fem, + ), + ), + ], + ), + ), + ), + Positioned( + // welcometoteahub924 (12:81) + left: 20*fem, + top: 173*fem, + child: Align( + child: SizedBox( + width: 180*fem, + height: 23*fem, + child: Text( + 'Welcome to TeaHub', + textAlign: TextAlign.center, + style: SafeGoogleFont ( + 'Lexend', + fontSize: 18*ffem, + fontWeight: FontWeight.w600, + height: 1.25*ffem/fem, + color: Color(0xff394929), + ), + ), + ), + ), + ), + Positioned( + // settingzoN (12:82) + left: 343*fem, + top: 88*fem, + child: Align( + child: SizedBox( + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/page-1/images/setting.png', + width: 24*fem, + height: 24*fem, + ), + ), + ), + ), + Positioned( + // hivihangaH1n (12:85) + left: 22*fem, + top: 136*fem, + child: Align( + child: SizedBox( + width: 107*fem, + height: 23*fem, + child: Text( + 'Hi Vihanga,', + textAlign: TextAlign.center, + style: SafeGoogleFont ( + 'Lexend', + fontSize: 18*ffem, + fontWeight: FontWeight.w600, + height: 1.25*ffem/fem, + color: Color(0xff000000), + ), + ), + ), + ), + ), + // Navigation Buttons Section + Positioned( + // autogrouphs1eKjA (23q1HN6B7mP5fnUSxChs1E) + left: 25*fem, + top: 248*fem, + child: Container( + width: 327*fem, + height: 94*fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + //Scan page button + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ScanPage()), + ); + }, + child: Text('Scan'), + ), + SizedBox(width: 20 * fem), + Container( + // autogrouprgjnciG (23q1a2H5sYRcLMXhb2RgjN) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 20*fem, 0*fem), + padding: EdgeInsets.fromLTRB(17*fem, 26*fem, 16*fem, 11*fem), + width: 95*fem, + height: double.infinity, + decoration: BoxDecoration ( + color: Color(0xff4ecb81), + borderRadius: BorderRadius.circular(4*fem), + boxShadow: [ + BoxShadow( + color: Color(0x3f4ecb81), + offset: Offset(4*fem, 4*fem), + blurRadius: 2*fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // autogroupucn8Q8L (23q1h6uczYidmSsw4GucN8) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 1.5*fem, 10.89*fem), + width: 30.5*fem, + height: 27.11*fem, + child: Image.asset( + 'assets/page-1/images/auto-group-ucn8.png', + width: 30.5*fem, + height: 27.11*fem, + ), + ), + Text( + // identifyKec (12:95) + 'Identify', + textAlign: TextAlign.center, + style: SafeGoogleFont ( + 'Lexend', + fontSize: 15*ffem, + fontWeight: FontWeight.w600, + height: 1.25*ffem/fem, + color: Color(0xffffffff), + ), + ), + ], + ), + ), + //Chatbot Button + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ChatbotPage()), + ); + }, + child: Text('Chatbot'), + ), + SizedBox(width: 20 * fem), // Adjust spacing as needed + Container( + // autogroupd8bnegt (23q1pWrwFPUPaC1UDhd8bN) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 22*fem, 0*fem), + padding: EdgeInsets.fromLTRB(25.5*fem, 20*fem, 26.5*fem, 12*fem), + width: 95*fem, + height: double.infinity, + decoration: BoxDecoration ( + color: Color(0xffffffff), + boxShadow: [ + BoxShadow( + color: Color(0x3f000000), + offset: Offset(4*fem, 4*fem), + blurRadius: 2*fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // assistanthv4 (12:98) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 0*fem, 9*fem), + width: 34*fem, + height: 34*fem, + child: Image.asset( + 'assets/page-1/images/assistant.png', + width: 34*fem, + height: 34*fem, + ), + ), + Text( + // assistQJg (12:96) + 'Assist', + textAlign: TextAlign.center, + style: SafeGoogleFont ( + 'Lexend', + fontSize: 15*ffem, + fontWeight: FontWeight.w600, + height: 1.25*ffem/fem, + color: Color(0xff4ecb81), + ), + ), + ], + ), + ), + //Educate button + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => EducatePage()), + ); + }, + child: Text('Educate'), + ), + Container( + // autogroupk4v28Va (23q1wBLVx6h13Dda5EK4V2) + padding: EdgeInsets.fromLTRB(20*fem, 23*fem, 13*fem, 13*fem), + width: 95*fem, + height: double.infinity, + decoration: BoxDecoration ( + color: Color(0xffffffff), + boxShadow: [ + BoxShadow( + color: Color(0x3f000000), + offset: Offset(4*fem, 4*fem), + blurRadius: 2*fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // bookalbumsvgrepocomBik (12:140) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 2*fem, 5*fem), + width: 34*fem, + height: 34*fem, + child: Image.asset( + 'assets/page-1/images/book-albumsvgrepocom.png', + width: 34*fem, + height: 34*fem, + ), + ), + Text( + // educatesba (12:97) + 'Educate', + textAlign: TextAlign.center, + style: SafeGoogleFont ( + 'Lexend', + fontSize: 15*ffem, + fontWeight: FontWeight.w600, + height: 1.25*ffem/fem, + color: Color(0xff4ecb81), + ), + ), + ], + ), + ), + ], + ), + ), + ), + Positioned( + // autogroupqssuzw6 (23q2F5zKxkxmbysDZDQsSU) + left: 43*fem, + top: 385*fem, + child: Container( + width: 150.33*fem, + height: 30*fem, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // teaHvC (12:108) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 96.17*fem, 0*fem), + child: Text( + 'Tea', + textAlign: TextAlign.center, + style: SafeGoogleFont ( + 'Lexend', + fontSize: 24*ffem, + fontWeight: FontWeight.w700, + height: 1.25*ffem/fem, + color: Color(0xffffffff), + ), + ), + ), + Container( + // vectoraPW (12:144) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 0*fem, 7.5*fem), + width: 10.17*fem, + height: 10.17*fem, + child: Image.asset( + 'assets/page-1/images/vector.png', + width: 10.17*fem, + height: 10.17*fem, + ), + ), + ], + ), + ), + ), + Positioned( + // SRi (12:117) + left: 218*fem, + top: 609*fem, + child: Align( + child: SizedBox( + width: 62*fem, + height: 44*fem, + child: Text( + '22°', + style: SafeGoogleFont ( + 'Inter', + fontSize: 36*ffem, + fontWeight: FontWeight.w700, + height: 1.2125*ffem/fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + Positioned( + // f6mA (12:118) + left: 218*fem, + top: 657*fem, + child: Align( + child: SizedBox( + width: 45*fem, + height: 20*fem, + child: Text( + '71.6 F', + style: SafeGoogleFont ( + 'Inter', + fontSize: 16*ffem, + fontWeight: FontWeight.w700, + height: 1.2125*ffem/fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + Positioned( + // colomboslbC8 (12:119) + left: 218*fem, + top: 560*fem, + child: Align( + child: SizedBox( + width: 99*fem, + height: 20*fem, + child: Text( + 'Colombo, SL', + style: SafeGoogleFont ( + 'Inter', + fontSize: 16*ffem, + fontWeight: FontWeight.w700, + height: 1.2125*ffem/fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + Positioned( + // mondayfBz (12:120) + left: 218*fem, + top: 583*fem, + child: Align( + child: SizedBox( + width: 54*fem, + height: 17*fem, + child: Text( + 'Monday', + style: SafeGoogleFont ( + 'Inter', + fontSize: 14*ffem, + fontWeight: FontWeight.w500, + height: 1.2125*ffem/fem, + color: Color(0xffffffff), + ), + ), + ), + ), + ), + ], + ), + ), + ) + ); + } +} \ No newline at end of file diff --git a/lib/home_page/navigation.dart b/lib/home_page/navigation.dart new file mode 100644 index 0000000..efac2ce --- /dev/null +++ b/lib/home_page/navigation.dart @@ -0,0 +1,106 @@ +import 'package:animated_bottom_navigation_bar/animated_bottom_navigation_bar.dart'; +import 'package:chatbotui/home_page/constants.dart'; +import 'package:chatbotui/home_page/scanPage.dart'; +import 'package:flutter/material.dart'; + import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:page_transition/page_transition.dart'; + + + + + +class TeaProfilePage extends StatefulWidget { + const TeaProfilePage({Key? key}) : super(key: key); + + @override + State createState() => _TeaProfilePageState(); +} + +class _TeaProfilePageState extends State { + + int _bottomNavIndex = 0; + + + + //List of the pages + List pages= const [ + HomePage(), + const ChatScreen(), + TeaProfileUI(), + const UserProfile(), + ]; + + +List iconList = [ + FontAwesomeIcons.home, // Font Awesome home icon + FontAwesomeIcons.comment, // Chatbot icon + FontAwesomeIcons.seedling, // Plant icon + FontAwesomeIcons.user, // Font Awesome user icon +]; + + //List of the pages titles + List titleList = [ + 'Home', + 'Chatbot', + 'Tea profile', + 'Profile', + ]; + + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text(titleList[_bottomNavIndex], style: TextStyle( + color: Constants.blackColor, + fontWeight: FontWeight.w500, + fontSize: 24, + ),), + FaIcon( + FontAwesomeIcons.bell, + color: Constants.blackColor, + size: 30.0, +) + ], + ), + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + elevation: 0.0, + ), + body: IndexedStack( + index: _bottomNavIndex, + children: pages, + ), + + + floatingActionButton: FloatingActionButton( + onPressed: (){ + Navigator.push(context, PageTransition(child: const ScanPage(), type: PageTransitionType.bottomToTop)); + }, + backgroundColor: Constants.primaryColor, + child: Image.asset('assets/images/qr-code-scan.png',height: 30.0, +), + ), + + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + bottomNavigationBar: AnimatedBottomNavigationBar( + splashColor: Constants.primaryColor, + activeColor: Constants.primaryColor, + inactiveColor: Colors.black.withOpacity(.5), + icons: iconList, + activeIndex: _bottomNavIndex, + gapLocation: GapLocation.center, + notchSmoothness: NotchSmoothness.softEdge, + onTap: (index){ + setState(() { + _bottomNavIndex = index; + + }); + } + ), + ); + } +} diff --git a/lib/home_page/scanPage.dart b/lib/home_page/scanPage.dart new file mode 100644 index 0000000..26ed793 --- /dev/null +++ b/lib/home_page/scanPage.dart @@ -0,0 +1,305 @@ +import 'dart:io'; +import 'dart:convert'; +import 'package:TeaHub/disease_description_treatment/product_screen.dart'; +import 'package:http/http.dart' as http; + +import 'package:TeaHub/disease_description_treatment/home_screen.dart'; +import 'package:TeaHub/disease_description_treatment/welcome_screen.dart'; +import 'package:animated_bottom_navigation_bar/animated_bottom_navigation_bar.dart'; +import 'package:TeaHub/home_page/constants.dart'; +import 'package:TeaHub/snap_tips/SnapTips.dart'; +import 'package:flutter/material.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; + +class ScanPage extends StatefulWidget { + const ScanPage({Key? key}) : super(key: key); + + @override + State createState() => _ScanPageState(); +} + +class _ScanPageState extends State { + int _bottomNavIndex = 0; + File? imageFile; + + get disease => null; + + @override + Widget build(BuildContext context) { + Size size = MediaQuery.of(context).size; + + return Scaffold( + body: Stack( + children: [ + Positioned( + top: 50, + left: 20, + right: 20, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () { + Navigator.pop(context); + }, + child: SizedBox( + height: 40, + width: 40, + child: FaIcon( + FontAwesomeIcons.times, + color: Constants.primaryColor, + ), + ), + ), + GestureDetector( + onTap: () { + debugPrint('favorite'); + }, + child: SizedBox( + height: 40, + width: 40, + child: IconButton( + onPressed: () {}, + icon: FaIcon( + FontAwesomeIcons.syncAlt, + color: Constants.primaryColor, + ), + ), + ), + ), + ], + ), + ), + Positioned( + top: 100, + right: 20, + left: 20, + child: Container( + width: size.width * .8, + height: size.height * .8, + padding: const EdgeInsets.all(20), + child: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + imageFile == null + ? Image.asset( + 'assets/images/qr-code-scan.png', + height: 500.0, + ) + : ClipRRect( + borderRadius: BorderRadius.circular(8.0), + child: Image.file( + imageFile!, + height: 500.0, + fit: BoxFit.fill, + ), + ), + const SizedBox( + height: 20, + ), + Text( + '', + style: TextStyle( + color: Constants.primaryColor.withOpacity(.80), + fontWeight: FontWeight.w500, + fontSize: 20, + ), + ), + ], + ), + ), + ), + ), + ], + ), + //----- Code - 1 ------// + + // floatingActionButton: FloatingActionButton( + // onPressed: () { + // _showImagePicker(context); + // }, + // backgroundColor: Constants.primaryColor, + // child: const FaIcon( + // FontAwesomeIcons.camera, + // color: Colors.white, + // ), + // ), + floatingActionButton: ClipRRect( + borderRadius: + BorderRadius.circular(30.0), // Adjust the value to your preference + child: FloatingActionButton( + onPressed: () { + _showImagePicker(context); + }, + backgroundColor: Constants.primaryColor, + child: const FaIcon( + FontAwesomeIcons.camera, + color: Colors.white, + ), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, + bottomNavigationBar: AnimatedBottomNavigationBar( + backgroundColor: Colors.black, + splashColor: Constants.primaryColor, + activeColor: Constants.primaryColor, + inactiveColor: Colors.white, + icons: const [ + FontAwesomeIcons.image, + FontAwesomeIcons.question, + ], + activeIndex: _bottomNavIndex, + gapLocation: GapLocation.center, + notchSmoothness: NotchSmoothness.softEdge, + onTap: (index) { + setState(() { + _bottomNavIndex = index; + if (index == 1) { + // Navigate to the page you want + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => SnapTips(), + )); + } + }); + // { + // _bottomNavIndex = index; + // }); + }, + ), + ); + } + + void _showImagePicker(BuildContext context) { + showModalBottomSheet( + context: context, + builder: (builder) { + return Card( + child: Container( + color: Theme.of(context).colorScheme.tertiary, + width: MediaQuery.of(context).size.width, + height: MediaQuery.of(context).size.height / 5.2, + margin: const EdgeInsets.only(top: 8.0), + padding: const EdgeInsets.all(12), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: InkWell( + child: Column( + children: [ + FaIcon( + FontAwesomeIcons.images, + size: 60.0, + ), + SizedBox(height: 12.0), + Text( + "Gallery", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ) + ], + ), + onTap: () { + _imgFromGallery(); + Navigator.pop(context); + }, + ), + ), + Expanded( + child: InkWell( + child: SizedBox( + child: Column( + children: [ + FaIcon(FontAwesomeIcons.camera, size: 60.0), + SizedBox(height: 12.0), + Text( + "Camera", + textAlign: TextAlign.center, + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.primary, + ), + ) + ], + ), + ), + onTap: () { + _imgFromCamera(); + Navigator.pop(context); + }, + ), + ) + ], + ), + ), + ); + }, + ); + } + + final picker = ImagePicker(); + + _imgFromGallery() async { + final pickedFile = + await picker.pickImage(source: ImageSource.gallery, imageQuality: 50); + if (pickedFile != null) { + _cropImage(File(pickedFile.path)); + } + } + + _imgFromCamera() async { + await picker + .pickImage(source: ImageSource.camera, imageQuality: 50) + .then((value) { + if (value != null) { + _cropImage(File(value.path)); + } + }); + } + + _cropImage(File imgFile) async { + List imageBytes = await imgFile.readAsBytes(); + String base64Image = base64Encode(imageBytes); + var url = 'https://teahub-model-deploy-b3efb87f9078.herokuapp.com/predict'; + + var requestBody = jsonEncode({ + "image": base64Image, + }); + var response = await http.post( + Uri.parse(url), + headers: { + 'Content-Type': 'application/json', + }, + body: requestBody, + // Use the JSON-encoded data here + ); + + print(response.body); + print(response.statusCode); + print("###############--------------------------------------------"); + if (response.statusCode == 200) { + var result = jsonDecode(response.body); + if (result.containsKey('predicted_class')) { + String predictedDisease = result['predicted_class']; + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => WelcomeScreen(disease: predictedDisease)), + ); + } else {} + } else { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ProductScreen(selectedDisease: disease)), + ); + } + } +} diff --git a/lib/home_page/utils.dart b/lib/home_page/utils.dart new file mode 100644 index 0000000..3fd58fc --- /dev/null +++ b/lib/home_page/utils.dart @@ -0,0 +1,82 @@ +import 'package:flutter/material.dart'; +import 'dart:ui'; +import 'package:google_fonts/google_fonts.dart'; + +class MyCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} + +TextStyle SafeGoogleFont( + String fontFamily, { + TextStyle? textStyle, + Color? color, + Color? backgroundColor, + double? fontSize, + FontWeight? fontWeight, + FontStyle? fontStyle, + double? letterSpacing, + double? wordSpacing, + TextBaseline? textBaseline, + double? height, + Locale? locale, + Paint? foreground, + Paint? background, + List? shadows, + List? fontFeatures, + TextDecoration? decoration, + Color? decorationColor, + TextDecorationStyle? decorationStyle, + double? decorationThickness, +}) { + try { + return GoogleFonts.getFont( + fontFamily, + textStyle: textStyle, + color: color, + backgroundColor: backgroundColor, + fontSize: fontSize, + fontWeight: fontWeight, + fontStyle: fontStyle, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + textBaseline: textBaseline, + height: height, + locale: locale, + foreground: foreground, + background: background, + shadows: shadows, + fontFeatures: fontFeatures, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + ); + } catch (ex) { + return GoogleFonts.getFont( + "Source Sans Pro", + textStyle: textStyle, + color: color, + backgroundColor: backgroundColor, + fontSize: fontSize, + fontWeight: fontWeight, + fontStyle: fontStyle, + letterSpacing: letterSpacing, + wordSpacing: wordSpacing, + textBaseline: textBaseline, + height: height, + locale: locale, + foreground: foreground, + background: background, + shadows: shadows, + fontFeatures: fontFeatures, + decoration: decoration, + decorationColor: decorationColor, + decorationStyle: decorationStyle, + decorationThickness: decorationThickness, + ); + } +} diff --git a/lib/images/TeaHub_Logo.png b/lib/images/TeaHub_Logo.png new file mode 100644 index 0000000..e50939a Binary files /dev/null and b/lib/images/TeaHub_Logo.png differ diff --git a/lib/images/disease_description_and_treatment_imgs/plant.jpg b/lib/images/disease_description_and_treatment_imgs/plant.jpg new file mode 100644 index 0000000..fe440a9 Binary files /dev/null and b/lib/images/disease_description_and_treatment_imgs/plant.jpg differ diff --git a/lib/images/disease_description_and_treatment_imgs/plant1.png b/lib/images/disease_description_and_treatment_imgs/plant1.png new file mode 100644 index 0000000..be71782 Binary files /dev/null and b/lib/images/disease_description_and_treatment_imgs/plant1.png differ diff --git a/lib/images/disease_description_and_treatment_imgs/plant2.png b/lib/images/disease_description_and_treatment_imgs/plant2.png new file mode 100644 index 0000000..e2eb8ab Binary files /dev/null and b/lib/images/disease_description_and_treatment_imgs/plant2.png differ diff --git a/lib/images/disease_description_and_treatment_imgs/welcome.jpg b/lib/images/disease_description_and_treatment_imgs/welcome.jpg new file mode 100644 index 0000000..cc3cb1c Binary files /dev/null and b/lib/images/disease_description_and_treatment_imgs/welcome.jpg differ diff --git a/lib/images/screen_1.png b/lib/images/screen_1.png new file mode 100644 index 0000000..3d51ca4 Binary files /dev/null and b/lib/images/screen_1.png differ diff --git a/lib/images/screen_2.png b/lib/images/screen_2.png new file mode 100644 index 0000000..d4a6798 Binary files /dev/null and b/lib/images/screen_2.png differ diff --git a/lib/images/screen_3.png b/lib/images/screen_3.png new file mode 100644 index 0000000..a26ab6d Binary files /dev/null and b/lib/images/screen_3.png differ diff --git a/lib/images/screen_4.png b/lib/images/screen_4.png new file mode 100644 index 0000000..738b917 Binary files /dev/null and b/lib/images/screen_4.png differ diff --git a/lib/images/snap_tips imgs/image 1.jpg b/lib/images/snap_tips imgs/image 1.jpg new file mode 100644 index 0000000..6a46ca4 Binary files /dev/null and b/lib/images/snap_tips imgs/image 1.jpg differ diff --git a/lib/images/snap_tips imgs/image 2.jpg b/lib/images/snap_tips imgs/image 2.jpg new file mode 100644 index 0000000..de7f4d0 Binary files /dev/null and b/lib/images/snap_tips imgs/image 2.jpg differ diff --git a/lib/images/snap_tips imgs/image 3.jpg b/lib/images/snap_tips imgs/image 3.jpg new file mode 100644 index 0000000..2133f18 Binary files /dev/null and b/lib/images/snap_tips imgs/image 3.jpg differ diff --git a/lib/images/snap_tips imgs/image 4.jpg b/lib/images/snap_tips imgs/image 4.jpg new file mode 100644 index 0000000..848b70d Binary files /dev/null and b/lib/images/snap_tips imgs/image 4.jpg differ diff --git a/lib/images/treatment_imgs/med 1.png b/lib/images/treatment_imgs/med 1.png new file mode 100644 index 0000000..8028818 Binary files /dev/null and b/lib/images/treatment_imgs/med 1.png differ diff --git a/lib/images/treatment_imgs/your_image.jpg b/lib/images/treatment_imgs/your_image.jpg new file mode 100644 index 0000000..c3897a7 Binary files /dev/null and b/lib/images/treatment_imgs/your_image.jpg differ diff --git a/lib/introduction_page/chatbotui_splash.dart b/lib/introduction_page/chatbotui_splash.dart new file mode 100644 index 0000000..2feb031 --- /dev/null +++ b/lib/introduction_page/chatbotui_splash.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: ChatbotUI(), + ); + } +} + +class ChatbotUI extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Padding( + padding: EdgeInsets.only(top: 20.0), // Top padding for 'Join The Community' + child: Column( + children: [ + // 'Join The Community' text with proper alignment and padding + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'TeaHub', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + Text( + 'Application', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 16.0), // Shift the image up + child: Image.asset( + 'assets/introsplash/chatbot.png', + width: 200, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + 'TeaBot\nCultivation Success Easily', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + // Container for bottom text and button with even padding + Container( + padding: EdgeInsets.fromLTRB(30.0, 8.0, 30.0, 100.0), // Even horizontal padding and spacing at the bottom + child: IntrinsicHeight( + child: Row( + children: [ + Expanded( + + child: Text( + "Discover the secrets of tea growing with our Chatbot - your personal guide to a perfect harvest.", + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[500], + + ), + ), + ), + Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + // Handle the start button press + }, + child: Container( + width: 80, + height: 80, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.1), + offset: Offset(0, 18), + blurRadius: 23, + ), + ], + color: Color.fromRGBO(181, 234, 125, 1), + ), + child: Text( + 'Chat', + style: TextStyle( + fontSize: 20.0, + color: Colors.white, // Set the text color to white to ensure visibility + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ) + + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/introduction_page/scanui_splash.dart b/lib/introduction_page/scanui_splash.dart new file mode 100644 index 0000000..ba08498 --- /dev/null +++ b/lib/introduction_page/scanui_splash.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: ScanUI(), + ); + } +} + +class ScanUI extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Padding( + padding: EdgeInsets.only(top: 20.0), // Top padding for 'Join The Community' + child: Column( + children: [ + // 'Join The Community' text with proper alignment and padding + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'TeaHub', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + Text( + 'Application', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 16.0), // Shift the image up + child: Image.asset( + 'assets/introsplash/tree.png', + width: 200, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + 'Try the TeaHub\nMagic now!', + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + // Container for bottom text and button with even padding + Container( + padding: EdgeInsets.fromLTRB(30.0, 8.0, 30.0, 100.0), // Even horizontal padding and spacing at the bottom + child: IntrinsicHeight( + child: Row( + children: [ + Expanded( + + child: Text( + 'Turn your Android phone into\n a mobile crop doctor for tea plants.\n Chlorotic diagnosis at your fingertip.', + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[500], + + ), + ), + ), + Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + // Handle the start button press + }, + child: Container( + width: 80, + height: 80, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.1), + offset: Offset(0, 18), + blurRadius: 23, + ), + ], + color: Color.fromRGBO(181, 234, 125, 1), + ), + child: Text( + 'Start', + style: TextStyle( + fontSize: 20.0, + color: Colors.white, // Set the text color to white to ensure visibility + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ) + + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/introduction_page/teaprofile_splash.dart b/lib/introduction_page/teaprofile_splash.dart new file mode 100644 index 0000000..b9907e0 --- /dev/null +++ b/lib/introduction_page/teaprofile_splash.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: TeaProfileUI(), + ); + } +} + +class TeaProfileUI extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: SafeArea( + child: Padding( + padding: EdgeInsets.only(top: 20.0), // Top padding for 'Join The Community' + child: Column( + children: [ + // 'Join The Community' text with proper alignment and padding + Padding( + padding: EdgeInsets.symmetric(horizontal: 10.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + 'TeaHub', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + Text( + 'Application', + style: TextStyle( + fontSize: 24.0, + fontWeight: FontWeight.bold, + color: Colors.grey[600], + ), + ), + ], + ), + ), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(bottom: 16.0), // Shift the image up + child: Image.asset( + 'assets/introsplash/teaprofile.png', + width: 300, + ), + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: 20.0), + child: Text( + "Tea Odyssey:\n A Flavor Journey", + style: TextStyle( + fontSize: 40.0, + fontWeight: FontWeight.bold, + color: Colors.black, + ), + textAlign: TextAlign.center, + ), + ), + ], + ), + ), + // Container for bottom text and button with even padding + Container( + padding: EdgeInsets.fromLTRB(30.0, 8.0, 30.0, 100.0), // Even horizontal padding and spacing at the bottom + child: IntrinsicHeight( + child: Row( + children: [ + Expanded( + + child: Text( + "Discover teas from classic to exotic in our collection. Each blend offers a unique journey of flavor and heritage.", + style: TextStyle( + fontSize: 14.0, + color: Colors.grey[500], + + ), + ), + ), + Material( + color: Colors.transparent, + child: InkWell( + onTap: () { + Navigator.push(context, MaterialPageRoute(builder: (context) => TeaProfile())); + }, + child: Container( + width: 80, + height: 80, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(17), + boxShadow: [ + BoxShadow( + color: Color.fromRGBO(0, 0, 0, 0.1), + offset: Offset(0, 18), + blurRadius: 23, + ), + ], + color: Color.fromRGBO(181, 234, 125, 1), + ), + child: Text( + 'Explore', + style: TextStyle( + fontSize: 18.0, + color: Colors.white, // Set the text color to white to ensure visibility + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ) + + ], + ), + ), + ), + ], + ), + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index fe557bf..db41c52 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,25 +1,224 @@ -import 'package:flutter/material.dart'; -import 'package:teahub/pages/authentication_page.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'firebase_options.dart'; - -void main() async { - WidgetsFlutterBinding.ensureInitialized(); - await Firebase.initializeApp( - options: DefaultFirebaseOptions.currentPlatform, - ); - runApp(const MyApp()); -} - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - // This widget is the root of your application. - @override - Widget build(BuildContext context) { - return const MaterialApp( - debugShowCheckedModeBanner: false, - home: AuthPage(), - ); - } -} +import 'package:bubble/bubble.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + brightness: Brightness.dark, + primarySwatch: Colors.blue, + // This makes the visual density adapt to the platform that you run + // the app on. For desktop platforms, the controls will be smaller and + // closer together (more dense) than on mobile platforms. + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + debugShowCheckedModeBanner: false, + home: MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { +const MyHomePage({Key? key, required this.title}) : super(key: key); + +// This class is the configuration for the state. It holds the values (in this +// case the title) provided by the parent (in this case the App widget) and +// used by the build method of the State. Fields in a Widget subclass are +// always marked "final". + +final String title; + +@override +_MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + // dialog flow code was here. + + + @override + Widget build(BuildContext context) { + var messages; + return Scaffold( + appBar: AppBar( + title: const Text( + "Chat bot", + ), + ), + body: Container( + child: Column( + children: [ + Container( + padding: const EdgeInsets.only(top: 15, bottom: 10), + child: Text("Today, ${DateFormat("Hm").format(DateTime.now())}", style: const TextStyle( + fontSize: 20 + ),), + ), + Flexible( + child: ListView.builder( + reverse: true, + itemCount: messages.length, + itemBuilder: (context, index) => chat( + messages[index]["message"].toString(), + messages[index]["data"]))), + const SizedBox( + height: 20, + ), + + const Divider( + height: 5.0, + color: Colors.greenAccent, + ), + Container( + + + child: ListTile( + + leading: IconButton( + icon: const Icon(Icons.camera_alt, color: Colors.greenAccent, size: 35,), onPressed: () { }, + ), + + title: Container( + height: 35, + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular( + 15)), + color: Color.fromRGBO(220, 220, 220, 1), + ), + padding: const EdgeInsets.only(left: 15), + child: TextFormField( + controller: messageInsert, + decoration: const InputDecoration( + hintText: "Enter a Message...", + hintStyle: TextStyle( + color: Colors.black26 + ), + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + ), + + style: const TextStyle( + fontSize: 16, + color: Colors.black + ), + onChanged: (value) { + + }, + ), + ), + + trailing: IconButton( + + icon: const Icon( + + Icons.send, + size: 30.0, + color: Colors.greenAccent, + ), + onPressed: () { + + if (messageInsert.text.isEmpty) { + print("empty message"); + } else { + setState(() { + messsages!.insert(0, + {"data": 1, "message": messageInsert.text}); + }); + response(messageInsert.text); + messageInsert.clear(); + } + FocusScopeNode currentFocus = FocusScope.of(context); + if (!currentFocus.hasPrimaryFocus) { + currentFocus.unfocus(); + } + }), + + ), + + ), + + const SizedBox( + height: 15.0, + ) + ], + ), + ), + ); + } + + //for better one i have use the bubble package check out the pubspec.yaml + + Widget chat(String message, int data) { + return Container( + padding: const EdgeInsets.only(left: 20, right: 20), + + child: Row( + mainAxisAlignment: data == 1 ? MainAxisAlignment.end : MainAxisAlignment.start, + children: [ + + data == 0 ? Container( + height: 60, + width: 60, + child: const CircleAvatar( + backgroundImage: AssetImage("assets/robot.jpg"), + ), + ) : Container(), + + Padding( + padding: const EdgeInsets.all(10.0), + child: Bubble( + radius: const Radius.circular(15.0), + color: data == 0 ? const Color.fromRGBO(23, 157, 139, 1) : Colors.orangeAccent, + elevation: 0.0, + + child: Padding( + padding: const EdgeInsets.all(2.0), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + + const SizedBox( + width: 10.0, + ), + Flexible( + child: Container( + constraints: const BoxConstraints( maxWidth: 200), + child: Text( + message, + style: const TextStyle( + color: Colors.white, fontWeight: FontWeight.bold), + ), + )) + ], + ), + )), + ), + + + data == 1? Container( + height: 60, + width: 60, + child: const CircleAvatar( + backgroundImage: AssetImage("assets/default.jpg"), + ), + ) : Container(), + + ], + ), + ); + } +} diff --git a/lib/openingsplashscreen/main.dart b/lib/openingsplashscreen/main.dart new file mode 100644 index 0000000..3052e94 --- /dev/null +++ b/lib/openingsplashscreen/main.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; +import 'package:untitled/splashscreen.dart'; + + +void main(){ + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp ({super.key}); + + @override + Widget build(BuildContext context) { + return const MaterialApp( + debugShowCheckedModeBanner: false, + home:SplashScreen(), + ); + } +} \ No newline at end of file diff --git a/lib/openingsplashscreen/splashscreen.dart b/lib/openingsplashscreen/splashscreen.dart new file mode 100644 index 0000000..a53cccd --- /dev/null +++ b/lib/openingsplashscreen/splashscreen.dart @@ -0,0 +1,102 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:lottie/lottie.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({super.key}); + + @override + State createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + @override + void initState() { + super.initState(); + Timer(const Duration(seconds: 5), () { + Navigator.of(context).pushReplacement(MaterialPageRoute(builder: (context) => const MyHomePage())); + }); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.only(top: 100), // Increased top margin + child: Lottie.asset("assets/Animation.json"), + ), + const SizedBox(height: 20), // Adjust the space as needed + ShaderMask( + shaderCallback: (Rect bounds) { + return LinearGradient( + colors: [Colors.black, Color(0xFF4ecb81)], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ).createShader(bounds); + }, + child: RichText( + textAlign: TextAlign.center, + text: TextSpan( + children: [ + for (var letter in "TeaHub".split('')) + WidgetSpan( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 4.0), // Increase spacing between letters + child: Text( + letter, + style: TextStyle( + fontSize: 60, // Increased font size + fontWeight: FontWeight.bold, + color: Colors.white, + shadows: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + offset: Offset(4, 4), + blurRadius: 5, + ), + ], + ), + ), + ), + ), + ], + ), + ), + ), + const SizedBox(height: 20), // Add some space before the loader + SizedBox( + // Specify the size for the loader animation + width: 200, // Adjust the width as needed + height: 200, // Adjust the height as needed + child: Lottie.asset("assets/loader.json"), + ), + ], + ), + ); + } +} + +class MyHomePage extends StatelessWidget { + const MyHomePage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + backgroundColor: Colors.blue, + title: const Text("Home Page"), + ), + body: const Center( + child: Text( + "Welcome", + style: TextStyle(fontSize: 40, fontWeight: FontWeight.bold), + ), + ), + ); + } +} diff --git a/lib/pages/authentication_page.dart b/lib/pages/authentication_page.dart index afa17ad..c91c6ff 100644 --- a/lib/pages/authentication_page.dart +++ b/lib/pages/authentication_page.dart @@ -1,28 +1,40 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/material.dart'; -import 'package:teahub/pages/home_page.dart'; -import 'package:teahub/pages/login_page.dart'; -//import 'package:teahub/pages/signin_page.dart'; - -class AuthPage extends StatelessWidget { - const AuthPage({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - body: StreamBuilder( - stream: FirebaseAuth.instance.authStateChanges(), - builder: (context, snapshot) { - if (snapshot.hasData) { - //Navigator.of(context) - //.push(MaterialPageRoute(builder: (context) => HomePage())); - return HomePage(); - } else { - //return SigninPage(); - return const LoginPage(); - } - }, - ), - ); - } -} +import 'package:chatbotui/pages/home_page.dart'; +import 'package:chatbotui/pages/splash_screens.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +//import 'package:teahub/pages/home_page.dart'; +//import 'package:teahub/pages/signin_page.dart'; +//import 'package:teahub/pages/login_page.dart'; +//import 'package:teahub/pages/splash_screens.dart'; + +class AuthPage extends StatelessWidget { + const AuthPage({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: StreamBuilder( + stream: FirebaseAuth.instance.authStateChanges(), + builder: (context, snapshot) { + if (snapshot.hasData) { + // if (Navigator.of(context).canPop()) { + // Navigator.pop(context); + // } + if (Navigator.of(context).canPop()) { + // Use function to close the signin page after a short delay + Future.delayed(Duration.zero, () { + Navigator.pop(context); + }); + } + + // Return to the home page + return HomePage(); + } else { + // Display splash screens + return const splashScreens(); + } + }, + ), + ); + } +} diff --git a/lib/pages/home_page.dart b/lib/pages/home_page.dart index 7dcb1d9..e968fb9 100644 --- a/lib/pages/home_page.dart +++ b/lib/pages/home_page.dart @@ -1,79 +1,540 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/material.dart'; -import 'package:google_sign_in/google_sign_in.dart'; -import 'package:flutter/cupertino.dart'; - -class HomePage extends StatelessWidget { - HomePage({super.key}); - - final user = FirebaseAuth.instance.currentUser!; - - //sign user out method - void signUserOut() { - FirebaseAuth.instance.signOut(); - GoogleSignIn().signOut(); - // Navigator.pop(context); // Close the dialog - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - actions: [ - GestureDetector( - onTap: signUserOut, - child: Row( - children: [ - const Text( - 'Sign Out', - style: TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(width: 5), - IconButton( - onPressed: signUserOut, - icon: const Icon( - Icons.logout, - size: 35, - color: Colors.black, - ), - ), - ], - ), - ), - ], - backgroundColor: const Color.fromARGB(255, 78, 203, 128), - ), - body: SafeArea( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'Logged In ', - style: TextStyle( - fontSize: 45, - color: Color.fromARGB(255, 78, 203, 128), - //color: Color.fromARGB(255, 0, 204, 51), - fontWeight: FontWeight.bold, - ), - ), - Text( - 'Email : ${user.email!}', - style: const TextStyle( - fontSize: 20, - color: Colors.black, - fontWeight: FontWeight.bold, - ), - ), - const SizedBox(height: 50), - ], - ), - ), - ), - ); - } -} +import 'package:TeaHub/chatbot_ui_updated/ChatScreen.dart'; +import 'package:TeaHub/theme/theme_button.dart'; +import 'package:TeaHub/weather_widget/weather_page.dart'; +import 'package:cloud_firestore/cloud_firestore.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart'; + +class HomePage extends StatelessWidget { + HomePage({super.key}); + + final user = FirebaseAuth.instance.currentUser!; + + //sign user out method + void signUserOut() { + FirebaseAuth.instance.signOut(); + GoogleSignIn().signOut(); + } + + + @override + Widget build(BuildContext context) { + return Scaffold( + //------------------------ Drawer UI ------------------------// + drawerEnableOpenDragGesture: false, // Prevent user sliding open + + appBar: AppBar( + backgroundColor: Theme.of(context).colorScheme.background, + automaticallyImplyLeading: false, + title: Row( + children: [ + Expanded( + child: Text( + 'Home', + textAlign: TextAlign.left, + style: TextStyle( + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + fontSize: 30, + ), + ), + ), + ], + ), + actions: [ + Builder( + builder: (context) => // Ensure Scaffold is in context + IconButton( + icon: Icon( + Icons.settings, + color: Theme.of(context).colorScheme.primary, + size: 30, + ), + onPressed: () => Scaffold.of(context).openDrawer(), + ), + ), + Builder( + builder: (context) => // Ensure Scaffold is in context + IconButton( + icon: Icon( + Icons.notifications, + color: Theme.of(context).colorScheme.primary, + size: 30, + ), + onPressed: () => Scaffold.of(context).openDrawer(), + ), + ), + ], + ), + + drawer: Drawer( + backgroundColor: Theme.of(context).colorScheme.background, + child: ListView( + padding: EdgeInsets.zero, + children: [ + DrawerHeader( + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment + .start, // Align children to the start (left) + children: [ + SizedBox(width: 10), // Left margin + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Vertical spacing between text and icon + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Container( + decoration: BoxDecoration( + shape: BoxShape.circle, + border: Border.all( + color: Colors.black, + width: 1.5, + ), + ), + child: SizedBox( + width: 60, + height: 60, + child: Image.asset( + 'assets/images/user_profile/rectangle-6.png', + fit: BoxFit.cover, + ), + ), + ), + SizedBox(width: 158), + GestureDetector( + onTap: () { + // Close the drawer + Navigator.pop(context); + }, + child: Container( + margin: + EdgeInsets.all(0), // Set all margins to 0 + padding: EdgeInsets.only( + top: 0), // Set top padding to 0 + child: Icon( + Icons.arrow_left, + color: Colors.black, + size: 50, + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only( + top: 5), // Add bottom padding of 20 pixels + child: Text( + 'User Name', + style: TextStyle( + color: Colors.black, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + ), + + Padding( + padding: const EdgeInsets.only( + top: 5), // Add bottom padding of 20 pixels + child: Text( + '${user.email!}', + style: TextStyle( + fontSize: 16, + //color: Colors.black, + color: Colors.black, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + Container( + margin: EdgeInsets.all(10.0), + padding: EdgeInsets.all(8.0), // Add padding here + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + border: Border.all( + color: + Theme.of(context).colorScheme.primary, // Set border color + width: 0.5, // Set border width + ), + color: Theme.of(context).colorScheme.tertiary, + ), + child: Row( + children: [ + SizedBox(width: 20), + Icon( + Icons.color_lens_rounded, + color: Theme.of(context).colorScheme.primary, + ), + Padding( + padding: EdgeInsets.only(left: 15.0), + child: Text( + "Theme", + style: TextStyle( + color: Theme.of(context) + .colorScheme + .primary, // Set text color + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox(width: 15), + const Padding( + padding: EdgeInsets.only(left: 10.0), + child: ThemeSelector(), + ), + ], + ), + ), + GestureDetector( + onTap: () { + signUserOut(); + }, + child: Container( + margin: EdgeInsets.all(10.0), + padding: EdgeInsets.all(8.0), // Add padding here + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + border: Border.all( + color: Theme.of(context) + .colorScheme + .primary, // Set border color + width: 0.5, // Set border width + ), + color: Theme.of(context).colorScheme.tertiary, + ), + child: SizedBox( + width: 120, + height: 36, + child: Padding( + padding: EdgeInsets.only(left: 20.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, // Align items to the left + children: [ + Icon( + Icons.logout, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox(width: 15), + Text( + 'Sign Out', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ), + ), + GestureDetector( + onTap: () { + // Close the app + SystemNavigator.pop(); + }, + child: Container( + margin: EdgeInsets.all(10.0), + padding: EdgeInsets.all(8.0), // Add padding here + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10.0), + border: Border.all( + color: Theme.of(context) + .colorScheme + .primary, // Set border color + width: 0.5, // Set border width + ), + color: Theme.of(context).colorScheme.tertiary, + ), + child: SizedBox( + width: 120, + height: 36, + child: Padding( + padding: EdgeInsets.only(left: 20.0), + child: Row( + mainAxisAlignment: + MainAxisAlignment.start, // Align items to the left + children: [ + Icon( + Icons.exit_to_app, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox(width: 15), + Text( + 'Exit', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 18, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ), + ) + ], + ), + ), + + //------------------------ Main page UI ------------------------// + + backgroundColor: Theme.of(context).colorScheme.background, + body: SafeArea( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, // Align text to the left + children: [ + const SizedBox(height: 15), + Padding( + padding: + EdgeInsets.only(left: 15), // Add bottom padding of 5 pixels + child: Text( + 'Hi User,', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + Padding( + padding: + EdgeInsets.only(left: 15), // Add bottom padding of 5 pixels + child: Text( + 'Welcome to Teahub', + style: TextStyle( + fontSize: 20, + fontWeight: FontWeight.bold, + //color: Color(0xFF737373), + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + // StreamBuilder( + // stream: + // FirebaseFirestore.instance.collection('Users').snapshots(), + // builder: (context, snapshot) { + // List usersWidgets = []; + // if (snapshot.hasData) { + // final users = snapshot.data?.docs.reversed.toList(); + // for (var user in users!) { + // final usersWidget = Row( + // children: [ + // Text(user['user name']), + // ], + // ); + // usersWidgets.add(usersWidget); + // } + // } + // return Expanded( + // child: ListView( + // children: usersWidgets, + // ), + // ); + // }), + // StreamBuilder( + // stream: + // FirebaseFirestore.instance.collection('Users').snapshots(), + // builder: (context, AsyncSnapshot snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) { + // return Center(child: CircularProgressIndicator()); + // } + // if (snapshot.hasError) { + // return Center(child: Text('Error: ${snapshot.error}')); + // } + // final users = snapshot.data?.docs.reversed.toList(); + // return ListView.builder( + // itemCount: users?.length, + // itemBuilder: (context, index) { + // final userData = users?[index].data() + // as Map; // Explicit cast + // return ListTile( + // title: Text(userData['user name'] ?? ''), + // // You can add more widgets here to display additional user data + // ); + // }, + // ); + // }, + // ), + Padding( + padding: const EdgeInsets.only( + left: 15), // Add bottom padding of 20 pixels + child: Text( + '${user.email!}', + style: TextStyle( + fontSize: 20, + //color: Colors.black, + color: Theme.of(context).colorScheme.primary, + fontWeight: FontWeight.bold, + ), + ), + ), + SizedBox(height: 30), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + foregroundColor: Color.fromARGB(255, 78, 203, 128), + backgroundColor: Color.fromARGB(255, 78, 203, 128), + elevation: 15, + shadowColor: Colors.black, + fixedSize: Size(100, 100), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + side: BorderSide( + color: Theme.of(context).colorScheme.primary, + width: 0.5, + ), + ), + ), + child: const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.camera_alt, // Add your desired icon here + color: Colors.white, + size: 40, + ), + SizedBox( + width: + 8), // Adjust the space between icon and text as needed + Text( + 'Identify', + style: TextStyle( + color: Colors.white, + fontSize: 14, + ), + ), + ], + ), + ), + + SizedBox(width: 10), // 10 px space between buttons + ElevatedButton( + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => ChatScreen()), + ); + }, + style: ElevatedButton.styleFrom( + foregroundColor: Color.fromARGB( + 255, 78, 203, 128), //Colors.tealAccent.shade700, + backgroundColor: Theme.of(context).colorScheme.surfaceTint, + elevation: 15, // Elevation + shadowColor: Colors.black, // Shadow Color + fixedSize: Size(100, 100), // Define height and width here + //backgroundColor: Colors.blue, // Set the desired color here + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 10), // Set border radius to 10 pixels + side: BorderSide( + color: Theme.of(context) + .colorScheme + .primary, // Set border color here + width: 0.5, // Set border width here + ), + ), + ), + child: const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.adb, //reddit, // Add your desired icon here + color: Color.fromARGB(255, 78, 203, 128), + size: 40, + ), + SizedBox( + width: + 8), // Adjust the space between icon and text as needed + Text( + 'Assist', + style: TextStyle( + color: Color.fromARGB(255, 78, 203, 128), + fontSize: 14, + ), + ), + ], + ), + ), + + SizedBox(width: 10), // 10 px space between buttons + ElevatedButton( + onPressed: () {}, + style: ElevatedButton.styleFrom( + foregroundColor: Color.fromARGB( + 255, 78, 203, 128), //Colors.tealAccent.shade700, + backgroundColor: Theme.of(context).colorScheme.surfaceTint, + elevation: 15, // Elevation + shadowColor: Colors.black, // Shadow Color + fixedSize: Size(100, 100), // Define height and width here + //backgroundColor: Colors.blue, // Set the desired color here + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 10), // Set border radius to 10 pixels + side: BorderSide( + color: Theme.of(context) + .colorScheme + .primary, // Set border color here + width: 0.5, // Set border width here + ), + ), + ), + child: const Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + Icons.menu_book, // Add your desired icon here + color: Color.fromARGB(255, 78, 203, 128), + size: 40, + ), + SizedBox( + width: + 8), // Adjust the space between icon and text as needed + Text( + 'Educate', + style: TextStyle( + color: Color.fromARGB(255, 78, 203, 128), + fontSize: 14, + ), + ), + ], + ), + ), + ], + ), + + const SizedBox(height: 240), + WeatherPage(), + ], + ), + ), + //), + ); + } +} diff --git a/lib/pages/login_page.dart b/lib/pages/login_page.dart index c1a64bf..269dcf6 100644 --- a/lib/pages/login_page.dart +++ b/lib/pages/login_page.dart @@ -1,349 +1,376 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/material.dart'; -import 'package:teahub/components/login_button.dart'; -import 'package:teahub/components/my_textfield.dart'; -import 'package:teahub/components/square_tile.dart'; -import 'package:teahub/pages/signin_page.dart'; -import 'package:teahub/services/authentication_service.dart'; -import 'package:flutter/cupertino.dart'; - -class LoginPage extends StatefulWidget { - const LoginPage({super.key}); - - @override - State createState() => _LoginPageState(); -} - -class _LoginPageState extends State { - //text editing controllers - final emailController = TextEditingController(); - final passwordController = TextEditingController(); - - //User login - void UserLogin() async { - //Show loading circle - showDialog( - context: context, - builder: (context) { - return const Center( - child: CircularProgressIndicator(), - ); - }, - ); - - try { - await FirebaseAuth.instance.signInWithEmailAndPassword( - email: emailController.text, - password: passwordController.text, - ); - - //pop the loading circle - Navigator.pop(context); - } on FirebaseAuthException catch (e) { - print("Exception code : ${e.code}"); - //pop the loading circle - Navigator.pop(context); - //invalid user - if (e.code == 'invalid-credential') { - //show error to user - invalidUserMessage(); - } else if (e.code == 'invalid-email') { - //show error to user - invalidEmailMessage(); - } else if (e.code == 'channel-error') { - emptyUserMessage(); - } - } - } - - void emptyUserMessage() { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5), - ), - title: const Text( - 'Invalid credentials', - style: TextStyle( - color: Colors.red, - fontSize: 22, - fontWeight: FontWeight.bold, - ), - ), - content: const Text( - 'Please enter your email and password.', - style: TextStyle( - fontSize: 16, - ), - ), - actions: [ - TextButton( - onPressed: () { - Navigator.pop(context); // Close the dialog - }, - child: const Text( - 'OK', - style: TextStyle( - color: Colors.blue, - fontSize: 18, - ), - ), - ), - ], - ); - }, - ); - } - - void invalidEmailMessage() { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5), - ), - title: const Text( - 'Invalid email', - style: TextStyle( - color: Colors.red, - fontSize: 22, - fontWeight: FontWeight.bold, - ), - ), - content: const Text( - 'The provided email is invalid. Please check your email.', - style: TextStyle( - fontSize: 16, - ), - ), - actions: [ - TextButton( - onPressed: () { - Navigator.pop(context); // Close the dialog - }, - child: const Text( - 'OK', - style: TextStyle( - color: Colors.blue, - fontSize: 18, - ), - ), - ), - ], - ); - }, - ); - } - - void invalidUserMessage() { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(5), - ), - title: const Text( - 'Invalid User', - style: TextStyle( - color: Colors.red, - fontSize: 22, - fontWeight: FontWeight.bold, - ), - ), - content: const Text( - 'The provided credentials are invalid. Please check your email and password.', - style: TextStyle( - fontSize: 16, - ), - ), - actions: [ - TextButton( - onPressed: () { - Navigator.pop(context); // Close the dialog - }, - child: const Text( - 'OK', - style: TextStyle( - color: Colors.blue, - fontSize: 18, - ), - ), - ), - ], - ); - }, - ); - } - - // ------------- Log in page UI -------------- // - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - leading: IconButton( - onPressed: () { - Navigator.of(context) - .push(MaterialPageRoute(builder: (context) => SigninPage())); - }, - icon: const Icon( - Icons.arrow_back, - size: 35, - color: Colors.black, - ), - ), - ), - backgroundColor: Colors.white, - body: SafeArea( - child: Center( - child: SingleChildScrollView( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - //Login text - const Text( - 'Log In', - style: TextStyle( - color: Colors.black, - fontSize: 45, - fontWeight: FontWeight.bold, - ), - ), - - const Text( - 'Enter your Email and Password', - style: TextStyle( - color: Colors.grey, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - const Text( - 'and start creating', - style: TextStyle( - color: Colors.grey, - fontSize: 20, - fontWeight: FontWeight.bold, - ), - ), - - const SizedBox(height: 30), - - MyTextField( - controller: emailController, - hintText: 'Enter your email', - obscureText: false, - ), - - const SizedBox(height: 30), - - MyTextField( - controller: passwordController, - hintText: 'Enter your password', - obscureText: true, - ), - - const Padding( - padding: EdgeInsets.symmetric(horizontal: 25.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Text( - 'Forgot password?', - style: TextStyle( - color: Colors.grey, - ), - ), - ], - ), - ), - - const SizedBox(height: 40), - - LoginButton( - onTap: UserLogin, - ), - - const SizedBox(height: 40), - - const Padding( - padding: EdgeInsets.symmetric(horizontal: 25.0), - child: Row( - children: [ - Expanded( - child: Divider( - thickness: 0.5, - color: Colors.grey, - ), - ), - Text( - ' Or Login with ', - ), - Expanded( - child: Divider( - thickness: 0.5, - color: Colors.grey, - ), - ), - ], - ), - ), - - const SizedBox(height: 40), - - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - SquareTile( - onTap: () => AuthService().signInWithFacebook(context), - imagePath: 'lib/images/Facebook_icon.png', - ), - const SizedBox(width: 15), - SquareTile( - onTap: () => AuthService().signInWithGoogle(), - imagePath: 'lib/images/Google_icon.png', - ), - const SizedBox(width: 15), - SquareTile( - onTap: () => {}, - imagePath: 'lib/images/Apple_icon.png', - ), - ], - ), - - const SizedBox(height: 50), - - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - 'Don\'t have an account?', - ), - TextButton( - onPressed: () { - //Navigator.pop(context); - Navigator.of(context).push(MaterialPageRoute( - builder: (context) => SigninPage())); - }, - child: const Text( - ' Register Now', - style: TextStyle( - color: Colors.blue, - fontWeight: FontWeight.bold, - ), - ), - ), - ], - ), - ], - ), - ), - ), - ), - ); - } -} +import 'package:chatbotui/components/login_button.dart'; +import 'package:chatbotui/components/my_textfield.dart'; +import 'package:chatbotui/components/square_tile.dart'; +import 'package:chatbotui/services/authentication_service.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +// import 'package:teahub/components/login_button.dart'; +// import 'package:teahub/components/my_textfield.dart'; +// import 'package:teahub/components/square_tile.dart'; +// import 'package:teahub/services/authentication_service.dart'; +import 'package:flutter/cupertino.dart'; + +class LoginPage extends StatefulWidget { + const LoginPage({super.key}); + + @override + State createState() => _LoginPageState(); +} + +class _LoginPageState extends State { + //text editing controllers + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + + //User login + void UserLogin() async { + //Show loading circle + showDialog( + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); + }, + ); + + try { + await FirebaseAuth.instance.signInWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + + //pop the loading circle + Navigator.pop(context); + } on FirebaseAuthException catch (e) { + //Display exception in terminal + print("Exception code : ${e.code}"); + //pop the loading circle + Navigator.pop(context); + //invalid user + if (e.code == 'invalid-credential') { + //Display error to user + invalidUserMessage(); + } else if (e.code == 'invalid-email') { + //Display error to user + invalidEmailMessage(); + } else if (e.code == 'channel-error') { + //Display error to user + emptyUserMessage(); + } + } + } + + // Error message - Display an error message if the user input is empty + void emptyUserMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid credentials', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'Please enter your email and password.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Email error message - Display error message if the user's email is invalid + void invalidEmailMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'The provided email is invalid. Please check your email.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Invalid user message - Display error message if the user credentials are invalid + void invalidUserMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid User', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'The provided credentials are invalid. Please check your email and password.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // ------------- Log in page UI -------------- // + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon( + Icons.arrow_back, + size: 35, + color: Colors.black, + ), + ), + ), + backgroundColor: Colors.white, + body: SafeArea( + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + //Login text + const Text( + 'Log In', + style: TextStyle( + color: Colors.black, + fontSize: 45, + fontWeight: FontWeight.bold, + ), + ), + + const Text( + 'Enter your Email and Password', + style: TextStyle( + color: Colors.grey, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const Text( + 'and start creating', + style: TextStyle( + color: Colors.grey, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + + const SizedBox(height: 30), + + // Email textfield + MyTextField( + controller: emailController, + hintText: 'Enter your email', + obscureText: false, + ), + + const SizedBox(height: 30), + + // Password textfield + MyTextField( + controller: passwordController, + hintText: 'Enter your password', + obscureText: true, + ), + + Padding( + padding: EdgeInsets.symmetric(horizontal: 25.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + GestureDetector( + onTap: () { + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: (context) => ForgotPassword()), + // ); + Navigator.push( + context, + MaterialPageRoute( + builder: (context) { + return ForgotPassword(); + }, + ), + ); + }, + child: Text( + 'Forgot password?', + style: TextStyle( + color: Theme.of(context).colorScheme.primary, + fontSize: 15, + ), + ), + ), + ], + ), +               ), + + const SizedBox(height: 40), + + //Login button + LoginButton( + onTap: UserLogin, + ), + + const SizedBox(height: 40), + + const Padding( + padding: EdgeInsets.symmetric(horizontal: 25.0), + child: Row( + children: [ + Expanded( + child: Divider( + thickness: 0.5, + color: Colors.grey, + ), + ), + Text( + ' Or Login with ', + ), + Expanded( + child: Divider( + thickness: 0.5, + color: Colors.grey, + ), + ), + ], + ), + ), + + const SizedBox(height: 40), + + //Facebook, Google and Apple icons + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SquareTile( + onTap: () => AuthService().signInWithFacebook(context), + imagePath: 'lib/images/Facebook_icon.png', + ), + const SizedBox(width: 15), + SquareTile( + onTap: () => AuthService().signInWithGoogle(), + imagePath: 'lib/images/Google_icon.png', + ), + const SizedBox(width: 15), + SquareTile( + onTap: () => {}, + imagePath: 'lib/images/Apple_icon.png', + ), + ], + ), + + const SizedBox(height: 50), + + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Don\'t have an account?', + ), + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: const Text( + ' Register Now', + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/signin_page.dart b/lib/pages/signin_page.dart index ad96f9a..c06d7f8 100644 --- a/lib/pages/signin_page.dart +++ b/lib/pages/signin_page.dart @@ -1,43 +1,432 @@ -import 'package:flutter/material.dart'; - -class SigninPage extends StatelessWidget { - SigninPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - leading: IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: const Icon( - Icons.arrow_back, - size: 35, - color: Colors.black, - ), - ), - backgroundColor: const Color.fromARGB(255, 78, 203, 128), - ), - body: const SafeArea( - child: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - 'Sign In Page', - style: TextStyle( - fontSize: 45, - color: Color.fromARGB(255, 78, 203, 128), - //color: Color.fromARGB(255, 0, 204, 51), - fontWeight: FontWeight.bold, - ), - ), - //SizedBox(height: 50), - ], - ), - ), - ), - ); - } -} +import 'package:chatbotui/components/my_textfield.dart'; +import 'package:chatbotui/components/signin_button.dart'; +import 'package:chatbotui/components/square_tile.dart'; +import 'package:chatbotui/pages/login_page.dart'; +import 'package:chatbotui/services/authentication_service.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +// import 'package:teahub/components/signin_button.dart'; +// import 'package:teahub/components/square_tile.dart'; +import 'package:flutter/material.dart'; +// import 'package:teahub/components/my_textfield.dart'; +// import 'package:teahub/pages/login_page.dart'; +// import 'package:teahub/services/authentication_service.dart'; + +class RegisterPage extends StatefulWidget { + final Function()? onTap; + const RegisterPage({super.key, required this.onTap}); + + @override + State createState() => _RegisterPageState(); +} + +class _RegisterPageState extends State { + //text editing controllers + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + final confirmpasswordController = TextEditingController(); + + //sign user up method + void signUserUp() async { + // show loading circle + showDialog( + context: context, + builder: (context) { + return const Center( + child: CircularProgressIndicator(), + ); // Conter + }, + ); + + //try creating the user + try { + if (passwordController.text == confirmpasswordController.text) { + await FirebaseAuth.instance.createUserWithEmailAndPassword( + email: emailController.text, + password: passwordController.text, + ); + Navigator.pop(context); + } else { + //showErrorMessage("error"); + Navigator.pop(context); + // show error message, passwords dont't match + PasswordErrorMessage(); + } + + //Navigator.pop(context); + } on FirebaseAuthException catch (e) { + print("Exception code : ${e.code}"); + // pop the loading circle + Navigator.pop(context); + // show error message + //showErrorMessage(e.code); + if (e.code == 'invalid-email') { + Navigator.pop(context); + invalidEmail(); + } else if (e.code == 'channel-error') { + channelError(); + } else if (e.code == 'weak-password') { + weakPasswordError(); + } + } + } + + //error message to user + void showErrorMessage(String message) { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + backgroundColor: Colors.deepPurple, + title: Center( + child: Text( + message, + style: const TextStyle(color: Colors.white), + ), + ), + ); + }, + ); + } + + // Password error message - Display when user doesn't input the same password twice + void PasswordErrorMessage() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Passwords', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'Passwords do not match. Please make sure you enter \nthe same password twice \nfor authentication.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Password error message - Display when password is less than 6 digits + void weakPasswordError() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Weak password', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'Weak password. Please ensure your password is longer than 6 digits for better security.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Email error message - Display when input email is invalid + void invalidEmail() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid Email', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'Invalid email address. Please enter a valid email address.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + // Error message - Display an error message if the user input is empty + void channelError() { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(5), + ), + title: const Text( + 'Invalid credentials', + style: TextStyle( + color: Colors.red, + fontSize: 22, + fontWeight: FontWeight.bold, + ), + ), + content: const Text( + 'Please enter both your email address and password to proceed with Signin.', + style: TextStyle( + fontSize: 16, + ), + ), + actions: [ + TextButton( + onPressed: () { + Navigator.pop(context); // Close the dialog + }, + child: const Text( + 'OK', + style: TextStyle( + color: Colors.blue, + fontSize: 18, + ), + ), + ), + ], + ); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + leading: IconButton( + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon( + Icons.arrow_back, + size: 35, + color: Colors.black, + ), + ), + ), + backgroundColor: Colors.white, + body: SafeArea( + child: Center( + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Sign Up', + style: TextStyle( + color: Colors.black, + fontSize: 45, + fontWeight: FontWeight.bold, + ), + ), + + const Text( + 'Enter your Email and Password', + style: TextStyle( + color: Colors.grey, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + const Text( + 'and start creating', + style: TextStyle( + color: Colors.grey, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + + const SizedBox(height: 25), + + // email textfield + MyTextField( + controller: emailController, + hintText: 'Email', + obscureText: false, + ), + + const SizedBox( + height: 10, + ), + + //password textfield + MyTextField( + controller: passwordController, + hintText: 'Password', + obscureText: true, + ), + + const SizedBox( + height: 10, + ), + + // confirm password textfield + MyTextField( + controller: confirmpasswordController, + hintText: 'Confirm Password', + obscureText: true, + ), + + const SizedBox( + height: 25, + ), + + // sign in button + MyButton( + text: "Register", + onTap: signUserUp, + ), //MyButton + + const SizedBox(height: 40), + + // or continue with + Padding( + padding: const EdgeInsets.symmetric(horizontal: 25.0), + child: Row( + children: [ + Expanded( + child: Divider( + thickness: 0.5, + color: Colors.grey[400], + ), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 10.0), + child: Text( + 'Or Register with', + style: TextStyle(color: Colors.grey[700]), + ), + ), + Expanded( + child: Divider( + thickness: 0.5, + color: Colors.grey[400], + ), + ), + ], + ), + ), + + const SizedBox(height: 40), + + // google and facebook button + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SquareTile( + onTap: () => AuthService().signInWithFacebook(context), + imagePath: 'lib/images/Facebook_icon.png', + ), + const SizedBox(width: 15), + SquareTile( + onTap: () => AuthService().signInWithGoogle(), + imagePath: 'lib/images/Google_icon.png', + ), + const SizedBox(width: 15), + SquareTile( + onTap: () => {}, + imagePath: 'lib/images/Apple_icon.png', + ), + ], + ), + + const SizedBox(height: 40), + + // not a member? register now + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Already have an account?', + ), + const SizedBox(width: 4), + TextButton( + onPressed: () { + Navigator.of(context).push( + MaterialPageRoute(builder: (context) => LoginPage())); + }, + child: const Text( + ' Login now', + style: TextStyle( + color: Colors.blue, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ) + ], + ), + ), + )), + ); + } +} diff --git a/lib/pages/splash_screens.dart b/lib/pages/splash_screens.dart new file mode 100644 index 0000000..bd5674d --- /dev/null +++ b/lib/pages/splash_screens.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:smooth_page_indicator/smooth_page_indicator.dart'; +import 'splash_screens/screen_1.dart'; +import 'splash_screens/screen_2.dart'; +import 'splash_screens/screen_3.dart'; +import 'splash_screens/screen_4.dart'; + +class splashScreens extends StatefulWidget { + const splashScreens({Key? key}) : super(key: key); + + @override + _splashScreensState createState() => _splashScreensState(); +} + +class _splashScreensState extends State { + final _controller = PageController(); + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Stack( + children: [ + Container( + child: SizedBox( + child: PageView( + controller: _controller, + children: [ + screen_1(), + screen_2(), + screen_3(), + //screen_4(), + ], + ), + ), + ), + Positioned( + bottom: 150, + right: MediaQuery.of(context).size.width / 3, + child: Container( + child: SmoothPageIndicator( + controller: _controller, + count: 3, + effect: const ExpandingDotsEffect( + activeDotColor: Color.fromARGB(255, 78, 203, 128), + dotColor: Colors.grey, + ), + ), + ), + ), + + //Next button + Positioned( + bottom: 50, + left: 33, + child: TextButton( + onPressed: () { + int pageIndex = _controller.page?.round() ?? + 0; // Round the double to get the nearest integer + + if (pageIndex == 2) { + // Assuming screen_3() is at index 2 (0-based index) + //_controller.jumpToPage(3); // Go back to the first page + + Navigator.push( + context, + MaterialPageRoute(builder: (context) => screen_4()), + ); + } else { + _controller.nextPage( + duration: Duration(milliseconds: 500), + curve: Curves.ease, + ); + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + Color.fromARGB(255, 78, 203, 128), + ), + shape: MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: + BorderRadius.circular(5.0), // Set the radius to 5 + ), + ), + ), + child: Container( + padding: + const EdgeInsets.symmetric(horizontal: 120, vertical: 15), + child: const Text( + 'Next', + style: TextStyle( + color: Colors.white, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/splash_screens/screen_1.dart b/lib/pages/splash_screens/screen_1.dart new file mode 100644 index 0000000..e8d1cf3 --- /dev/null +++ b/lib/pages/splash_screens/screen_1.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class screen_1 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_1.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Colors.white, + height: 410, + width: MediaQuery.of(context).size.width, + child: const Column( + children: [ + SizedBox(height: 30), + Text( + 'Predict Diseases Instantly\nwith a Snap!', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 20), + Text( + '"Snap a pic, diagnose quick! Our app predicts\nplant diseases with Al precision, empowering\ngrowers for healthier yields!"', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/splash_screens/screen_2.dart b/lib/pages/splash_screens/screen_2.dart new file mode 100644 index 0000000..7cc482e --- /dev/null +++ b/lib/pages/splash_screens/screen_2.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class screen_2 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_2.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Colors.white, + height: 410, + width: MediaQuery.of(context).size.width, + child: const Column( + children: [ + SizedBox(height: 30), + Text( + 'Chatbot Guidance for\nThriving Greens!', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 20), + Text( + '"Snap your plant woe, chat for a pro! Our app\'s\nyour green guru, diagnosing diseases and bulding growth, leaf by leaf!"', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/splash_screens/screen_3.dart b/lib/pages/splash_screens/screen_3.dart new file mode 100644 index 0000000..5e2b079 --- /dev/null +++ b/lib/pages/splash_screens/screen_3.dart @@ -0,0 +1,62 @@ +import 'package:flutter/material.dart'; + +class screen_3 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_3.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Colors.white, + height: 410, + width: MediaQuery.of(context).size.width, + child: const Column( + children: [ + SizedBox(height: 30), + Text( + 'Your Green Guru for Growing Success!', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + SizedBox(height: 20), + Text( + '"Unlock the Green World: Your Ultimate Plant\nEncyclopedia! Delve into climate needs, water\nsecrets, and harvest timing for lush, thriving plants."', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/splash_screens/screen_4.dart b/lib/pages/splash_screens/screen_4.dart new file mode 100644 index 0000000..f70d36f --- /dev/null +++ b/lib/pages/splash_screens/screen_4.dart @@ -0,0 +1,146 @@ +import 'package:chatbotui/pages/login_page.dart'; +import 'package:chatbotui/pages/signin_page.dart'; +import 'package:flutter/material.dart'; +//import 'package:teahub/pages/signin_page.dart'; +//import 'package:teahub/pages/login_page.dart'; + +class screen_4 extends StatelessWidget { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Stack( + children: [ + Container( + alignment: Alignment.topCenter, + color: Colors.grey, + child: Positioned( + child: Image.asset( + 'lib/images/screen_4.png', // path to image + ), + ), + ), + Positioned( + bottom: 0, + child: ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: + Radius.circular(25.0), // Set the desired top-left radius + topRight: + Radius.circular(25.0), // Set the desired top-right radius + ), + child: Container( + color: Colors.white, + height: 410, + width: MediaQuery.of(context).size.width, + child: Column( + children: [ + const SizedBox(height: 20), + const Text( + 'Let\'s Create', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.black, + fontSize: 42, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 25), + const Text( + 'Welcome to TeaHub', + textAlign: TextAlign.center, + style: TextStyle( + color: Colors.grey, + fontSize: 26, + fontWeight: FontWeight.bold, + ), + ), + const SizedBox(height: 40), + + //button + Positioned( + child: TextButton( + onPressed: () { + //pop the splash screen_4 + Navigator.pop(context); + // Move to the register page + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => RegisterPage( + onTap: () { + Navigator.pop(context); + }, + )), + // MaterialPageRoute(builder: (context) => AuthPage()), + ); + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + const Color.fromARGB(255, 78, 203, 128), + ), + shape: + MaterialStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + 5.0), // Set the radius to 5 + ), + ), + ), + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 80, vertical: 16), + child: const Text( + 'I\'m New Here', + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + + // + const SizedBox(height: 60), + + //sign in + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'Already Have An Account? ', + style: TextStyle( + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + TextButton( + onPressed: () { + //pop the splash screen_4 + Navigator.pop(context); + //send to log in page + Navigator.of(context).push(MaterialPageRoute( + builder: (context) => const LoginPage())); + }, + child: const Text( + 'Sign In', + style: TextStyle( + color: Colors.blue, + fontSize: 16, + fontWeight: FontWeight.bold, + ), + ), + ), + ], + ), + ], + ), + ), + ), + ) + ], + ), + ); + } +} diff --git a/lib/pages/two_step_verification/verification_page.dart b/lib/pages/two_step_verification/verification_page.dart new file mode 100644 index 0000000..3f34b4d --- /dev/null +++ b/lib/pages/two_step_verification/verification_page.dart @@ -0,0 +1,180 @@ +import 'dart:async'; + +import 'package:chatbotui/pages/home_page.dart'; +import 'package:flutter/material.dart'; +import 'package:firebase_auth/firebase_auth.dart'; +//import 'package:teahub/pages/home_page.dart'; + +class VerificationPage extends StatefulWidget { + const VerificationPage({Key? key}) : super(key: key); + + @override + State createState() => _VerificationPageState(); +} + +class _VerificationPageState extends State { + bool isEmailVerified = false; + bool canResendEmail = false; + Timer? timer; + + @override + void initState() { + super.initState(); + + isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified; + + if (!isEmailVerified) { + sendVerificationEmail(); + + timer = Timer.periodic( + Duration(seconds: 3), + (_) => checkEmailVerified(), + ); + } + } + + @override + void dispose() { + timer?.cancel(); + + super.dispose(); + } + + Future checkEmailVerified() async { + await FirebaseAuth.instance.currentUser!.reload(); + + setState(() { + isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified; + }); + + if (isEmailVerified) timer?.cancel(); + } + + Future sendVerificationEmail() async { + try { + final user = FirebaseAuth.instance.currentUser!; + await user.sendEmailVerification(); + print('email ${user.email}'); + + setState(() => canResendEmail = false); + await Future.delayed(Duration(seconds: 60)); + setState(() => canResendEmail = true); + } catch (e) { + print('Send verification email error : $e'); + } + } + + Future cancelEmail() async { + try { + final user = FirebaseAuth.instance.currentUser; + user?.delete(); + } catch (e) { + print('Send verification email error : $e'); + } + } + + @override + Widget build(BuildContext context) => isEmailVerified + ? HomePage() + : Scaffold( + body: Padding( + padding: EdgeInsets.all(20), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Image.asset( + 'lib/images/email_icon.png', + width: 180, + height: 180, + ), + SizedBox(height: 30), + const Text( + 'Please Verify your Email', + textAlign: TextAlign.center, + style: TextStyle(fontSize: 26, fontWeight: FontWeight.bold), + ), + const SizedBox( + height: 50, + ), + const Text( + 'Verification email has been sent to', + style: TextStyle( + fontSize: 18, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 5), + Text( + '${FirebaseAuth.instance.currentUser!.email}', // Displaying user's email + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 30), + const Text( + 'Click on the link to complete the verification process', + style: TextStyle( + fontSize: 18, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 30), + const Text( + 'Wait 60 seconds to get new verification email', + style: TextStyle( + fontSize: 15, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 5), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + backgroundColor: Color.fromARGB(255, 78, 203, 128), + ), + icon: const Icon( + Icons.email, + size: 32, + color: Colors.black, + ), + label: const Text( + 'Resend Email', + style: TextStyle( + fontSize: 22, + color: Colors.black, + ), + ), + onPressed: canResendEmail ? sendVerificationEmail : null, + ), + const SizedBox( + height: 20, + ), + ElevatedButton.icon( + style: ElevatedButton.styleFrom( + minimumSize: const Size.fromHeight(50), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(10), + ), + backgroundColor: Color.fromARGB(255, 78, 203, 128), + ), + icon: const Icon( + Icons.email, + size: 32, + color: Colors.black, + ), + label: const Text( + 'Cancel', + style: TextStyle(fontSize: 22, color: Colors.black), + ), + onPressed: cancelEmail, + ), + ], + ), + ), + ); +} diff --git a/lib/services/authentication_service.dart b/lib/services/authentication_service.dart index a569aff..ca23d56 100644 --- a/lib/services/authentication_service.dart +++ b/lib/services/authentication_service.dart @@ -1,48 +1,67 @@ -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:flutter/material.dart'; -import 'package:google_sign_in/google_sign_in.dart'; -import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; - -class AuthService { - //Google Sign in - signInWithGoogle() async { - //begin interactive sign in precess - final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); - - //obtain auth details from request - final GoogleSignInAuthentication googleAuth = - await googleUser!.authentication; - - //create a new credentials for user - final credential = GoogleAuthProvider.credential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - - //finally,lets sign in - return await FirebaseAuth.instance.signInWithCredential(credential); - } - - Future signInWithFacebook(BuildContext context) async { - try { - final LoginResult loginResult = await FacebookAuth.instance.login(); - - final OAuthCredential facebookAuthCridential = - FacebookAuthProvider.credential(loginResult.accessToken!.token); - - //await .signInWithCredential(facebookAuthCridential); - await FirebaseAuth.instance.signInWithCredential(facebookAuthCridential); - } on FirebaseAuthException catch (e) { - //print("Error during Facebook login: $e"); - showSnackBar(context, e.message!); - } - } - - void showSnackBar(BuildContext context, String text) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(text), - ), - ); - } -} +import 'dart:async'; + +import 'package:firebase_auth/firebase_auth.dart'; +import 'package:flutter/material.dart'; +import 'package:google_sign_in/google_sign_in.dart'; +import 'package:flutter_facebook_auth/flutter_facebook_auth.dart'; + +class AuthService { + //Google Sign in + signInWithGoogle() async { + //begin interactive sign in precess + final GoogleSignInAccount? googleUser = await GoogleSignIn().signIn(); + + //obtain auth details from request + final GoogleSignInAuthentication googleAuth = + await googleUser!.authentication; + + //create a new credentials for user + final credential = GoogleAuthProvider.credential( + accessToken: googleAuth.accessToken, + idToken: googleAuth.idToken, + ); + + //finally,lets sign in + return await FirebaseAuth.instance.signInWithCredential(credential); + } + + Future signInWithFacebook(BuildContext context) async { + // Create a Completer to capture the current context + final Completer completer = Completer(); + + // Execute code synchronously to capture the context + // This will be executed before entering the async block + final currentContext = context; + + try { + final LoginResult loginResult = await FacebookAuth.instance.login(); + + final OAuthCredential facebookAuthCredential = + FacebookAuthProvider.credential(loginResult.accessToken!.token); + + // Use the captured context inside the async block + await FirebaseAuth.instance.signInWithCredential(facebookAuthCredential); + + // Complete the Completer to signal that the operation is complete + completer.complete(); + } on FirebaseAuthException catch (e) { + // Use the captured context to show the snackbar + // ignore: use_build_context_synchronously + showSnackBar(currentContext, e.message!); + + // Complete the Completer with an error to propagate the error + completer.completeError(e); + } + + // Return the Future associated with the Completer + return completer.future; + } + + void showSnackBar(BuildContext context, String text) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(text), + ), + ); + } +} diff --git a/lib/snap_tips/snapTip.dart b/lib/snap_tips/snapTip.dart new file mode 100644 index 0000000..d28917b --- /dev/null +++ b/lib/snap_tips/snapTip.dart @@ -0,0 +1,18 @@ +import 'package:chatbotui/snap_tips/welcome_screen.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + @override + Widget build(BuildContext context) { + return MaterialApp( + debugShowCheckedModeBanner: false, + home: WelcomeScreen(), + ); + } +} diff --git a/lib/snap_tips/welcome_screen.dart b/lib/snap_tips/welcome_screen.dart new file mode 100644 index 0000000..5497a39 --- /dev/null +++ b/lib/snap_tips/welcome_screen.dart @@ -0,0 +1,171 @@ +import 'package:flutter/material.dart'; + +class WelcomeScreen extends StatelessWidget { + const WelcomeScreen({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Material( + child: Container( + alignment: + Alignment.bottomCenter, // Align the column to the bottom center + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + // Title "Snap Tips" + Text( + "Snap Tips", + style: TextStyle( + fontSize: 24, // Adjust the font size as needed + fontWeight: FontWeight.bold, + color: Colors.black, // Font color black + ), + ), + SizedBox(height: 20), // Spacer between title and first larger image + // First larger image in the center + Stack( + children: [ + Container( + width: 200, // Adjust the width as needed + height: 200, // Adjust the height as needed + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(100), + border: Border.all( + color: Colors.green, // Green border + width: 4, + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(100), + child: Image.asset( + "images/snap_tips imgs/image 1.jpg", + fit: BoxFit.cover, + ), + ), + ), + Positioned( + top: 8, // Adjust the top padding as needed + right: 8, // Adjust the right padding as needed + child: Container( + padding: EdgeInsets.all(8), + decoration: BoxDecoration( + color: Colors.green, + shape: BoxShape.circle, + ), + child: Icon( + Icons.check, + color: Colors.white, + size: 30, // Adjust the icon size as needed + ), + ), + ), + ], + ), + SizedBox(height: 20), // Spacer between the first and second row + + // Second row with three smaller images + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildImageWithBorderAndIcon( + "images/snap_tips imgs/image 2.jpg", + Colors.red, + "Too close"), + SizedBox(width: 30), // Increase the spacer between images + _buildImageWithBorderAndIcon( + "images/snap_tips imgs/image 3.jpg", Colors.red, "Too far"), + SizedBox(width: 30), // Increase the spacer between images + _buildImageWithBorderAndIcon( + "images/snap_tips imgs/image 4.jpg", + Colors.red, + "Multiple species"), + ], + ), + SizedBox(height: 40), // Spacer between images and button + Container( + width: double.infinity, // Make the button full width + margin: EdgeInsets.symmetric( + horizontal: 20, + vertical: 20), // Add margin horizontally and vertically + child: Material( + elevation: 5, // Add elevation for shadow effect + borderRadius: + BorderRadius.circular(30), // Make the button circular + color: Colors.green, // Set button background color + child: TextButton( + onPressed: () { + // Handle button press + }, + child: Text( + 'Continue', + style: TextStyle( + color: Colors.white, // Set button text color + fontSize: 16, // Adjust the font size as needed + ), + ), + ), + ), + ), + ], + ), + ), + ); + } + + Widget _buildImageWithBorderAndIcon( + String imagePath, Color borderColor, String text) { + return Column( + children: [ + Stack( + children: [ + Container( + width: 100, // Adjust the width as needed + height: 100, // Adjust the height as needed + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(50), + border: Border.all( + color: borderColor, // Red border + width: 4, + ), + ), + child: ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Image.asset( + imagePath, + fit: BoxFit.cover, + ), + ), + ), + Positioned( + top: -4, // Adjust the top padding as needed + right: -4, // Adjust the right padding as needed + child: Container( + padding: EdgeInsets.all(8), + margin: EdgeInsets.all( + 4), // Add margin to avoid cutting off the circle + decoration: BoxDecoration( + color: borderColor, + shape: BoxShape.circle, + ), + child: Icon( + Icons.close, + color: Colors.white, + size: 20, // Adjust the icon size as needed + ), + ), + ), + ], + ), + SizedBox(height: 5), // Spacer between image and text + Text( + text, + style: TextStyle( + fontSize: 12, // Adjust the font size as needed + fontWeight: FontWeight.bold, // Make the text bold + color: Colors.black, // Font color black + ), + ), + ], + ); + } +} diff --git a/lib/splash_screen.dart b/lib/splash_screen.dart new file mode 100644 index 0000000..b9f78bb --- /dev/null +++ b/lib/splash_screen.dart @@ -0,0 +1 @@ +// TODO Implement this library. \ No newline at end of file diff --git a/lib/theme/theme.dart b/lib/theme/theme.dart new file mode 100644 index 0000000..84336c6 --- /dev/null +++ b/lib/theme/theme.dart @@ -0,0 +1,19 @@ +import 'package:flutter/material.dart'; + +ThemeData lightMode = ThemeData( + brightness: Brightness.light, + colorScheme: ColorScheme.light( + background: Colors.white, + primary: Colors.black, + secondary: Colors.grey, + tertiary: Colors.grey.shade300, + )); + +ThemeData darkMode = ThemeData( + brightness: Brightness.dark, + colorScheme: ColorScheme.dark( + background: Colors.grey.shade800, + primary: Colors.white, + secondary: Colors.grey.shade400, + tertiary: Colors.grey.shade600, + )); diff --git a/lib/theme/theme_button.dart b/lib/theme/theme_button.dart new file mode 100644 index 0000000..d6e8d50 --- /dev/null +++ b/lib/theme/theme_button.dart @@ -0,0 +1,83 @@ +import 'package:TeaHub/theme/theme_provider.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; + +class ThemeSelector extends StatelessWidget { + const ThemeSelector({super.key}); + + Widget build(BuildContext context) { + return Container( + height: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), // Set border radius + + border: Border.all( + color: Theme.of(context).colorScheme.primary, // Set border color + width: 0.5, // Set border width + ), + + color: Theme.of(context).colorScheme.tertiary, + ), + + //color: Theme.of(context).colorScheme.primary, + // width: 100, // Set the desired width of the dropdown button + // height: 40, + child: Consumer( + builder: (context, provider, child) { + return DropdownButton( + value: provider.currentTheme, + padding: EdgeInsets.only(left: 8), + dropdownColor: Theme.of(context).colorScheme.tertiary, + borderRadius: BorderRadius.circular(10), + icon: Icon(Icons.arrow_drop_down, + color: Theme.of(context).colorScheme.primary, + size: 30), // Add dropdown icon + underline: Container( + // Remove underline + height: 0, + ), + + items: [ + DropdownMenuItem( + value: 'light', + child: Text( + 'Light', + style: TextStyle( + color: + Theme.of(context).colorScheme.primary, // Set text color + fontSize: 18, // Set font size + ), + ), + ), + DropdownMenuItem( + value: 'dark', + child: Text( + 'Dark', + style: TextStyle( + color: + Theme.of(context).colorScheme.primary, // Set text color + fontSize: 18, // Set font size + ), + ), + ), + DropdownMenuItem( + value: 'system', + child: Text( + 'System', + style: TextStyle( + color: + Theme.of(context).colorScheme.primary, // Set text color + fontSize: 18, // Set font size + ), + ), + ), + ], + onChanged: (String? value) { + provider.changeTheme(value ?? 'system'); + }, + ); + }, + ), + ); + } +} diff --git a/lib/theme/theme_provider.dart b/lib/theme/theme_provider.dart new file mode 100644 index 0000000..df53c3f --- /dev/null +++ b/lib/theme/theme_provider.dart @@ -0,0 +1,54 @@ +// import 'package:TeaHub/theme/theme.dart'; +// import 'package:flutter/material.dart'; + +// class ThemeProvider with ChangeNotifier { +// ThemeData _themeData = lightMode; + +// ThemeData get themeData => _themeData; + +// set themeData(ThemeData themeData) { +// _themeData = themeData; +// notifyListeners(); +// } + +// void toggleTheme() { +// if (_themeData == lightMode) { +// themeData = darkMode; +// } else { +// themeData = lightMode; +// } +// } +// } + +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ThemeProvider extends ChangeNotifier { + String currentTheme = 'system'; + + ThemeMode get themeMode { + if (currentTheme == 'light') { + return ThemeMode.light; + } else if (currentTheme == 'dark') { + return ThemeMode.dark; + } else { + return ThemeMode.system; + } + } + + changeTheme(String theme) async { + final SharedPreferences _prefs = await SharedPreferences.getInstance(); + + await _prefs.setString('theme', theme); + + currentTheme = theme; + notifyListeners(); + } + + initializer() async { + final SharedPreferences _prefs = await SharedPreferences.getInstance(); + + currentTheme = _prefs.getString('theme') ?? 'system'; + notifyListeners(); + } +} diff --git a/lib/user_profile/main.dart b/lib/user_profile/main.dart new file mode 100644 index 0000000..7ec4ad7 --- /dev/null +++ b/lib/user_profile/main.dart @@ -0,0 +1,26 @@ + + +import 'package:chatbotui/user_profile/user_profile.dart'; +import 'package:flutter/material.dart'; + + + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); // Fixing the key parameter + + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'User Profile', + theme: ThemeData( + primarySwatch: Colors.blue, + visualDensity: VisualDensity.adaptivePlatformDensity, + ), + home: const UserProfile(), // Using the Disease widget as the home screen + ); + } +} diff --git a/lib/user_profile/user_profile.dart b/lib/user_profile/user_profile.dart new file mode 100644 index 0000000..fa09c8a --- /dev/null +++ b/lib/user_profile/user_profile.dart @@ -0,0 +1,483 @@ +import 'dart:ui'; + +import 'package:flutter/material.dart'; +import 'package:google_fonts/google_fonts.dart'; + + +class MyCustomScrollBehavior extends MaterialScrollBehavior { + @override + Set get dragDevices => { + PointerDeviceKind.touch, + PointerDeviceKind.mouse, + }; +} + +class UserProfile extends StatelessWidget { + const UserProfile({Key? key}); + @override + Widget build(BuildContext context) { + double baseWidth = 375; + double fem = MediaQuery.of(context).size.width / baseWidth; + double ffem = fem * 0.97; + return Container( + width: double.infinity, + child: Container( + // userprofilegyM (226:2601) + width: double.infinity, + decoration: const BoxDecoration ( + color: Color(0xffffffff), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + // autogroupqvxhcs1 (9njecn1HncthMNQkxpQVxh) + width: 390*fem, + height: 355*fem, + child: Stack( + children: [ + Positioned( + // rectangle51jgj (226:2630) + left: 0*fem, + top: 0*fem, + child: Align( + child: SizedBox( + width: 390*fem, + height: 263*fem, + child: Image.asset( + 'assets/user_profile/images/rectangle-51.png', + width: 390*fem, + height: 263*fem, + ), + ), + ), + ), + Positioned( + // toprWT (226:2631) + left: 24*fem, + top: 69*fem, + child: Align( + child: SizedBox( + width: 350*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/top.png', + width: 350*fem, + height: 24*fem, + ), + ), + ), + ), + + Positioned( + // group71AJB (226:2650) + left: 84.5*fem, + top: 171*fem, + child: Container( + width: 221*fem, + height: 184*fem, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // avatartEB (226:2651) + margin: EdgeInsets.fromLTRB(47.5*fem, 0*fem, 46.5*fem, 0*fem), + width: double.infinity, + height: 130*fem, + child: Stack( + children: [ + Positioned( + // rectangle6RV1 (I226:2652;218:102701) + left: 0*fem, + top: 0*fem, + child: Align( + child: SizedBox( + width: 120*fem, + height: 120*fem, + child: Image.asset( + 'assets/user_profile/images/rectangle-6.png', + fit: BoxFit.cover, + ), + ), + ), + ), + Positioned( + // group627cj (226:2653) + left: 81*fem, + top: 84*fem, + child: Align( + child: SizedBox( + width: 46*fem, + height: 46*fem, + child: Image.asset( + 'assets/user_profile/images/group-62.png', + width: 46*fem, + height: 46*fem, + ), + ), + ), + ), + ], + ), + ), + Container( + // vihangasupasanzwR (226:2656) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 1*fem, 6*fem), + child: Text( + 'Vihanga Supasan', + textAlign: TextAlign.center, + style: GoogleFonts.poppins( + fontSize: 22*ffem, + fontWeight: FontWeight.w600, + height: 1.2727272727*ffem/fem, + color: const Color(0xff000000), + ), + + ), + ), + Text( + // vs2001gmailcom0772026018JSK (226:2657) + 'vs2001@gmail.com | 0772026018', + textAlign: TextAlign.center, + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ], + ), + ), + ), + ], + ), + ), + Container( + // autogroupa6b7pQf (9njfGg5ouQpJKDWi1Pa6b7) + padding: EdgeInsets.fromLTRB(20*fem, 45*fem, 9*fem, 10*fem), + width: double.infinity, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // group70M9h (226:2753) + margin: EdgeInsets.fromLTRB(4*fem, 0*fem, 0*fem, 45*fem), + padding: EdgeInsets.fromLTRB(16*fem, 14*fem, 24*fem, 11*fem), + width: 342*fem, + decoration: BoxDecoration ( + color: const Color(0xffffffff), + borderRadius: BorderRadius.circular(8*fem), + boxShadow: [ + BoxShadow( + color: const Color(0x3f000000), + offset: Offset(0*fem, 1*fem), + blurRadius: 2*fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // component11zCf (226:2755) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 0*fem, 11*fem), + padding: EdgeInsets.fromLTRB(0*fem, 0*fem, 117*fem, 0*fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linebusinessprofilelinehMy (I226:2755;226:2370) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 13*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/line-business-profile-line.png', + width: 24*fem, + height: 24*fem, + ), + ), + Text( + // editprofileinformationQGP (I226:2755;226:2371) + 'Edit profile information', + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ], + ), + ), + Container( + // component12LA3 (226:2756) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 0*fem, 13*fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linemedianotification3line4Lw (I226:2756;226:2370) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 13*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/line-media-notification-3-line.png', + width: 24*fem, + height: 24*fem, + ), + ), + Container( + // editprofileinformationyTu (I226:2756;226:2371) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 161*fem, 0*fem), + child: Text( + 'Notifications', + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ), + Text( + // englishea3 (I226:2756;226:2372) + 'ON', + textAlign: TextAlign.right, + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff4ecb81), + ), + ), + ], + ), + ), + Container( + // component13P1q (226:2757) + padding: EdgeInsets.fromLTRB(0*fem, 0*fem, 212*fem, 0*fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // autogroupoclv7iX (9njg4V6oyoBkeHR9keocLV) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 13*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/auto-group-oclv.png', + width: 24*fem, + height: 24*fem, + ), + ), + Text( + // editprofileinformation2qV (I226:2757;226:2371) + 'Security', + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ], + ), + ), + ], + ), + ), + Container( + // group69ZaX (226:2730) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 4*fem, 0*fem), + padding: EdgeInsets.fromLTRB(16*fem, 14*fem, 24*fem, 11*fem), + width: 342*fem, + decoration: BoxDecoration ( + color: const Color(0xffffffff), + borderRadius: BorderRadius.circular(8*fem), + boxShadow: [ + BoxShadow( + color: const Color(0x3f000000), + offset: Offset(0*fem, 1*fem), + blurRadius: 2*fem, + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // component113Eo (226:2732) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 0*fem, 11*fem), + padding: EdgeInsets.fromLTRB(0*fem, 0*fem, 167*fem, 0*fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // lineusercontactslineXvf (I226:2732;226:2370) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 13*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/line-user-contacts-line.png', + width: 24*fem, + height: 24*fem, + ), + ), + Text( + // editprofileinformationrT9 (I226:2732;226:2371) + 'Help & Support', + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ], + ), + ), + Container( + // component12PT5 (226:2733) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 0*fem, 13*fem), + padding: EdgeInsets.fromLTRB(0*fem, 0*fem, 195*fem, 0*fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linecommunicationchatquoteline (I226:2733;226:2370) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 13*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/line-communication-chat-quote-line.png', + width: 24*fem, + height: 24*fem, + ), + ), + Text( + // editprofileinformationq4B (I226:2733;226:2371) + 'Contact us', + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ], + ), + ), + Container( + // component13Zks (226:2734) + padding: EdgeInsets.fromLTRB(0*fem, 0*fem, 176*fem, 0*fem), + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + // linesystemlock2lineuZq (I226:2734;226:2370) + margin: EdgeInsets.fromLTRB(0*fem, 0*fem, 13*fem, 0*fem), + width: 24*fem, + height: 24*fem, + child: Image.asset( + 'assets/user_profile/images/line-system-lock-2-line.png', + width: 24*fem, + height: 24*fem, + ), + ), + Text( + // editprofileinformationo9R (I226:2734;226:2371) + 'Privacy policy', + style: GoogleFonts.roboto( + fontSize: 14*ffem, + fontWeight: FontWeight.w400, + height: 1.4285714286*ffem/fem, + letterSpacing: 0.25*fem, + color: const Color(0xff000000), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ), + Container( + // menu1vzj (226:2663) + width: 428*fem, + height: 115*fem, + child: Stack( + children: [ + Positioned( + // floatbtngDD (I226:2663;405:7322) + left: 155*fem, + top: 0*fem, + child: Align( + child: SizedBox( + width: 64*fem, + height: 64*fem, + child: Image.asset( + 'assets/user_profile/images/float-btn-5hq.png', + width: 64*fem, + height: 64*fem, + ), + ), + ), + ), + Positioned( + // bgaJb (I226:2663;405:7324) + left: 0*fem, + top: 40*fem, + child: Align( + child: SizedBox( + width: 375*fem, + height: 75*fem, + child: Image.asset( + 'assets/user_profile/images/bg-ysV.png', + width: 375*fem, + height: 75*fem, + ), + ), + ), + ), + Positioned( + // scansvgrepocomu5y (226:2704) + left: 167*fem, + top: 14*fem, + child: Align( + child: SizedBox( + width: 40*fem, + height: 40*fem, + child: Image.asset( + 'assets/user_profile/images/scansvgrepocom-N6T.png', + width: 40*fem, + height: 40*fem, + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/weather_widget/weather_model.dart b/lib/weather_widget/weather_model.dart new file mode 100644 index 0000000..6ebedc2 --- /dev/null +++ b/lib/weather_widget/weather_model.dart @@ -0,0 +1,22 @@ +class Weather { + final String cityName; + final String country; + final double temperature; + final String mainCondition; + + Weather({ + required this.cityName, + required this.country, + required this.temperature, + required this.mainCondition, + }); + + factory Weather.fromJson(Map json) { + return Weather( + cityName: json['name'], + country: json['sys']['country'], + temperature: json['main']['temp'].toDouble(), + mainCondition: json['weather'][0]['main'], + ); + } +} diff --git a/lib/weather_widget/weather_page.dart b/lib/weather_widget/weather_page.dart new file mode 100644 index 0000000..346129c --- /dev/null +++ b/lib/weather_widget/weather_page.dart @@ -0,0 +1,297 @@ +import 'package:chatbotui/weather_widget/weather_model.dart'; +import 'package:chatbotui/weather_widget/weather_service.dart'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:lottie/lottie.dart'; + +class WeatherDisplay extends StatefulWidget { + final Weather? weather; + + WeatherDisplay({this.weather}); + + @override + State createState() => _WeatherDisplayState(); +} + +class _WeatherDisplayState extends State { + // Weather animation + String getWeatherAnimation(String? mainCondition) { + DateTime now = DateTime.now(); + if (mainCondition == null) { + return 'assets/weather_animation/loading.json'; // Default weather condition + } + + switch (mainCondition.toLowerCase()) { + case 'clear': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'clear') { + return 'assets/weather_animation/clear_night.json'; + } else { + return 'assets/weather_animation/clear_day.json'; + } + + case 'clouds': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'clouds') { + return 'assets/weather_animation/cloudy_night.json'; + } else { + return 'assets/weather_animation/cloudy_day.json'; + } + + case 'mist': + case 'smoke': + case 'fog': + case 'haze': + case 'dust': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'mist') { + return 'assets/weather_animation/mist_night.json'; + } else { + return 'assets/weather_animation/mist_day.json'; + } + + case 'rain': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'rain') { + return 'assets/weather_animation/rain_night.json'; + } else { + return 'assets/weather_animation/rain_day.json'; + } + + case 'drizzle': + case 'shower rain': + if (isHourInRange(now) && mainCondition.toLowerCase() == 'drizzle') { + return 'assets/weather_animation/partly_rain_night.json'; + } else { + return 'assets/weather_animation/partly_rain_day.json'; + } + + case 'thunderstorm': + if (isHourInRange(now) && + mainCondition.toLowerCase() == 'thunderstorm') { + return 'assets/weather_animation/thunder_strom_night.json'; + } else { + return 'assets/weather_animation/thunder_strom_day.json'; + } + + default: + if (isHourInRange(now)) { + return 'assets/weather_animation/clear_night.json'; + } else { + return 'assets/weather_animation/clear_day.json'; + } + } + } + + // Get the current day of the week + String getDayOfWeek() { + DateTime now = DateTime.now(); + return DateFormat('EEEE') + .format(now); // 'EEEE' will return the full name of the day + } + + bool isHourInRange(DateTime dateTime) { + int hour = dateTime.hour; + return (hour >= 18 && hour <= 24) || (hour >= 1 && hour <= 4); + } + + @override + Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(15), // Set border radius here + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 4, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + margin: const EdgeInsets.symmetric( + vertical: 0, + horizontal: 20, + ), + height: 150, + width: MediaQuery.of(context).size.width, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB( + 20, 10, 20, 0), // Left, Top, Right, Bottom + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Weather condition + Text( + widget.weather?.mainCondition ?? "Weather...", + style: const TextStyle( + fontSize: 16, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + // Weather animation + Lottie.asset( + getWeatherAnimation(widget.weather?.mainCondition), + height: 110), + ], + ), + ), + ), + Container( + margin: const EdgeInsets.only( + top: 10, bottom: 10), // Adjust margins as needed + child: ClipRRect( + borderRadius: + BorderRadius.circular(20.0), // Adjust border radius as needed + child: const VerticalDivider( + width: 4.0, + thickness: 4.0, // Adjust thickness as needed + color: Colors.white, // Change color as needed + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.fromLTRB( + 20, 10, 20, 0), // Left, Top, Right, Bottom + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // City name, country + Text( + widget.weather != null + ? '${widget.weather!.cityName}, ${widget.weather!.country}' + : " Pleace Turn \n On Location", + style: const TextStyle( + fontSize: 15.5, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + // Day + Text( + widget.weather != null ? '${getDayOfWeek()}' : "", + //'${getDayOfWeek()}', + style: const TextStyle( + fontSize: 15.5, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + // Temperature + Text( + widget.weather != null + ? '${widget.weather?.temperature.round()}°C' + : "", + //'${weather?.temperature.round()}°C', + style: const TextStyle( + fontSize: 30, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + Text( + widget.weather != null + ? '${((widget.weather!.temperature * 9 / 5) + 32).round()}°F' + : "", + style: const TextStyle( + fontSize: 20, // Change the font size + fontWeight: FontWeight.bold, // Make the text bold + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} + +class WeatherButton extends StatelessWidget { + final Weather? weather; + + WeatherButton({this.weather}); + + @override + Widget build(BuildContext context) { + bool locationPermission = + WeatherService("4a994c4e93b8bbb69680bd5467d568c0").locationPermission; + + return Container( + decoration: BoxDecoration( + color: Color.fromARGB(255, 78, 203, 128), + borderRadius: BorderRadius.circular(15), // Set border radius here + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.3), + spreadRadius: 4, + blurRadius: 7, + offset: Offset(0, 3), // changes position of shadow + ), + ], + ), + margin: const EdgeInsets.symmetric( + vertical: 0, + horizontal: 20, + ), + height: 150, + width: MediaQuery.of(context).size.width, + ); + } +} + +class WeatherPage extends StatelessWidget { + final WeatherService _weatherService = + WeatherService("4a994c4e93b8bbb69680bd5467d568c0"); + + bool locationPermission = + WeatherService("4a994c4e93b8bbb69680bd5467d568c0").locationPermission; + + // Fetch weather + Future _fetchWeather() async { + try { + String cityName = await _weatherService.getCurrentCity(); + return await _weatherService.getWeather(cityName); + } catch (e) { + print(e); + return null; + } + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _fetchWeather(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.waiting) { + return Container( + child: Stack( + children: [ + WeatherButton(), + const Positioned.fill( + child: Center( + child: CircularProgressIndicator(), + ), + ), + ], + ), + ); + } else if (locationPermission == true) { + return WeatherDisplay(weather: snapshot.data); + } else if (locationPermission == false) { + return Container( + child: Stack( + children: [ + WeatherButton(), + ], + ), + ); + } else if (snapshot.hasError) { + return Center(child: Text('Error fetching weather 1')); + } else { + return WeatherDisplay(weather: snapshot.data); + } + }, + ); + } +} diff --git a/lib/weather_widget/weather_service.dart b/lib/weather_widget/weather_service.dart new file mode 100644 index 0000000..c789c6b --- /dev/null +++ b/lib/weather_widget/weather_service.dart @@ -0,0 +1,53 @@ +import 'dart:convert'; +import 'package:chatbotui/weather_widget/weather_model.dart'; +import 'package:geocoding/geocoding.dart'; +import 'package:geolocator/geolocator.dart'; + +import 'package:http/http.dart' as http; + +class WeatherService { + static const BASE_URL = 'http://api.openweathermap.org/data/2.5/weather'; + final String apikey; + + bool locationPermission = true; // Boolean variable to track permission + + WeatherService(this.apikey); + + Future getWeather(String cityName) async { + final response = await http + .get(Uri.parse('$BASE_URL?q=$cityName&appid=$apikey&units=metric')); + if (response.statusCode == 200) { + return Weather.fromJson(jsonDecode(response.body)); + } else { + throw Exception('Failed to load weather data'); + } + } + + Future getCurrentCity() async { + // Check if permission has been granted + LocationPermission permission = await Geolocator.checkPermission(); + // permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + locationPermission = false; + } else { + locationPermission = true; + } + + // If permission is granted, fetch the current location + if (locationPermission) { + Position position = await Geolocator.getCurrentPosition( + desiredAccuracy: LocationAccuracy.high); + + // convert the location into a list of placemark objects + List placemarks = + await placemarkFromCoordinates(position.latitude, position.longitude); + + // extract the city name from the first placemark + String? city = placemarks[0].locality; + + return city ?? ""; + } else { + throw Exception('Location permission not granted'); + } + } +} diff --git a/linux/CMakeLists.txt b/linux/CMakeLists.txt index 03c67f7..9047008 100644 --- a/linux/CMakeLists.txt +++ b/linux/CMakeLists.txt @@ -1,145 +1,145 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.10) -project(runner LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "teahub") -# The unique GTK application identifier for this application. See: -# https://wiki.gnome.org/HowDoI/ChooseApplicationID -set(APPLICATION_ID "com.example.teahub") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(SET CMP0063 NEW) - -# Load bundled libraries from the lib/ directory relative to the binary. -set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") - -# Root filesystem for cross-building. -if(FLUTTER_TARGET_PLATFORM_SYSROOT) - set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) - set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) - set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) - set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) -endif() - -# Define build configuration options. -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") -endif() - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_14) - target_compile_options(${TARGET} PRIVATE -Wall -Werror) - target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") - target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) - -add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") - -# Define the application target. To change its name, change BINARY_NAME above, -# not the value here, or `flutter run` will no longer work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} - "main.cc" - "my_application.cc" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add dependency libraries. Add any application-specific dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter) -target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) - -# Only the install-generated bundle's copy of the executable will launch -# correctly, since the resources must in the right relative locations. To avoid -# people trying to run the unbundled copy, put it in a subdirectory instead of -# the default top-level location. -set_target_properties(${BINARY_NAME} - PROPERTIES - RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" -) - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# By default, "installing" just makes a relocatable bundle in the build -# directory. -set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -# Start with a clean build bundle directory every time. -install(CODE " - file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") - " COMPONENT Runtime) - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) - install(FILES "${bundled_library}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endforeach(bundled_library) - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") - install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() +# Project-level configuration. +cmake_minimum_required(VERSION 3.10) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "chatbotui") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "com.example.chatbotui") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Define the application target. To change its name, change BINARY_NAME above, +# not the value here, or `flutter run` will no longer work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/linux/flutter/CMakeLists.txt b/linux/flutter/CMakeLists.txt index d5bd016..27860e8 100644 --- a/linux/flutter/CMakeLists.txt +++ b/linux/flutter/CMakeLists.txt @@ -1,88 +1,88 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.10) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. - -# Serves the same purpose as list(TRANSFORM ... PREPEND ...), -# which isn't available in 3.10. -function(list_prepend LIST_NAME PREFIX) - set(NEW_LIST "") - foreach(element ${${LIST_NAME}}) - list(APPEND NEW_LIST "${PREFIX}${element}") - endforeach(element) - set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) -endfunction() - -# === Flutter Library === -# System-level dependencies. -find_package(PkgConfig REQUIRED) -pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) -pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) -pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) - -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "fl_basic_message_channel.h" - "fl_binary_codec.h" - "fl_binary_messenger.h" - "fl_dart_project.h" - "fl_engine.h" - "fl_json_message_codec.h" - "fl_json_method_codec.h" - "fl_message_codec.h" - "fl_method_call.h" - "fl_method_channel.h" - "fl_method_codec.h" - "fl_method_response.h" - "fl_plugin_registrar.h" - "fl_plugin_registry.h" - "fl_standard_message_codec.h" - "fl_standard_method_codec.h" - "fl_string_codec.h" - "fl_value.h" - "fl_view.h" - "flutter_linux.h" -) -list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") -target_link_libraries(flutter INTERFACE - PkgConfig::GTK - PkgConfig::GLIB - PkgConfig::GIO -) -add_dependencies(flutter flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CMAKE_CURRENT_BINARY_DIR}/_phony_ - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" - ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} -) +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..85a2413 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,14 @@ #include "generated_plugin_registrant.h" +#include +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); + g_autoptr(FlPluginRegistrar) flutter_secure_storage_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterSecureStorageLinuxPlugin"); + flutter_secure_storage_linux_plugin_register_with_registrar(flutter_secure_storage_linux_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..62e3ed5 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux + flutter_secure_storage_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/linux/main.cc b/linux/main.cc index e7c5c54..4340ffc 100644 --- a/linux/main.cc +++ b/linux/main.cc @@ -1,6 +1,6 @@ -#include "my_application.h" - -int main(int argc, char** argv) { - g_autoptr(MyApplication) app = my_application_new(); - return g_application_run(G_APPLICATION(app), argc, argv); -} +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/linux/my_application.cc b/linux/my_application.cc index 97927db..808e1cd 100644 --- a/linux/my_application.cc +++ b/linux/my_application.cc @@ -1,104 +1,104 @@ -#include "my_application.h" - -#include -#ifdef GDK_WINDOWING_X11 -#include -#endif - -#include "flutter/generated_plugin_registrant.h" - -struct _MyApplication { - GtkApplication parent_instance; - char** dart_entrypoint_arguments; -}; - -G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) - -// Implements GApplication::activate. -static void my_application_activate(GApplication* application) { - MyApplication* self = MY_APPLICATION(application); - GtkWindow* window = - GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); - - // Use a header bar when running in GNOME as this is the common style used - // by applications and is the setup most users will be using (e.g. Ubuntu - // desktop). - // If running on X and not using GNOME then just use a traditional title bar - // in case the window manager does more exotic layout, e.g. tiling. - // If running on Wayland assume the header bar will work (may need changing - // if future cases occur). - gboolean use_header_bar = TRUE; -#ifdef GDK_WINDOWING_X11 - GdkScreen* screen = gtk_window_get_screen(window); - if (GDK_IS_X11_SCREEN(screen)) { - const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); - if (g_strcmp0(wm_name, "GNOME Shell") != 0) { - use_header_bar = FALSE; - } - } -#endif - if (use_header_bar) { - GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); - gtk_widget_show(GTK_WIDGET(header_bar)); - gtk_header_bar_set_title(header_bar, "teahub"); - gtk_header_bar_set_show_close_button(header_bar, TRUE); - gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); - } else { - gtk_window_set_title(window, "teahub"); - } - - gtk_window_set_default_size(window, 1280, 720); - gtk_widget_show(GTK_WIDGET(window)); - - g_autoptr(FlDartProject) project = fl_dart_project_new(); - fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); - - FlView* view = fl_view_new(project); - gtk_widget_show(GTK_WIDGET(view)); - gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); - - fl_register_plugins(FL_PLUGIN_REGISTRY(view)); - - gtk_widget_grab_focus(GTK_WIDGET(view)); -} - -// Implements GApplication::local_command_line. -static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { - MyApplication* self = MY_APPLICATION(application); - // Strip out the first argument as it is the binary name. - self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); - - g_autoptr(GError) error = nullptr; - if (!g_application_register(application, nullptr, &error)) { - g_warning("Failed to register: %s", error->message); - *exit_status = 1; - return TRUE; - } - - g_application_activate(application); - *exit_status = 0; - - return TRUE; -} - -// Implements GObject::dispose. -static void my_application_dispose(GObject* object) { - MyApplication* self = MY_APPLICATION(object); - g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); - G_OBJECT_CLASS(my_application_parent_class)->dispose(object); -} - -static void my_application_class_init(MyApplicationClass* klass) { - G_APPLICATION_CLASS(klass)->activate = my_application_activate; - G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; - G_OBJECT_CLASS(klass)->dispose = my_application_dispose; -} - -static void my_application_init(MyApplication* self) {} - -MyApplication* my_application_new() { - return MY_APPLICATION(g_object_new(my_application_get_type(), - "application-id", APPLICATION_ID, - "flags", G_APPLICATION_NON_UNIQUE, - nullptr)); -} +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "chatbotui"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "chatbotui"); + } + + gtk_window_set_default_size(window, 1280, 720); + gtk_widget_show(GTK_WIDGET(window)); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/linux/my_application.h b/linux/my_application.h index 72271d5..8f20fb5 100644 --- a/linux/my_application.h +++ b/linux/my_application.h @@ -1,18 +1,18 @@ -#ifndef FLUTTER_MY_APPLICATION_H_ -#define FLUTTER_MY_APPLICATION_H_ - -#include - -G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, - GtkApplication) - -/** - * my_application_new: - * - * Creates a new Flutter-based application. - * - * Returns: a new #MyApplication. - */ -MyApplication* my_application_new(); - -#endif // FLUTTER_MY_APPLICATION_H_ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..f022c34 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1 @@ -#include "ephemeral/Flutter-Generated.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..f022c34 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1 @@ -#include "ephemeral/Flutter-Generated.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 9ae8802..7fdde12 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,12 +5,24 @@ import FlutterMacOS import Foundation +import facebook_auth_desktop +import file_selector_macos import firebase_auth import firebase_core +import flutter_secure_storage_macos +import geolocator_apple import google_sign_in_ios +import path_provider_foundation +import sqflite func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FacebookAuthDesktopPlugin.register(with: registry.registrar(forPlugin: "FacebookAuthDesktopPlugin")) + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) FLTFirebaseAuthPlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseAuthPlugin")) FLTFirebaseCorePlugin.register(with: registry.registrar(forPlugin: "FLTFirebaseCorePlugin")) + FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) + GeolocatorPlugin.register(with: registry.registrar(forPlugin: "GeolocatorPlugin")) FLTGoogleSignInPlugin.register(with: registry.registrar(forPlugin: "FLTGoogleSignInPlugin")) + PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) } diff --git a/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 0000000..c2d2e1f --- /dev/null +++ b/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,11 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=E:\TeaHub FrontEnd\flutter_windows_3.16.8-stable\flutter +FLUTTER_APPLICATION_PATH=C:\Users\vihanga\Desktop\new Project\TeaHub-Application +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/macos/Flutter/ephemeral/flutter_export_environment.sh b/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100644 index 0000000..da768bd --- /dev/null +++ b/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=E:\TeaHub FrontEnd\flutter_windows_3.16.8-stable\flutter" +export "FLUTTER_APPLICATION_PATH=C:\Users\vihanga\Desktop\new Project\TeaHub-Application" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index bb81c52..2cdcb98 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -1,695 +1,695 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXAggregateTarget section */ - 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { - isa = PBXAggregateTarget; - buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; - buildPhases = ( - 33CC111E2044C6BF0003C045 /* ShellScript */, - ); - dependencies = ( - ); - name = "Flutter Assemble"; - productName = FLX; - }; -/* End PBXAggregateTarget section */ - -/* Begin PBXBuildFile section */ - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC10EC2044A3C60003C045; - remoteInfo = Runner; - }; - 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 33CC10E52044A3C60003C045 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 33CC111A2044C6BA0003C045; - remoteInfo = FLX; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 33CC110E2044A8840003C045 /* Bundle Framework */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - ); - name = "Bundle Framework"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* teahub.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "teahub.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; - 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; - 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; - 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; - 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; - 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 331C80D2294CF70F00263BE5 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EA2044A3C60003C045 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 331C80D6294CF71000263BE5 /* RunnerTests */ = { - isa = PBXGroup; - children = ( - 331C80D7294CF71000263BE5 /* RunnerTests.swift */, - ); - path = RunnerTests; - sourceTree = ""; - }; - 33BA886A226E78AF003329D5 /* Configs */ = { - isa = PBXGroup; - children = ( - 33E5194F232828860026EE4D /* AppInfo.xcconfig */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, - ); - path = Configs; - sourceTree = ""; - }; - 33CC10E42044A3C60003C045 = { - isa = PBXGroup; - children = ( - 33FAB671232836740065AC1E /* Runner */, - 33CEB47122A05771004F2AC0 /* Flutter */, - 331C80D6294CF71000263BE5 /* RunnerTests */, - 33CC10EE2044A3C60003C045 /* Products */, - D73912EC22F37F3D000D13A0 /* Frameworks */, - ); - sourceTree = ""; - }; - 33CC10EE2044A3C60003C045 /* Products */ = { - isa = PBXGroup; - children = ( - 33CC10ED2044A3C60003C045 /* teahub.app */, - 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 33CC11242044D66E0003C045 /* Resources */ = { - isa = PBXGroup; - children = ( - 33CC10F22044A3C60003C045 /* Assets.xcassets */, - 33CC10F42044A3C60003C045 /* MainMenu.xib */, - 33CC10F72044A3C60003C045 /* Info.plist */, - ); - name = Resources; - path = ..; - sourceTree = ""; - }; - 33CEB47122A05771004F2AC0 /* Flutter */ = { - isa = PBXGroup; - children = ( - 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, - 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, - 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, - 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, - ); - path = Flutter; - sourceTree = ""; - }; - 33FAB671232836740065AC1E /* Runner */ = { - isa = PBXGroup; - children = ( - 33CC10F02044A3C60003C045 /* AppDelegate.swift */, - 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, - 33E51913231747F40026EE4D /* DebugProfile.entitlements */, - 33E51914231749380026EE4D /* Release.entitlements */, - 33CC11242044D66E0003C045 /* Resources */, - 33BA886A226E78AF003329D5 /* Configs */, - ); - path = Runner; - sourceTree = ""; - }; - D73912EC22F37F3D000D13A0 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 331C80D4294CF70F00263BE5 /* RunnerTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; - buildPhases = ( - 331C80D1294CF70F00263BE5 /* Sources */, - 331C80D2294CF70F00263BE5 /* Frameworks */, - 331C80D3294CF70F00263BE5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 331C80DA294CF71000263BE5 /* PBXTargetDependency */, - ); - name = RunnerTests; - productName = RunnerTests; - productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - 33CC10EC2044A3C60003C045 /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 33CC10E92044A3C60003C045 /* Sources */, - 33CC10EA2044A3C60003C045 /* Frameworks */, - 33CC10EB2044A3C60003C045 /* Resources */, - 33CC110E2044A8840003C045 /* Bundle Framework */, - 3399D490228B24CF009A79C7 /* ShellScript */, - ); - buildRules = ( - ); - dependencies = ( - 33CC11202044C79F0003C045 /* PBXTargetDependency */, - ); - name = Runner; - productName = Runner; - productReference = 33CC10ED2044A3C60003C045 /* teahub.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 33CC10E52044A3C60003C045 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1430; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 331C80D4294CF70F00263BE5 = { - CreatedOnToolsVersion = 14.0; - TestTargetID = 33CC10EC2044A3C60003C045; - }; - 33CC10EC2044A3C60003C045 = { - CreatedOnToolsVersion = 9.2; - LastSwiftMigration = 1100; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Sandbox = { - enabled = 1; - }; - }; - }; - 33CC111A2044C6BA0003C045 = { - CreatedOnToolsVersion = 9.2; - ProvisioningStyle = Manual; - }; - }; - }; - buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 33CC10E42044A3C60003C045; - productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 33CC10EC2044A3C60003C045 /* Runner */, - 331C80D4294CF70F00263BE5 /* RunnerTests */, - 33CC111A2044C6BA0003C045 /* Flutter Assemble */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 331C80D3294CF70F00263BE5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10EB2044A3C60003C045 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, - 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3399D490228B24CF009A79C7 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; - }; - 33CC111E2044C6BF0003C045 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - Flutter/ephemeral/FlutterInputs.xcfilelist, - ); - inputPaths = ( - Flutter/ephemeral/tripwire, - ); - outputFileListPaths = ( - Flutter/ephemeral/FlutterOutputs.xcfilelist, - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 331C80D1294CF70F00263BE5 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 33CC10E92044A3C60003C045 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, - 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, - 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC10EC2044A3C60003C045 /* Runner */; - targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; - }; - 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; - targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 33CC10F52044A3C60003C045 /* Base */, - ); - name = MainMenu.xib; - path = Runner; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 331C80DB294CF71000263BE5 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.teahub.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/teahub.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/teahub"; - }; - name = Debug; - }; - 331C80DC294CF71000263BE5 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.teahub.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/teahub.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/teahub"; - }; - name = Release; - }; - 331C80DD294CF71000263BE5 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.example.teahub.RunnerTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/teahub.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/teahub"; - }; - name = Profile; - }; - 338D0CE9231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Profile; - }; - 338D0CEA231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Profile; - }; - 338D0CEB231458BD00FA5F75 /* Profile */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Profile; - }; - 33CC10F92044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 33CC10FA2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.14; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - }; - name = Release; - }; - 33CC10FC2044A3C60003C045 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - }; - name = Debug; - }; - 33CC10FD2044A3C60003C045 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; - CODE_SIGN_STYLE = Automatic; - COMBINE_HIDPI_IMAGES = YES; - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/../Frameworks", - ); - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_VERSION = 5.0; - }; - name = Release; - }; - 33CC111C2044C6BA0003C045 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Manual; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 33CC111D2044C6BA0003C045 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 331C80DB294CF71000263BE5 /* Debug */, - 331C80DC294CF71000263BE5 /* Release */, - 331C80DD294CF71000263BE5 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10F92044A3C60003C045 /* Debug */, - 33CC10FA2044A3C60003C045 /* Release */, - 338D0CE9231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC10FC2044A3C60003C045 /* Debug */, - 33CC10FD2044A3C60003C045 /* Release */, - 338D0CEA231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 33CC111C2044C6BA0003C045 /* Debug */, - 33CC111D2044C6BA0003C045 /* Release */, - 338D0CEB231458BD00FA5F75 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 33CC10E52044A3C60003C045 /* Project object */; -} +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* chatbotui.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "chatbotui.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* chatbotui.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* chatbotui.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1430; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatbotui.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/chatbotui"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatbotui.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/chatbotui"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/chatbotui.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/chatbotui"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.14; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 2b39568..c35ee6f 100644 --- a/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,98 +1,98 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..59c6d39 100644 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -1,7 +1,7 @@ - - - - - + + + + + diff --git a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 18d9810..fc6bf80 100644 --- a/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -1,8 +1,8 @@ - - - - - IDEDidComputeMac32BitWarning - - - + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/macos/Runner/AppDelegate.swift b/macos/Runner/AppDelegate.swift index d53ef64..553a135 100644 --- a/macos/Runner/AppDelegate.swift +++ b/macos/Runner/AppDelegate.swift @@ -1,9 +1,9 @@ -import Cocoa -import FlutterMacOS - -@NSApplicationMain -class AppDelegate: FlutterAppDelegate { - override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { - return true - } -} +import Cocoa +import FlutterMacOS + +@NSApplicationMain +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } +} diff --git a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json index a2ec33f..8d4e7cb 100644 --- a/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,68 +1,68 @@ -{ - "images" : [ - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_16.png", - "scale" : "1x" - }, - { - "size" : "16x16", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "2x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_32.png", - "scale" : "1x" - }, - { - "size" : "32x32", - "idiom" : "mac", - "filename" : "app_icon_64.png", - "scale" : "2x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_128.png", - "scale" : "1x" - }, - { - "size" : "128x128", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "2x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_256.png", - "scale" : "1x" - }, - { - "size" : "256x256", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "2x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_512.png", - "scale" : "1x" - }, - { - "size" : "512x512", - "idiom" : "mac", - "filename" : "app_icon_1024.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/macos/Runner/Base.lproj/MainMenu.xib b/macos/Runner/Base.lproj/MainMenu.xib index 80e867a..4632c69 100644 --- a/macos/Runner/Base.lproj/MainMenu.xib +++ b/macos/Runner/Base.lproj/MainMenu.xib @@ -1,343 +1,343 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/macos/Runner/Configs/AppInfo.xcconfig b/macos/Runner/Configs/AppInfo.xcconfig index 72d60e8..7e7ad40 100644 --- a/macos/Runner/Configs/AppInfo.xcconfig +++ b/macos/Runner/Configs/AppInfo.xcconfig @@ -1,14 +1,14 @@ -// Application-level settings for the Runner target. -// -// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the -// future. If not, the values below would default to using the project name when this becomes a -// 'flutter create' template. - -// The application's name. By default this is also the title of the Flutter window. -PRODUCT_NAME = teahub - -// The application's bundle identifier -PRODUCT_BUNDLE_IDENTIFIER = com.example.teahub - -// The copyright displayed in application information -PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = chatbotui + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = com.example.chatbotui + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2024 com.example. All rights reserved. diff --git a/macos/Runner/Configs/Debug.xcconfig b/macos/Runner/Configs/Debug.xcconfig index 36b0fd9..b398823 100644 --- a/macos/Runner/Configs/Debug.xcconfig +++ b/macos/Runner/Configs/Debug.xcconfig @@ -1,2 +1,2 @@ -#include "../../Flutter/Flutter-Debug.xcconfig" -#include "Warnings.xcconfig" +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Release.xcconfig b/macos/Runner/Configs/Release.xcconfig index dff4f49..d93e5dc 100644 --- a/macos/Runner/Configs/Release.xcconfig +++ b/macos/Runner/Configs/Release.xcconfig @@ -1,2 +1,2 @@ -#include "../../Flutter/Flutter-Release.xcconfig" -#include "Warnings.xcconfig" +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/macos/Runner/Configs/Warnings.xcconfig b/macos/Runner/Configs/Warnings.xcconfig index 42bcbf4..fb4d7d3 100644 --- a/macos/Runner/Configs/Warnings.xcconfig +++ b/macos/Runner/Configs/Warnings.xcconfig @@ -1,13 +1,13 @@ -WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_PRAGMA_PACK = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -GCC_WARN_STRICT_SELECTOR_MATCH = YES -CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -GCC_WARN_SHADOW = YES -CLANG_WARN_UNREACHABLE_CODE = YES +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index dddb8a3..51d0967 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -1,12 +1,12 @@ - - - - - com.apple.security.app-sandbox - - com.apple.security.cs.allow-jit - - com.apple.security.network.server - - - + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/macos/Runner/Info.plist b/macos/Runner/Info.plist index 4789daa..3733c1a 100644 --- a/macos/Runner/Info.plist +++ b/macos/Runner/Info.plist @@ -1,32 +1,32 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIconFile - - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSMinimumSystemVersion - $(MACOSX_DEPLOYMENT_TARGET) - NSHumanReadableCopyright - $(PRODUCT_COPYRIGHT) - NSMainNibFile - MainMenu - NSPrincipalClass - NSApplication - - + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/macos/Runner/MainFlutterWindow.swift b/macos/Runner/MainFlutterWindow.swift index 3cc05eb..ab30cba 100644 --- a/macos/Runner/MainFlutterWindow.swift +++ b/macos/Runner/MainFlutterWindow.swift @@ -1,15 +1,15 @@ -import Cocoa -import FlutterMacOS - -class MainFlutterWindow: NSWindow { - override func awakeFromNib() { - let flutterViewController = FlutterViewController() - let windowFrame = self.frame - self.contentViewController = flutterViewController - self.setFrame(windowFrame, display: true) - - RegisterGeneratedPlugins(registry: flutterViewController) - - super.awakeFromNib() - } -} +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 852fa1a..04336df 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -1,8 +1,8 @@ - - - - - com.apple.security.app-sandbox - - - + + + + + com.apple.security.app-sandbox + + + diff --git a/macos/RunnerTests/RunnerTests.swift b/macos/RunnerTests/RunnerTests.swift index 5418c9f..ba12981 100644 --- a/macos/RunnerTests/RunnerTests.swift +++ b/macos/RunnerTests/RunnerTests.swift @@ -1,12 +1,12 @@ -import FlutterMacOS -import Cocoa -import XCTest - -class RunnerTests: XCTestCase { - - func testExample() { - // If you add code to the Runner application, consider adding tests here. - // See https://developer.apple.com/documentation/xctest for more information about using XCTest. - } - -} +import FlutterMacOS +import Cocoa +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/pubspec.lock b/pubspec.lock index 3ac2386..735c786 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,42 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: f5628cd9c92ed11083f425fd1f8f1bc60ecdda458c81d73b143aeda036c35fe7 + sha256: "737321f9be522620ed3794937298fb0027a48a402624fa2500f7532f94aea810" url: "https://pub.dev" source: hosted - version: "1.3.16" + version: "1.3.22" + animated_bottom_navigation_bar: + dependency: "direct main" + description: + name: animated_bottom_navigation_bar + sha256: "2bedd1236d96f4305e6299f68d9f95a923f05ce8e47c2e70d7ed94d709d5f6d6" + url: "https://pub.dev" + source: hosted + version: "0.3.3" + ansicolor: + dependency: transitive + description: + name: ansicolor + sha256: "8bf17a8ff6ea17499e40a2d2542c2f481cd7615760c6d34065cb22bfd22e6880" + url: "https://pub.dev" + source: hosted + version: "2.0.2" + archive: + dependency: transitive + description: + name: archive + sha256: "22600aa1e926be775fa5fe7e6894e7fb3df9efda8891c73f70fb3262399a432d" + url: "https://pub.dev" + source: hosted + version: "3.4.10" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" async: dependency: transitive description: @@ -25,6 +57,38 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + bubble: + dependency: "direct main" + description: + name: bubble + sha256: "65b992b8f8ba2e7e2871190cbdfaa0818b6de2f340bef37cb5ee1b61debe0226" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + url: "https://pub.dev" + source: hosted + version: "1.1.1" characters: dependency: transitive description: @@ -33,6 +97,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + chat_bubbles: + dependency: "direct main" + description: + name: chat_bubbles + sha256: "9ee1493b31a7f847363c5d69725ec55db94f720c7c116d403b4d322a4da0f08c" + url: "https://pub.dev" + source: hosted + version: "1.6.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: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" clock: dependency: transitive description: @@ -49,6 +137,38 @@ 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" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: fedaadfa3a6996f75211d835aaeb8fede285dae94262485698afd832371b9a5e + url: "https://pub.dev" + source: hosted + version: "0.3.3+8" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" cupertino_icons: dependency: "direct main" description: @@ -57,6 +177,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.6" + facebook_auth_desktop: + dependency: transitive + description: + name: facebook_auth_desktop + sha256: e6cc4d6f50a1d67d99e7dac7d77a40fe27122496e224cb708ae168d7d9aac0ac + url: "https://pub.dev" + source: hosted + version: "1.0.3" fake_async: dependency: transitive description: @@ -65,38 +193,86 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" firebase_auth: dependency: "direct main" description: name: firebase_auth - sha256: "279b2773ff61afd9763202cb5582e2b995ee57419d826b9af6517302a59b672f" + sha256: "549f8ceb8cfc1920f85dea0ab73fb7dc209ee8182916b252eda342786c33369d" url: "https://pub.dev" source: hosted - version: "4.16.0" + version: "4.17.4" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "3c9cfaccb7549492edf5b0c67c6dd1c6727c7830891aa6727f2fb225f0226626" + sha256: dba259dee045b706112c3d7619b01c2ad338d86cc492df52dd2073584a64de66 url: "https://pub.dev" source: hosted - version: "7.0.9" + version: "7.1.5" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: c7b1379ccef7abf4b6816eede67a868c44142198e42350f51c01d8fc03f95a7d + sha256: d2266452698dd5f6e522408dacfa06bb7f9703b5bdd11498fce2812ded50805b url: "https://pub.dev" source: hosted - version: "5.8.13" + version: "5.9.4" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "96607c0e829a581c2a483c658f04e8b159964c3bae2730f73297070bc85d40bb" + sha256: "7e049e32a9d347616edb39542cf92cd53fdb4a99fb6af0a0bff327c14cd76445" url: "https://pub.dev" source: hosted - version: "2.24.2" + version: "2.25.4" firebase_core_platform_interface: dependency: transitive description: @@ -109,23 +285,39 @@ packages: dependency: transitive description: name: firebase_core_web - sha256: d585bdf3c656c3f7821ba1bd44da5f13365d22fcecaf5eb75c4295246aaa83c0 + sha256: "57e61d6010e253b36d38191cefd6199d7849152cdcd234b61ca290cdb278a0ba" + url: "https://pub.dev" + source: hosted + version: "2.11.4" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "1.1.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + url: "https://pub.dev" + source: hosted + version: "3.3.1" flutter_facebook_auth: dependency: "direct main" description: name: flutter_facebook_auth - sha256: fd1a6749dafbd5923585038671b63abdcedd4fe5923eb42fc154247dc5622519 + sha256: "4958d39b62791d8f08c429b5c296e9e27f850e3385d63ebc9fe7b69f2c243c6c" url: "https://pub.dev" source: hosted - version: "6.0.4" + version: "6.1.1" flutter_facebook_auth_platform_interface: dependency: transitive description: @@ -142,14 +334,86 @@ packages: url: "https://pub.dev" source: hosted version: "5.0.0" - flutter_lints: - dependency: "direct dev" + flutter_launcher_icons: + dependency: "direct main" description: - name: flutter_lints - sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 + name: flutter_launcher_icons + sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" url: "https://pub.dev" source: hosted - version: "2.0.3" + version: "0.13.1" + flutter_native_splash: + dependency: "direct main" + description: + name: flutter_native_splash + sha256: edf39bcf4d74aca1eb2c1e43c3e445fd9f494013df7f0da752fefe72020eedc0 + url: "https://pub.dev" + source: hosted + version: "2.4.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" + source: hosted + version: "2.0.17" + flutter_secure_storage: + dependency: transitive + description: + name: flutter_secure_storage + sha256: ffdbb60130e4665d2af814a0267c481bcf522c41ae2e43caf69fa0146876d685 + url: "https://pub.dev" + source: hosted + version: "9.0.0" + flutter_secure_storage_linux: + dependency: transitive + description: + name: flutter_secure_storage_linux + sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + flutter_secure_storage_macos: + dependency: transitive + description: + name: flutter_secure_storage_macos + sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c + url: "https://pub.dev" + source: hosted + version: "3.0.1" + flutter_secure_storage_platform_interface: + dependency: transitive + description: + name: flutter_secure_storage_platform_interface + sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e" + url: "https://pub.dev" + source: hosted + version: "1.0.2" + flutter_secure_storage_web: + dependency: transitive + description: + name: flutter_secure_storage_web + sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + flutter_secure_storage_windows: + dependency: transitive + description: + name: flutter_secure_storage_windows + sha256: "5809c66f9dd3b4b93b0a6e2e8561539405322ee767ac2f64d084e2ab5429d108" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: d39e7f95621fc84376bc0f7d504f05c3a41488c562f4a8ad410569127507402c + url: "https://pub.dev" + source: hosted + version: "2.0.9" flutter_test: dependency: "direct dev" description: flutter @@ -160,6 +424,102 @@ packages: description: flutter source: sdk version: "0.0.0" + font_awesome_flutter: + dependency: "direct main" + description: + name: font_awesome_flutter + sha256: "1f93e5799f0e6c882819e8393a05c6ca5226010f289190f2242ec19f3f0fdba5" + url: "https://pub.dev" + source: hosted + version: "9.2.0" + geocoding: + dependency: "direct main" + description: + name: geocoding + sha256: "06d053a67733d1b9b4267259713913bc2aa750f18b830f0869ff337a8cfa8325" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + geocoding_android: + dependency: transitive + description: + name: geocoding_android + sha256: "287a2009cb2c3d3dd2899ba8f3d3e38d9e06905ea429283859bfc3586d4f57fd" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + geocoding_ios: + dependency: transitive + description: + name: geocoding_ios + sha256: "8a39bfb650af55209c42e564036a550b32d029e0733af01dc66c5afea50388d3" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + geocoding_platform_interface: + dependency: transitive + description: + name: geocoding_platform_interface + sha256: "8c2c8226e5c276594c2e18bfe88b19110ed770aeb7c1ab50ede570be8b92229b" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + geolocator: + dependency: "direct main" + description: + name: geolocator + sha256: f4efb8d3c4cdcad2e226af9661eb1a0dd38c71a9494b22526f9da80ab79520e5 + url: "https://pub.dev" + source: hosted + version: "10.1.1" + geolocator_android: + dependency: transitive + description: + name: geolocator_android + sha256: "136f1c97e1903366393bda514c5d9e98843418baea52899aa45edae9af8a5cd6" + url: "https://pub.dev" + source: hosted + version: "4.5.2" + geolocator_apple: + dependency: transitive + description: + name: geolocator_apple + sha256: "2f2d4ee16c4df269e93c0e382be075cc01d5db6703c3196e4af20a634fe49ef4" + url: "https://pub.dev" + source: hosted + version: "2.3.6" + geolocator_platform_interface: + dependency: transitive + description: + name: geolocator_platform_interface + sha256: "009a21c4bc2761e58dccf07c24f219adaebe0ff707abdfd40b0a763d4003fab9" + url: "https://pub.dev" + source: hosted + version: "4.2.2" + geolocator_web: + dependency: transitive + description: + name: geolocator_web + sha256: "102e7da05b48ca6bf0a5bda0010f886b171d1a08059f01bfe02addd0175ebece" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + geolocator_windows: + dependency: transitive + description: + name: geolocator_windows + sha256: a92fae29779d5c6dc60e8411302f5221ade464968fe80a36d330e80a71f087af + url: "https://pub.dev" + source: hosted + version: "0.2.2" + google_fonts: + dependency: "direct main" + description: + name: google_fonts + sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8 + url: "https://pub.dev" + source: hosted + version: "6.1.0" google_identity_services_web: dependency: transitive description: @@ -188,10 +548,10 @@ packages: dependency: transitive description: name: google_sign_in_ios - sha256: f3336d9e44d4d28063ac90271f6db5caf99f0480cb07281330e7a432edb95226 + sha256: a7d653803468d30b82ceb47ea00fe86d23c56e63eb2e5c2248bb68e9df203217 url: "https://pub.dev" source: hosted - version: "5.7.3" + version: "5.7.4" google_sign_in_platform_interface: dependency: transitive description: @@ -208,8 +568,16 @@ packages: url: "https://pub.dev" source: hosted version: "0.12.3+2" - http: + html: dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" + http: + dependency: "direct main" description: name: http sha256: a2bbf9d017fcced29139daa8ed2bba4ece450ab222871df93ca9eec6f80c34ba @@ -224,6 +592,110 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image: + dependency: transitive + description: + name: image + sha256: "4c68bfd5ae83e700b5204c1e74451e7bf3cf750e6843c6e158289cf56bda018e" + url: "https://pub.dev" + source: hosted + version: "4.1.7" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: f4bad5ed2dfff5a7ce0dfbad545b46a945c702bb6182a921488ef01ba7693111 + url: "https://pub.dev" + source: hosted + version: "5.0.1" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: "865d798b5c9d826f1185b32e5d0018c4183ddb77b7b82a931e1a06aa3b74974e" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: ee160d686422272aa306125f3b6fb1c1894d9b87a5e20ed33fa008e7285da11e + url: "https://pub.dev" + source: hosted + version: "5.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: b6951e25b795d053a6ba03af5f710069c99349de9341af95155d52665cb4607c + url: "https://pub.dev" + source: hosted + version: "0.8.9" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" + url: "https://pub.dev" + source: hosted + version: "0.8.9+3" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0" + url: "https://pub.dev" + source: hosted + version: "2.2.0" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 + url: "https://pub.dev" + source: hosted + version: "0.8.9+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: fa4e815e6fcada50e35718727d83ba1c92f1edf95c0b4436554cec301b56233b + url: "https://pub.dev" + source: hosted + version: "2.9.3" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf + url: "https://pub.dev" + source: hosted + version: "0.19.0" js: dependency: transitive description: @@ -232,6 +704,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.6.7" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" leak_tracker: dependency: transitive description: @@ -256,14 +736,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" - lints: - dependency: transitive + lottie: + dependency: "direct main" description: - name: lints - sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" + name: lottie + sha256: ce2bb2605753915080e4ee47f036a64228c88dc7f56f7bc1dbe912d75b55b1e2 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "3.1.0" matcher: dependency: transitive description: @@ -288,6 +768,38 @@ packages: url: "https://pub.dev" source: hosted version: "1.11.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + page_transition: + dependency: "direct main" + description: + name: page_transition + sha256: dee976b1f23de9bbef5cd512fe567e9f6278caee11f5eaca9a2115c19dc49ef6 + url: "https://pub.dev" + source: hosted + version: "2.1.0" path: dependency: transitive description: @@ -296,6 +808,118 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: bc56bfe9d3f44c3c612d8d393bd9b174eb796d706759f9b495ac254e4294baa5 + url: "https://pub.dev" + source: hosted + version: "10.4.5" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "59c6322171c29df93a22d150ad95f3aa19ed86542eaec409ab2691b8f35f9a47" + url: "https://pub.dev" + source: hosted + version: "10.3.6" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" + url: "https://pub.dev" + source: hosted + version: "9.1.4" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" + url: "https://pub.dev" + source: hosted + version: "3.12.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + url: "https://pub.dev" + source: hosted + version: "0.1.3" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" plugin_platform_interface: dependency: transitive description: @@ -304,11 +928,43 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + pointycastle: + dependency: transitive + description: + name: pointycastle + sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" + url: "https://pub.dev" + source: hosted + version: "3.7.4" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" sky_engine: dependency: transitive description: flutter source: sdk version: "0.0.99" + smooth_page_indicator: + dependency: "direct main" + description: + name: smooth_page_indicator + sha256: "725bc638d5e79df0c84658e1291449996943f93bacbc2cec49963dbbab48d8ae" + url: "https://pub.dev" + source: hosted + version: "1.1.0" source_span: dependency: transitive description: @@ -317,6 +973,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: a9016f495c927cb90557c909ff26a6d92d9bd54fc42ba92e19d4e79d61e798c6 + url: "https://pub.dev" + source: hosted + version: "2.3.2" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "28d8c66baee4968519fb8bd6cdbedad982d6e53359091f0b74544a9f32ec72d5" + url: "https://pub.dev" + source: hosted + version: "2.5.3" stack_trace: dependency: transitive description: @@ -341,6 +1021,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" term_glyph: dependency: transitive description: @@ -365,6 +1053,46 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + universal_io: + dependency: transitive + description: + name: universal_io + sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + url: "https://pub.dev" + source: hosted + version: "4.3.3" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "4ac59808bbfca6da38c99f415ff2d3a5d7ca0a6b4809c71d9cf30fba5daf9752" + url: "https://pub.dev" + source: hosted + version: "1.1.10+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: f3247e7ab0ec77dc759263e68394990edc608fb2b480b80db8aa86ed09279e33 + url: "https://pub.dev" + source: hosted + version: "1.1.10+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "18489bdd8850de3dd7ca8a34e0c446f719ec63e2bab2e7a8cc66a9028dd76c5a" + url: "https://pub.dev" + source: hosted + version: "1.1.10+1" vector_math: dependency: transitive description: @@ -389,6 +1117,38 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" sdks: - dart: ">=3.2.3 <4.0.0" - flutter: ">=3.16.0" + dart: ">=3.2.5 <4.0.0" + flutter: ">=3.16.6" diff --git a/pubspec.yaml b/pubspec.yaml index e8d9e7f..6736b12 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,103 +1,230 @@ -name: teahub -description: "A new Flutter project." -# 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 - -# The following defines the version and build number for your application. -# A version number is three numbers separated by dots, like 1.2.43 -# followed by an optional build number separated by a +. -# Both the version and the builder number may be overridden in flutter -# build by specifying --build-name and --build-number, respectively. -# In Android, build-name is used as versionName while build-number used as versionCode. -# Read more about Android versioning at https://developer.android.com/studio/publish/versioning -# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. -# Read more about iOS versioning at -# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -# In Windows, build-name is used as the major, minor, and patch parts -# of the product and file versions while build-number is used as the build suffix. -version: 1.0.0+1 - -environment: - sdk: '>=3.2.3 <4.0.0' - -# Dependencies specify other packages that your package needs in order to work. -# To automatically upgrade your package dependencies to the latest versions -# consider running `flutter pub upgrade --major-versions`. Alternatively, -# dependencies can be manually updated by changing the version numbers below to -# the latest version available on pub.dev. To see which dependencies have newer -# versions available, run `flutter pub outdated`. -dependencies: - flutter: - sdk: flutter - - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^1.0.2 - - #Firebase - firebase_core: ^2.24.2 - firebase_auth: ^4.16.0 - google_sign_in: ^6.2.1 - flutter_facebook_auth: ^6.0.4 - - - # #Firebase Database - # cloud_firestore: ^3.1.5 - -dev_dependencies: - flutter_test: - sdk: flutter - - # The "flutter_lints" package below contains a set of recommended lints to - # encourage good coding practices. The lint set provided by the package is - # activated in the `analysis_options.yaml` file located at the root of your - # package. See that file for information about deactivating specific lint - # rules and activating additional ones. - flutter_lints: ^2.0.0 - -# For information on the generic Dart part of this file, see the -# following page: https://dart.dev/tools/pub/pubspec - -# The following section is specific to Flutter packages. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the material Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - assets: - - lib/images/Google_icon.png - - lib/images/Facebook_icon.png - - lib/images/Apple_icon.png - - # An image asset can refer to one or more resolution-specific "variants", see - # https://flutter.dev/assets-and-images/#resolution-aware - - # For details regarding adding assets from package dependencies, see - # https://flutter.dev/assets-and-images/#from-packages - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 - # - # For details regarding fonts from package dependencies, - # see https://flutter.dev/custom-fonts/#from-packages - - \ No newline at end of file +name: chatbotui +description: "A new Flutter project." +# 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 + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: '>=3.2.5 <4.0.0' + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + chat_bubbles: ^1.6.0 + + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.2 + bubble: + provider: + #intl: + animated_bottom_navigation_bar: ^0.3.3 + font_awesome_flutter: ^9.2.0 + page_transition: ^2.0.5 + cached_network_image: ^3.3.0 + flutter_svg: ^2.0.9 + google_fonts: ^6.1.0 + + #Firebase + firebase_core: ^2.24.2 + firebase_auth: ^4.16.0 + google_sign_in: ^6.2.1 + flutter_facebook_auth: ^6.0.4 + #introduction_screen: ^3.1.12 + smooth_page_indicator: ^1.1.0 + + # dependencies of weather widget + http: ^1.2.0 + geolocator: ^10.1.0 + geocoding: ^2.1.1 + lottie: ^3.0.0 + intl: 0.19.0 + + #scan page + image_cropper: ^5.0.1 + image_picker: ^0.8.5+3 + permission_handler: ^10.2.0 + + #splash screen + flutter_native_splash: ^2.2.19 + flutter_launcher_icons: ^0.13.1 + + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_launcher_icons: "^0.13.1" + +flutter_launcher_icons: + android: "launcher_icon" + ios: true + image_path: "assets/images/logo/TeaHub_icon.jpg" + + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^2.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + +assets: + - assets/services.json + - assets/default.jpg + - assets/robot.jpg + - assets/ + - assets/images/ + - assets/images/bgimag.png + - assets/images/rectangle-8.png + - assets/images/headsetsvgrepocom.png + - assets/images/play-buttonsvgrepocom.png + - assets/images/vector-8MD.png + - assets/images/vector-SuD.png + - assets/images/vector-pGX.png + - assets/images/vector-UWj.png + - assets/images/snap_tips imgs/ + - assets/images/treatment_imgs/ + + # assets of weather widget + - assets/weather_animation/loading.json + - assets/weather_animation/clear_day.json + - assets/weather_animation/clear_night.json + - assets/weather_animation/cloudy_day.json + - assets/weather_animation/cloudy_night.json + - assets/weather_animation/mist_day.json + - assets/weather_animation/mist_night.json + - assets/weather_animation/partly_cloudy_day.json + - assets/weather_animation/partly_cloudy_night.json + - assets/weather_animation/partly_rain_day.json + - assets/weather_animation/partly_rain_night.json + - assets/weather_animation/rain_day.json + - assets/weather_animation/rain_night.json + - assets/weather_animation/thunder_strom_day.json + - assets/weather_animation/thunder_storm_night.json + + #assets of user profile + - assets/user_profile/images/rectangle-51.png + - assets/user_profile/images/top.png + - assets/user_profile/images/rectangle-6.png + - assets/user_profile/images/group-62.png + - assets/user_profile/images/line-business-profile-line.png + - assets/user_profile/images/line-media-notification-3-line.png + - assets/user_profile/images/auto-group-oclv.png + - assets/user_profile/images/line-user-contacts-line.png + - assets/user_profile/images/line-communication-chat-quote-line.png + - assets/user_profile/images/line-system-lock-2-line.png + - assets/user_profile/images/float-btn-5hq.png + - assets/user_profile/images/bg-ysV.png + - assets/user_profile/images/scansvgrepocom-N6T.png + + #assets of main interface + - assets/page-1/images/setting.png + - assets/page-1/images/stylelinear.png + - assets/page-1/images/vector.png + - assets/page-1/images/book-albumsvgrepocom.png + - assets/page-1/images/scansvgrepocom.png + - assets/page-1/images/vector-AHS.png + - assets/page-1/images/auto-group-ucn8.png + - assets/page-1/images/vector-8vg.png + - assets/page-1/images/assistant.png + - assets/page-1/images/vector-ax4.png + - assets/page-1/images/peperomia-obtusfolia.png + + #splash screen + - assets/splashscreen/Animation.json + - assets/splashscreen/loader.json + + #edit profile page + - assets/editProfileImages + + #introsplash + - assets/introsplash/tree.png + - assets/introsplash/chatbot.png + - assets/introsplash/teaprofile.png + + #email verification ui + - assets/emailverificationui/tick.png + + #disease not found ui + - assets/dieasenotfound/error.json + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. +uses-material-design: true +fonts: + - family: Poppins + fonts: + - asset: assets/fonts/PoppinsBold.ttf + weight: 700 + - asset: assets/fonts/PoppinsRegular.ttf + weight: 400 + - family: Red Hat Text + fonts: + - asset: assets/fonts/RedHatTextRomanLight.ttf + weight: 300 + - family: Roboto + fonts: + - asset: assets/fonts/RobotoRegular.ttf + weight: 400 + - asset: assets/fonts/RobotoRomanMedium.ttf + weight: 500 + + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test/widget_test.dart b/test/widget_test.dart index 45c46b4..d2527f1 100644 --- a/test/widget_test.dart +++ b/test/widget_test.dart @@ -1,30 +1,30 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility in the flutter_test package. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:teahub/main.dart'; - -void main() { - testWidgets('Counter increments smoke test', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(const MyApp()); - - // Verify that our counter starts at 0. - expect(find.text('0'), findsOneWidget); - expect(find.text('1'), findsNothing); - - // Tap the '+' icon and trigger a frame. - await tester.tap(find.byIcon(Icons.add)); - await tester.pump(); - - // Verify that our counter has incremented. - expect(find.text('0'), findsNothing); - expect(find.text('1'), findsOneWidget); - }); -} +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility in the flutter_test package. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:chatbotui/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(const MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/web/index.html b/web/index.html index a454ac1..e548175 100644 --- a/web/index.html +++ b/web/index.html @@ -1,59 +1,59 @@ - - - - - - - - - - - - - - - - - - - - teahub - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + chatbotui + + + + + + + + + + diff --git a/web/manifest.json b/web/manifest.json index 38b7733..bcc9719 100644 --- a/web/manifest.json +++ b/web/manifest.json @@ -1,35 +1,35 @@ -{ - "name": "teahub", - "short_name": "teahub", - "start_url": ".", - "display": "standalone", - "background_color": "#0175C2", - "theme_color": "#0175C2", - "description": "A new Flutter project.", - "orientation": "portrait-primary", - "prefer_related_applications": false, - "icons": [ - { - "src": "icons/Icon-192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "icons/Icon-512.png", - "sizes": "512x512", - "type": "image/png" - }, - { - "src": "icons/Icon-maskable-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "icons/Icon-maskable-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} +{ + "name": "chatbotui", + "short_name": "chatbotui", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/web/splash/img/dark-1x.png b/web/splash/img/dark-1x.png new file mode 100644 index 0000000..403bd0a Binary files /dev/null and b/web/splash/img/dark-1x.png differ diff --git a/web/splash/img/dark-2x.png b/web/splash/img/dark-2x.png new file mode 100644 index 0000000..81b08c7 Binary files /dev/null and b/web/splash/img/dark-2x.png differ diff --git a/web/splash/img/dark-3x.png b/web/splash/img/dark-3x.png new file mode 100644 index 0000000..f371838 Binary files /dev/null and b/web/splash/img/dark-3x.png differ diff --git a/web/splash/img/dark-4x.png b/web/splash/img/dark-4x.png new file mode 100644 index 0000000..12f6ac7 Binary files /dev/null and b/web/splash/img/dark-4x.png differ diff --git a/web/splash/img/light-1x.png b/web/splash/img/light-1x.png new file mode 100644 index 0000000..403bd0a Binary files /dev/null and b/web/splash/img/light-1x.png differ diff --git a/web/splash/img/light-2x.png b/web/splash/img/light-2x.png new file mode 100644 index 0000000..81b08c7 Binary files /dev/null and b/web/splash/img/light-2x.png differ diff --git a/web/splash/img/light-3x.png b/web/splash/img/light-3x.png new file mode 100644 index 0000000..f371838 Binary files /dev/null and b/web/splash/img/light-3x.png differ diff --git a/web/splash/img/light-4x.png b/web/splash/img/light-4x.png new file mode 100644 index 0000000..12f6ac7 Binary files /dev/null and b/web/splash/img/light-4x.png differ diff --git a/windows/CMakeLists.txt b/windows/CMakeLists.txt index 8d619da..6f12f93 100644 --- a/windows/CMakeLists.txt +++ b/windows/CMakeLists.txt @@ -1,108 +1,108 @@ -# Project-level configuration. -cmake_minimum_required(VERSION 3.14) -project(teahub LANGUAGES CXX) - -# The name of the executable created for the application. Change this to change -# the on-disk name of your application. -set(BINARY_NAME "teahub") - -# Explicitly opt in to modern CMake behaviors to avoid warnings with recent -# versions of CMake. -cmake_policy(VERSION 3.14...3.25) - -# Define build configuration option. -get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) -if(IS_MULTICONFIG) - set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" - CACHE STRING "" FORCE) -else() - if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE "Debug" CACHE - STRING "Flutter build mode" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS - "Debug" "Profile" "Release") - endif() -endif() -# Define settings for the Profile build mode. -set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") -set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") -set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") - -# Use Unicode for all projects. -add_definitions(-DUNICODE -D_UNICODE) - -# Compilation settings that should be applied to most targets. -# -# Be cautious about adding new options here, as plugins use this function by -# default. In most cases, you should add new options to specific targets instead -# of modifying this function. -function(APPLY_STANDARD_SETTINGS TARGET) - target_compile_features(${TARGET} PUBLIC cxx_std_17) - target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") - target_compile_options(${TARGET} PRIVATE /EHsc) - target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") - target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") -endfunction() - -# Flutter library and tool build rules. -set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") -add_subdirectory(${FLUTTER_MANAGED_DIR}) - -# Application build; see runner/CMakeLists.txt. -add_subdirectory("runner") - - -# Generated plugin build rules, which manage building the plugins and adding -# them to the application. -include(flutter/generated_plugins.cmake) - - -# === Installation === -# Support files are copied into place next to the executable, so that it can -# run in place. This is done instead of making a separate bundle (as on Linux) -# so that building and running from within Visual Studio will work. -set(BUILD_BUNDLE_DIR "$") -# Make the "install" step default, as it's required to run. -set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) -if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) -endif() - -set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") -set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") - -install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - COMPONENT Runtime) - -install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -if(PLUGIN_BUNDLED_LIBRARIES) - install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) -endif() - -# Copy the native assets provided by the build.dart from all packages. -set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") -install(DIRECTORY "${NATIVE_ASSETS_DIR}" - DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - -# Fully re-copy the assets directory on each build to avoid having stale files -# from a previous install. -set(FLUTTER_ASSET_DIR_NAME "flutter_assets") -install(CODE " - file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") - " COMPONENT Runtime) -install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" - DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) - -# Install the AOT library on non-Debug builds only. -install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" - CONFIGURATIONS Profile;Release - COMPONENT Runtime) +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(chatbotui LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "chatbotui") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/windows/flutter/CMakeLists.txt b/windows/flutter/CMakeLists.txt index 903f489..efb62eb 100644 --- a/windows/flutter/CMakeLists.txt +++ b/windows/flutter/CMakeLists.txt @@ -1,109 +1,109 @@ -# This file controls Flutter-level build steps. It should not be edited. -cmake_minimum_required(VERSION 3.14) - -set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") - -# Configuration provided via flutter tool. -include(${EPHEMERAL_DIR}/generated_config.cmake) - -# TODO: Move the rest of this into files in ephemeral. See -# https://github.com/flutter/flutter/issues/57146. -set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") - -# Set fallback configurations for older versions of the flutter tool. -if (NOT DEFINED FLUTTER_TARGET_PLATFORM) - set(FLUTTER_TARGET_PLATFORM "windows-x64") -endif() - -# === Flutter Library === -set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") - -# Published to parent scope for install step. -set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) -set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) -set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) -set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) - -list(APPEND FLUTTER_LIBRARY_HEADERS - "flutter_export.h" - "flutter_windows.h" - "flutter_messenger.h" - "flutter_plugin_registrar.h" - "flutter_texture_registrar.h" -) -list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") -add_library(flutter INTERFACE) -target_include_directories(flutter INTERFACE - "${EPHEMERAL_DIR}" -) -target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") -add_dependencies(flutter flutter_assemble) - -# === Wrapper === -list(APPEND CPP_WRAPPER_SOURCES_CORE - "core_implementations.cc" - "standard_codec.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_PLUGIN - "plugin_registrar.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") -list(APPEND CPP_WRAPPER_SOURCES_APP - "flutter_engine.cc" - "flutter_view_controller.cc" -) -list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") - -# Wrapper sources needed for a plugin. -add_library(flutter_wrapper_plugin STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} -) -apply_standard_settings(flutter_wrapper_plugin) -set_target_properties(flutter_wrapper_plugin PROPERTIES - POSITION_INDEPENDENT_CODE ON) -set_target_properties(flutter_wrapper_plugin PROPERTIES - CXX_VISIBILITY_PRESET hidden) -target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) -target_include_directories(flutter_wrapper_plugin PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_plugin flutter_assemble) - -# Wrapper sources needed for the runner. -add_library(flutter_wrapper_app STATIC - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_APP} -) -apply_standard_settings(flutter_wrapper_app) -target_link_libraries(flutter_wrapper_app PUBLIC flutter) -target_include_directories(flutter_wrapper_app PUBLIC - "${WRAPPER_ROOT}/include" -) -add_dependencies(flutter_wrapper_app flutter_assemble) - -# === Flutter tool backend === -# _phony_ is a non-existent file to force this command to run every time, -# since currently there's no way to get a full input/output list from the -# flutter tool. -set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") -set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) -add_custom_command( - OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} - ${PHONY_OUTPUT} - COMMAND ${CMAKE_COMMAND} -E env - ${FLUTTER_TOOL_ENVIRONMENT} - "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" - ${FLUTTER_TARGET_PLATFORM} $ - VERBATIM -) -add_custom_target(flutter_assemble DEPENDS - "${FLUTTER_LIBRARY}" - ${FLUTTER_LIBRARY_HEADERS} - ${CPP_WRAPPER_SOURCES_CORE} - ${CPP_WRAPPER_SOURCES_PLUGIN} - ${CPP_WRAPPER_SOURCES_APP} -) +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index d141b74..c3a8bf8 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,12 +6,24 @@ #include "generated_plugin_registrant.h" +#include #include #include +#include +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); FirebaseAuthPluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseAuthPluginCApi")); FirebaseCorePluginCApiRegisterWithRegistrar( registry->GetRegistrarForPlugin("FirebaseCorePluginCApi")); + FlutterSecureStorageWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FlutterSecureStorageWindowsPlugin")); + GeolocatorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("GeolocatorWindows")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 29944d5..72507a4 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,8 +3,12 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows firebase_auth firebase_core + flutter_secure_storage_windows + geolocator_windows + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/windows/runner/CMakeLists.txt b/windows/runner/CMakeLists.txt index 394917c..2041a04 100644 --- a/windows/runner/CMakeLists.txt +++ b/windows/runner/CMakeLists.txt @@ -1,40 +1,40 @@ -cmake_minimum_required(VERSION 3.14) -project(runner LANGUAGES CXX) - -# Define the application target. To change its name, change BINARY_NAME in the -# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer -# work. -# -# Any new source files that you add to the application should be added here. -add_executable(${BINARY_NAME} WIN32 - "flutter_window.cpp" - "main.cpp" - "utils.cpp" - "win32_window.cpp" - "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" - "Runner.rc" - "runner.exe.manifest" -) - -# Apply the standard set of build settings. This can be removed for applications -# that need different build settings. -apply_standard_settings(${BINARY_NAME}) - -# Add preprocessor definitions for the build version. -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") -target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") - -# Disable Windows macros that collide with C++ standard library functions. -target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") - -# Add dependency libraries and include directories. Add any application-specific -# dependencies here. -target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) -target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") -target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") - -# Run the Flutter tool portions of the build. This must not be removed. -add_dependencies(${BINARY_NAME} flutter_assemble) +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/windows/runner/Runner.rc b/windows/runner/Runner.rc index 105fdfa..e4ce40b 100644 --- a/windows/runner/Runner.rc +++ b/windows/runner/Runner.rc @@ -1,121 +1,121 @@ -// Microsoft Visual C++ generated resource script. -// -#pragma code_page(65001) -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "winres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""winres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_APP_ICON ICON "resources\\app_icon.ico" - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) -#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD -#else -#define VERSION_AS_NUMBER 1,0,0,0 -#endif - -#if defined(FLUTTER_VERSION) -#define VERSION_AS_STRING FLUTTER_VERSION -#else -#define VERSION_AS_STRING "1.0.0" -#endif - -VS_VERSION_INFO VERSIONINFO - FILEVERSION VERSION_AS_NUMBER - PRODUCTVERSION VERSION_AS_NUMBER - FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG - FILEFLAGS VS_FF_DEBUG -#else - FILEFLAGS 0x0L -#endif - FILEOS VOS__WINDOWS32 - FILETYPE VFT_APP - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904e4" - BEGIN - VALUE "CompanyName", "com.example" "\0" - VALUE "FileDescription", "teahub" "\0" - VALUE "FileVersion", VERSION_AS_STRING "\0" - VALUE "InternalName", "teahub" "\0" - VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" - VALUE "OriginalFilename", "teahub.exe" "\0" - VALUE "ProductName", "teahub" "\0" - VALUE "ProductVersion", VERSION_AS_STRING "\0" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1252 - END -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "com.example" "\0" + VALUE "FileDescription", "chatbotui" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "chatbotui" "\0" + VALUE "LegalCopyright", "Copyright (C) 2024 com.example. All rights reserved." "\0" + VALUE "OriginalFilename", "chatbotui.exe" "\0" + VALUE "ProductName", "chatbotui" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/windows/runner/flutter_window.cpp b/windows/runner/flutter_window.cpp index 955ee30..c819cb0 100644 --- a/windows/runner/flutter_window.cpp +++ b/windows/runner/flutter_window.cpp @@ -1,71 +1,71 @@ -#include "flutter_window.h" - -#include - -#include "flutter/generated_plugin_registrant.h" - -FlutterWindow::FlutterWindow(const flutter::DartProject& project) - : project_(project) {} - -FlutterWindow::~FlutterWindow() {} - -bool FlutterWindow::OnCreate() { - if (!Win32Window::OnCreate()) { - return false; - } - - RECT frame = GetClientArea(); - - // The size here must match the window dimensions to avoid unnecessary surface - // creation / destruction in the startup path. - flutter_controller_ = std::make_unique( - frame.right - frame.left, frame.bottom - frame.top, project_); - // Ensure that basic setup of the controller was successful. - if (!flutter_controller_->engine() || !flutter_controller_->view()) { - return false; - } - RegisterPlugins(flutter_controller_->engine()); - SetChildContent(flutter_controller_->view()->GetNativeWindow()); - - flutter_controller_->engine()->SetNextFrameCallback([&]() { - this->Show(); - }); - - // Flutter can complete the first frame before the "show window" callback is - // registered. The following call ensures a frame is pending to ensure the - // window is shown. It is a no-op if the first frame hasn't completed yet. - flutter_controller_->ForceRedraw(); - - return true; -} - -void FlutterWindow::OnDestroy() { - if (flutter_controller_) { - flutter_controller_ = nullptr; - } - - Win32Window::OnDestroy(); -} - -LRESULT -FlutterWindow::MessageHandler(HWND hwnd, UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - // Give Flutter, including plugins, an opportunity to handle window messages. - if (flutter_controller_) { - std::optional result = - flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, - lparam); - if (result) { - return *result; - } - } - - switch (message) { - case WM_FONTCHANGE: - flutter_controller_->engine()->ReloadSystemFonts(); - break; - } - - return Win32Window::MessageHandler(hwnd, message, wparam, lparam); -} +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/windows/runner/flutter_window.h b/windows/runner/flutter_window.h index 6da0652..28c2383 100644 --- a/windows/runner/flutter_window.h +++ b/windows/runner/flutter_window.h @@ -1,33 +1,33 @@ -#ifndef RUNNER_FLUTTER_WINDOW_H_ -#define RUNNER_FLUTTER_WINDOW_H_ - -#include -#include - -#include - -#include "win32_window.h" - -// A window that does nothing but host a Flutter view. -class FlutterWindow : public Win32Window { - public: - // Creates a new FlutterWindow hosting a Flutter view running |project|. - explicit FlutterWindow(const flutter::DartProject& project); - virtual ~FlutterWindow(); - - protected: - // Win32Window: - bool OnCreate() override; - void OnDestroy() override; - LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, - LPARAM const lparam) noexcept override; - - private: - // The project to run. - flutter::DartProject project_; - - // The Flutter instance hosted by this window. - std::unique_ptr flutter_controller_; -}; - -#endif // RUNNER_FLUTTER_WINDOW_H_ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/windows/runner/main.cpp b/windows/runner/main.cpp index 4dbc7d7..4cc4a97 100644 --- a/windows/runner/main.cpp +++ b/windows/runner/main.cpp @@ -1,43 +1,43 @@ -#include -#include -#include - -#include "flutter_window.h" -#include "utils.h" - -int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, - _In_ wchar_t *command_line, _In_ int show_command) { - // Attach to console when present (e.g., 'flutter run') or create a - // new console when running with a debugger. - if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { - CreateAndAttachConsole(); - } - - // Initialize COM, so that it is available for use in the library and/or - // plugins. - ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); - - flutter::DartProject project(L"data"); - - std::vector command_line_arguments = - GetCommandLineArguments(); - - project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); - - FlutterWindow window(project); - Win32Window::Point origin(10, 10); - Win32Window::Size size(1280, 720); - if (!window.Create(L"teahub", origin, size)) { - return EXIT_FAILURE; - } - window.SetQuitOnClose(true); - - ::MSG msg; - while (::GetMessage(&msg, nullptr, 0, 0)) { - ::TranslateMessage(&msg); - ::DispatchMessage(&msg); - } - - ::CoUninitialize(); - return EXIT_SUCCESS; -} +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"chatbotui", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/windows/runner/resource.h b/windows/runner/resource.h index 66a65d1..ddc7f3e 100644 --- a/windows/runner/resource.h +++ b/windows/runner/resource.h @@ -1,16 +1,16 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by Runner.rc -// -#define IDI_APP_ICON 101 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 102 -#define _APS_NEXT_COMMAND_VALUE 40001 -#define _APS_NEXT_CONTROL_VALUE 1001 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/windows/runner/runner.exe.manifest b/windows/runner/runner.exe.manifest index a42ea76..157e871 100644 --- a/windows/runner/runner.exe.manifest +++ b/windows/runner/runner.exe.manifest @@ -1,20 +1,20 @@ - - - - - PerMonitorV2 - - - - - - - - - - - - - - - + + + + + PerMonitorV2 + + + + + + + + + + + + + + + diff --git a/windows/runner/utils.cpp b/windows/runner/utils.cpp index b2b0873..fc55c57 100644 --- a/windows/runner/utils.cpp +++ b/windows/runner/utils.cpp @@ -1,65 +1,65 @@ -#include "utils.h" - -#include -#include -#include -#include - -#include - -void CreateAndAttachConsole() { - if (::AllocConsole()) { - FILE *unused; - if (freopen_s(&unused, "CONOUT$", "w", stdout)) { - _dup2(_fileno(stdout), 1); - } - if (freopen_s(&unused, "CONOUT$", "w", stderr)) { - _dup2(_fileno(stdout), 2); - } - std::ios::sync_with_stdio(); - FlutterDesktopResyncOutputStreams(); - } -} - -std::vector GetCommandLineArguments() { - // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. - int argc; - wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); - if (argv == nullptr) { - return std::vector(); - } - - std::vector command_line_arguments; - - // Skip the first argument as it's the binary name. - for (int i = 1; i < argc; i++) { - command_line_arguments.push_back(Utf8FromUtf16(argv[i])); - } - - ::LocalFree(argv); - - return command_line_arguments; -} - -std::string Utf8FromUtf16(const wchar_t* utf16_string) { - if (utf16_string == nullptr) { - return std::string(); - } - int target_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - -1, nullptr, 0, nullptr, nullptr) - -1; // remove the trailing null character - int input_length = (int)wcslen(utf16_string); - std::string utf8_string; - if (target_length <= 0 || target_length > utf8_string.max_size()) { - return utf8_string; - } - utf8_string.resize(target_length); - int converted_length = ::WideCharToMultiByte( - CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, - input_length, utf8_string.data(), target_length, nullptr, nullptr); - if (converted_length == 0) { - return std::string(); - } - return utf8_string; -} +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length <= 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/windows/runner/utils.h b/windows/runner/utils.h index 3879d54..3f0e05c 100644 --- a/windows/runner/utils.h +++ b/windows/runner/utils.h @@ -1,19 +1,19 @@ -#ifndef RUNNER_UTILS_H_ -#define RUNNER_UTILS_H_ - -#include -#include - -// Creates a console for the process, and redirects stdout and stderr to -// it for both the runner and the Flutter library. -void CreateAndAttachConsole(); - -// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string -// encoded in UTF-8. Returns an empty std::string on failure. -std::string Utf8FromUtf16(const wchar_t* utf16_string); - -// Gets the command line arguments passed in as a std::vector, -// encoded in UTF-8. Returns an empty std::vector on failure. -std::vector GetCommandLineArguments(); - -#endif // RUNNER_UTILS_H_ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/windows/runner/win32_window.cpp b/windows/runner/win32_window.cpp index 60608d0..b5ba2a0 100644 --- a/windows/runner/win32_window.cpp +++ b/windows/runner/win32_window.cpp @@ -1,288 +1,288 @@ -#include "win32_window.h" - -#include -#include - -#include "resource.h" - -namespace { - -/// Window attribute that enables dark mode window decorations. -/// -/// Redefined in case the developer's machine has a Windows SDK older than -/// version 10.0.22000.0. -/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute -#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE -#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 -#endif - -constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; - -/// Registry key for app theme preference. -/// -/// A value of 0 indicates apps should use dark mode. A non-zero or missing -/// value indicates apps should use light mode. -constexpr const wchar_t kGetPreferredBrightnessRegKey[] = - L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; -constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; - -// The number of Win32Window objects that currently exist. -static int g_active_window_count = 0; - -using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); - -// Scale helper to convert logical scaler values to physical using passed in -// scale factor -int Scale(int source, double scale_factor) { - return static_cast(source * scale_factor); -} - -// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. -// This API is only needed for PerMonitor V1 awareness mode. -void EnableFullDpiSupportIfAvailable(HWND hwnd) { - HMODULE user32_module = LoadLibraryA("User32.dll"); - if (!user32_module) { - return; - } - auto enable_non_client_dpi_scaling = - reinterpret_cast( - GetProcAddress(user32_module, "EnableNonClientDpiScaling")); - if (enable_non_client_dpi_scaling != nullptr) { - enable_non_client_dpi_scaling(hwnd); - } - FreeLibrary(user32_module); -} - -} // namespace - -// Manages the Win32Window's window class registration. -class WindowClassRegistrar { - public: - ~WindowClassRegistrar() = default; - - // Returns the singleton registrar instance. - static WindowClassRegistrar* GetInstance() { - if (!instance_) { - instance_ = new WindowClassRegistrar(); - } - return instance_; - } - - // Returns the name of the window class, registering the class if it hasn't - // previously been registered. - const wchar_t* GetWindowClass(); - - // Unregisters the window class. Should only be called if there are no - // instances of the window. - void UnregisterWindowClass(); - - private: - WindowClassRegistrar() = default; - - static WindowClassRegistrar* instance_; - - bool class_registered_ = false; -}; - -WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; - -const wchar_t* WindowClassRegistrar::GetWindowClass() { - if (!class_registered_) { - WNDCLASS window_class{}; - window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); - window_class.lpszClassName = kWindowClassName; - window_class.style = CS_HREDRAW | CS_VREDRAW; - window_class.cbClsExtra = 0; - window_class.cbWndExtra = 0; - window_class.hInstance = GetModuleHandle(nullptr); - window_class.hIcon = - LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); - window_class.hbrBackground = 0; - window_class.lpszMenuName = nullptr; - window_class.lpfnWndProc = Win32Window::WndProc; - RegisterClass(&window_class); - class_registered_ = true; - } - return kWindowClassName; -} - -void WindowClassRegistrar::UnregisterWindowClass() { - UnregisterClass(kWindowClassName, nullptr); - class_registered_ = false; -} - -Win32Window::Win32Window() { - ++g_active_window_count; -} - -Win32Window::~Win32Window() { - --g_active_window_count; - Destroy(); -} - -bool Win32Window::Create(const std::wstring& title, - const Point& origin, - const Size& size) { - Destroy(); - - const wchar_t* window_class = - WindowClassRegistrar::GetInstance()->GetWindowClass(); - - const POINT target_point = {static_cast(origin.x), - static_cast(origin.y)}; - HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); - UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); - double scale_factor = dpi / 96.0; - - HWND window = CreateWindow( - window_class, title.c_str(), WS_OVERLAPPEDWINDOW, - Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), - Scale(size.width, scale_factor), Scale(size.height, scale_factor), - nullptr, nullptr, GetModuleHandle(nullptr), this); - - if (!window) { - return false; - } - - UpdateTheme(window); - - return OnCreate(); -} - -bool Win32Window::Show() { - return ShowWindow(window_handle_, SW_SHOWNORMAL); -} - -// static -LRESULT CALLBACK Win32Window::WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - if (message == WM_NCCREATE) { - auto window_struct = reinterpret_cast(lparam); - SetWindowLongPtr(window, GWLP_USERDATA, - reinterpret_cast(window_struct->lpCreateParams)); - - auto that = static_cast(window_struct->lpCreateParams); - EnableFullDpiSupportIfAvailable(window); - that->window_handle_ = window; - } else if (Win32Window* that = GetThisFromHandle(window)) { - return that->MessageHandler(window, message, wparam, lparam); - } - - return DefWindowProc(window, message, wparam, lparam); -} - -LRESULT -Win32Window::MessageHandler(HWND hwnd, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept { - switch (message) { - case WM_DESTROY: - window_handle_ = nullptr; - Destroy(); - if (quit_on_close_) { - PostQuitMessage(0); - } - return 0; - - case WM_DPICHANGED: { - auto newRectSize = reinterpret_cast(lparam); - LONG newWidth = newRectSize->right - newRectSize->left; - LONG newHeight = newRectSize->bottom - newRectSize->top; - - SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, - newHeight, SWP_NOZORDER | SWP_NOACTIVATE); - - return 0; - } - case WM_SIZE: { - RECT rect = GetClientArea(); - if (child_content_ != nullptr) { - // Size and position the child window. - MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, - rect.bottom - rect.top, TRUE); - } - return 0; - } - - case WM_ACTIVATE: - if (child_content_ != nullptr) { - SetFocus(child_content_); - } - return 0; - - case WM_DWMCOLORIZATIONCOLORCHANGED: - UpdateTheme(hwnd); - return 0; - } - - return DefWindowProc(window_handle_, message, wparam, lparam); -} - -void Win32Window::Destroy() { - OnDestroy(); - - if (window_handle_) { - DestroyWindow(window_handle_); - window_handle_ = nullptr; - } - if (g_active_window_count == 0) { - WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); - } -} - -Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { - return reinterpret_cast( - GetWindowLongPtr(window, GWLP_USERDATA)); -} - -void Win32Window::SetChildContent(HWND content) { - child_content_ = content; - SetParent(content, window_handle_); - RECT frame = GetClientArea(); - - MoveWindow(content, frame.left, frame.top, frame.right - frame.left, - frame.bottom - frame.top, true); - - SetFocus(child_content_); -} - -RECT Win32Window::GetClientArea() { - RECT frame; - GetClientRect(window_handle_, &frame); - return frame; -} - -HWND Win32Window::GetHandle() { - return window_handle_; -} - -void Win32Window::SetQuitOnClose(bool quit_on_close) { - quit_on_close_ = quit_on_close; -} - -bool Win32Window::OnCreate() { - // No-op; provided for subclasses. - return true; -} - -void Win32Window::OnDestroy() { - // No-op; provided for subclasses. -} - -void Win32Window::UpdateTheme(HWND const window) { - DWORD light_mode; - DWORD light_mode_size = sizeof(light_mode); - LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, - kGetPreferredBrightnessRegValue, - RRF_RT_REG_DWORD, nullptr, &light_mode, - &light_mode_size); - - if (result == ERROR_SUCCESS) { - BOOL enable_dark_mode = light_mode == 0; - DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, - &enable_dark_mode, sizeof(enable_dark_mode)); - } -} +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/windows/runner/win32_window.h b/windows/runner/win32_window.h index e901dde..49b847f 100644 --- a/windows/runner/win32_window.h +++ b/windows/runner/win32_window.h @@ -1,102 +1,102 @@ -#ifndef RUNNER_WIN32_WINDOW_H_ -#define RUNNER_WIN32_WINDOW_H_ - -#include - -#include -#include -#include - -// A class abstraction for a high DPI-aware Win32 Window. Intended to be -// inherited from by classes that wish to specialize with custom -// rendering and input handling -class Win32Window { - public: - struct Point { - unsigned int x; - unsigned int y; - Point(unsigned int x, unsigned int y) : x(x), y(y) {} - }; - - struct Size { - unsigned int width; - unsigned int height; - Size(unsigned int width, unsigned int height) - : width(width), height(height) {} - }; - - Win32Window(); - virtual ~Win32Window(); - - // Creates a win32 window with |title| that is positioned and sized using - // |origin| and |size|. New windows are created on the default monitor. Window - // sizes are specified to the OS in physical pixels, hence to ensure a - // consistent size this function will scale the inputted width and height as - // as appropriate for the default monitor. The window is invisible until - // |Show| is called. Returns true if the window was created successfully. - bool Create(const std::wstring& title, const Point& origin, const Size& size); - - // Show the current window. Returns true if the window was successfully shown. - bool Show(); - - // Release OS resources associated with window. - void Destroy(); - - // Inserts |content| into the window tree. - void SetChildContent(HWND content); - - // Returns the backing Window handle to enable clients to set icon and other - // window properties. Returns nullptr if the window has been destroyed. - HWND GetHandle(); - - // If true, closing this window will quit the application. - void SetQuitOnClose(bool quit_on_close); - - // Return a RECT representing the bounds of the current client area. - RECT GetClientArea(); - - protected: - // Processes and route salient window messages for mouse handling, - // size change and DPI. Delegates handling of these to member overloads that - // inheriting classes can handle. - virtual LRESULT MessageHandler(HWND window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Called when CreateAndShow is called, allowing subclass window-related - // setup. Subclasses should return false if setup fails. - virtual bool OnCreate(); - - // Called when Destroy is called. - virtual void OnDestroy(); - - private: - friend class WindowClassRegistrar; - - // OS callback called by message pump. Handles the WM_NCCREATE message which - // is passed when the non-client area is being created and enables automatic - // non-client DPI scaling so that the non-client area automatically - // responds to changes in DPI. All other messages are handled by - // MessageHandler. - static LRESULT CALLBACK WndProc(HWND const window, - UINT const message, - WPARAM const wparam, - LPARAM const lparam) noexcept; - - // Retrieves a class instance pointer for |window| - static Win32Window* GetThisFromHandle(HWND const window) noexcept; - - // Update the window frame's theme to match the system theme. - static void UpdateTheme(HWND const window); - - bool quit_on_close_ = false; - - // window handle for top level window. - HWND window_handle_ = nullptr; - - // window handle for hosted content. - HWND child_content_ = nullptr; -}; - -#endif // RUNNER_WIN32_WINDOW_H_ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_