Add base interactive layout "rive" whit animation

This commit is contained in:
paoloGuagnano
2024-03-08 12:15:47 +01:00
parent 06336bd3d9
commit 2d5fba8897
58 changed files with 1946 additions and 133 deletions

View File

@@ -9,5 +9,7 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Dart SDK" level="project" />
<orderEntry type="library" name="Dart Packages" level="project" />
</component>
</module>

228
.idea/libraries/Dart_Packages.xml generated Normal file
View File

@@ -0,0 +1,228 @@
<component name="libraryTable">
<library name="Dart Packages" type="DartPackagesLibraryType">
<properties>
<option name="packageNameToDirsMap">
<entry key="async">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/async-2.11.0/lib" />
</list>
</value>
</entry>
<entry key="boolean_selector">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib" />
</list>
</value>
</entry>
<entry key="characters">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/characters-1.3.0/lib" />
</list>
</value>
</entry>
<entry key="clock">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/clock-1.1.1/lib" />
</list>
</value>
</entry>
<entry key="collection">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/collection-1.18.0/lib" />
</list>
</value>
</entry>
<entry key="cupertino_icons">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/lib" />
</list>
</value>
</entry>
<entry key="fake_async">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/fake_async-1.3.1/lib" />
</list>
</value>
</entry>
<entry key="flutter">
<value>
<list>
<option value="/opt/flutter/packages/flutter/lib" />
</list>
</value>
</entry>
<entry key="flutter_lints">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_lints-3.0.1/lib" />
</list>
</value>
</entry>
<entry key="flutter_test">
<value>
<list>
<option value="/opt/flutter/packages/flutter_test/lib" />
</list>
</value>
</entry>
<entry key="leak_tracker">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib" />
</list>
</value>
</entry>
<entry key="leak_tracker_flutter_testing">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/lib" />
</list>
</value>
</entry>
<entry key="leak_tracker_testing">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/leak_tracker_testing-2.0.1/lib" />
</list>
</value>
</entry>
<entry key="lints">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/lints-3.0.0/lib" />
</list>
</value>
</entry>
<entry key="matcher">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib" />
</list>
</value>
</entry>
<entry key="material_color_utilities">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib" />
</list>
</value>
</entry>
<entry key="meta">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/meta-1.11.0/lib" />
</list>
</value>
</entry>
<entry key="path">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/path-1.9.0/lib" />
</list>
</value>
</entry>
<entry key="sky_engine">
<value>
<list>
<option value="/opt/flutter/bin/cache/pkg/sky_engine/lib" />
</list>
</value>
</entry>
<entry key="source_span">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib" />
</list>
</value>
</entry>
<entry key="stack_trace">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib" />
</list>
</value>
</entry>
<entry key="stream_channel">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib" />
</list>
</value>
</entry>
<entry key="string_scanner">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib" />
</list>
</value>
</entry>
<entry key="term_glyph">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib" />
</list>
</value>
</entry>
<entry key="test_api">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib" />
</list>
</value>
</entry>
<entry key="vector_math">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib" />
</list>
</value>
</entry>
<entry key="vm_service">
<value>
<list>
<option value="$USER_HOME$/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib" />
</list>
</value>
</entry>
</option>
</properties>
<CLASSES>
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/async-2.11.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/boolean_selector-2.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/characters-1.3.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/clock-1.1.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/collection-1.18.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.6/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/fake_async-1.3.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/flutter_lints-3.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/leak_tracker-10.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/leak_tracker_flutter_testing-2.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/leak_tracker_testing-2.0.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/lints-3.0.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/matcher-0.12.16+1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/material_color_utilities-0.8.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/meta-1.11.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/path-1.9.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/source_span-1.10.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/stack_trace-1.11.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/stream_channel-2.1.2/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/string_scanner-1.2.0/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/term_glyph-1.2.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/test_api-0.6.1/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/vector_math-2.1.4/lib" />
<root url="file://$USER_HOME$/.pub-cache/hosted/pub.dev/vm_service-13.0.0/lib" />
<root url="file:///opt/flutter/bin/cache/pkg/sky_engine/lib" />
<root url="file:///opt/flutter/packages/flutter/lib" />
<root url="file:///opt/flutter/packages/flutter_test/lib" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

29
.idea/libraries/Dart_SDK.xml generated Normal file
View File

@@ -0,0 +1,29 @@
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/async" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/cli" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/collection" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/convert" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/core" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/developer" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/ffi" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/html" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/io" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/isolate" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js_interop" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js_interop_unsafe" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/js_util" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/math" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/mirrors" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/svg" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file:///opt/flutter/bin/cache/dart-sdk/lib/web_gl" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

3
.idea/misc.xml generated
View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager">
<component name="ProjectRootManager" version="2" languageLevel="JDK_20" project-jdk-name="Android API 34, extension level 7 Platform" project-jdk-type="Android SDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@@ -23,4 +23,4 @@ plugins {
id "org.jetbrains.kotlin.android" version "1.7.10" apply false
}
include ":app"

Binary file not shown.

After

Width:  |  Height:  |  Size: 199 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1,5 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g style="mix-blend-mode:overlay">
<path fill-rule="evenodd" clip-rule="evenodd" d="M15.4243 5.57573C15.1899 5.34142 14.81 5.34142 14.5757 5.57573C14.3414 5.81004 14.3414 6.18994 14.5757 6.42426L19.5515 11.4H2.99999C2.66862 11.4 2.39999 11.6686 2.39999 12C2.39999 12.3314 2.66862 12.6 2.99999 12.6H19.5515L14.5757 17.5757C14.3414 17.81 14.3414 18.1899 14.5757 18.4243C14.81 18.6586 15.1899 18.6586 15.4243 18.4243L21.4243 12.4243C21.4818 12.3667 21.5252 12.3004 21.5545 12.2297C21.5838 12.1589 21.6 12.0813 21.6 12C21.6 11.9186 21.5838 11.8411 21.5545 11.7703C21.5252 11.6996 21.4818 11.6333 21.4243 11.5757L15.4243 5.57573Z" fill="black"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 749 B

View File

@@ -0,0 +1,4 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12 11C14.4853 11 16.5 8.98528 16.5 6.5C16.5 4.01472 14.4853 2 12 2C9.51472 2 7.5 4.01472 7.5 6.5C7.5 8.98528 9.51472 11 12 11Z" fill="black" fill-opacity="0.5"/>
<path d="M19 22H5C3.9 22 3 21.1 3 20C3 16.69 5.69 14 9 14H15C18.31 14 21 16.69 21 20C21 21.1 20.1 22 19 22Z" fill="black" fill-opacity="0.7"/>
</svg>

After

Width:  |  Height:  |  Size: 418 B

View File

@@ -0,0 +1,5 @@
<svg width="64" height="70" viewBox="0 0 64 70" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M38 4.1547C34.2872 2.01111 29.7128 2.01111 26 4.1547L8.28719 14.3812C4.57437 16.5248 2.28719 20.4863 2.28719 24.7735V45.2265C2.28719 49.5137 4.57437 53.4752 8.28719 55.6188L26 65.8453C29.7128 67.9889 34.2872 67.9889 38 65.8453L55.7128 55.6188C59.4256 53.4752 61.7128 49.5137 61.7128 45.2265V24.7735C61.7128 20.4863 59.4256 16.5248 55.7128 14.3812L38 4.1547Z" fill="black" stroke="white" stroke-width="4"/>
<path d="M43.985 32.4751C42.9207 30.6704 39.8026 29 37.9438 29C35.4853 29 34.451 30.4915 32.757 30.4915C31.0031 30.4915 29.3991 29.0895 27.2854 29.0895C24.3923 29.1044 20 31.7592 20 38.0085C20 43.6909 25.1868 49.9999 28.1249 49.9999C29.9088 50.0148 30.3435 48.8813 32.757 48.8813C35.1705 48.8663 35.6952 50.0148 37.4791 49.9999C39.4878 49.9849 41.0468 47.7925 42.2011 46.0624C43.0256 44.8245 43.3554 44.1831 44 42.7812C39.263 41.6029 38.3186 34.0412 43.985 32.4751Z" stroke="white" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M36.9006 24.395C37.95 23.255 38.7295 21.65 38.4447 20C36.7357 20.105 34.7869 21.05 33.6177 22.25C32.5683 23.345 31.7439 24.98 32.0736 26.555C33.9325 26.6 35.7913 25.625 36.9006 24.395Z" stroke="white" stroke-width="2" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -0,0 +1,6 @@
<svg width="48" height="50" viewBox="0 0 48 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M30 4.1547C26.2872 2.01111 21.7128 2.01111 18 4.1547L8.94744 9.3812C5.23463 11.5248 2.94744 15.4863 2.94744 19.7735V30.2265C2.94744 34.5137 5.23463 38.4752 8.94744 40.6188L18 45.8453C21.7128 47.9889 26.2872 47.9889 30 45.8453L39.0526 40.6188C42.7654 38.4752 45.0526 34.5137 45.0526 30.2265V19.7735C45.0526 15.4863 42.7654 11.5248 39.0526 9.3812L30 4.1547Z" fill="#3789FF" stroke="#76AEFF" stroke-width="4"/>
<g style="mix-blend-mode:overlay">
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.7 19.7L29.29 15.29C29.11 15.11 28.85 15 28.59 15H15C14.45 15 14 15.45 14 16V34C14 34.55 14.45 35 15 35H33C33.55 35 34 34.55 34 34V20.41C34 20.15 33.89 19.89 33.7 19.7ZM26.0252 19.4362C26.3366 19.5495 26.4971 19.8938 26.3838 20.2052L22.7438 30.2052C22.6304 30.5166 22.2861 30.6772 21.9747 30.5638C21.6633 30.4505 21.5028 30.1062 21.6161 29.7948L25.2561 19.7948C25.3695 19.4834 25.7138 19.3229 26.0252 19.4362ZM20.4243 22.4243C20.6586 22.19 20.6586 21.8101 20.4243 21.5757C20.19 21.3414 19.8101 21.3414 19.5758 21.5757L16.5758 24.5757C16.3414 24.8101 16.3414 25.19 16.5758 25.4243L19.5758 28.4243C19.8101 28.6586 20.19 28.6586 20.4243 28.4243C20.6586 28.19 20.6586 27.8101 20.4243 27.5757L17.8486 25L20.4243 22.4243ZM28.4243 21.5757C28.19 21.3414 27.8101 21.3414 27.5758 21.5757C27.3414 21.8101 27.3414 22.19 27.5758 22.4243L30.1515 25L27.5758 27.5757C27.3414 27.8101 27.3414 28.19 27.5758 28.4243C27.8101 28.6586 28.19 28.6586 28.4243 28.4243L31.4243 25.4243C31.6586 25.19 31.6586 24.8101 31.4243 24.5757L28.4243 21.5757Z" fill="black"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,7 @@
<svg width="38" height="40" viewBox="0 0 38 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.75 3.01036C20.8107 1.31335 17.1893 1.31335 14.25 3.01036L6.66154 7.39156C3.72223 9.08857 1.91154 12.2248 1.91154 15.6188V24.3812C1.91154 27.7752 3.72223 30.9114 6.66154 32.6084L14.25 36.9896C17.1893 38.6867 20.8107 38.6866 23.75 36.9896L31.3385 32.6084C34.2778 30.9114 36.0885 27.7752 36.0885 24.3812V15.6188C36.0885 12.2248 34.2778 9.08857 31.3385 7.39156L23.75 3.01036Z" fill="#FFC5C8" stroke="#FFEDEE" stroke-width="3"/>
<g style="mix-blend-mode:overlay">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.6667 18.1012V25H27.3333V18.1012L19.6575 23.1288L19 23.5595L18.3425 23.1288L10.6667 18.1012ZM26.1333 15H19H11.8667V16.0182L19 20.6905L26.1333 16.0182V15Z" fill="black"/>
<path d="M10.6667 15V16.6667L19 22.125L27.3333 16.6667V15H10.6667Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 885 B

View File

@@ -0,0 +1,4 @@
<svg width="64" height="70" viewBox="0 0 64 70" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M38 4.1547C34.2872 2.01111 29.7128 2.01111 26 4.1547L8.28719 14.3812C4.57437 16.5248 2.28719 20.4863 2.28719 24.7735V45.2265C2.28719 49.5137 4.57437 53.4752 8.28719 55.6188L26 65.8453C29.7128 67.9889 34.2872 67.9889 38 65.8453L55.7128 55.6188C59.4256 53.4752 61.7128 49.5137 61.7128 45.2265V24.7735C61.7128 20.4863 59.4256 16.5248 55.7128 14.3812L38 4.1547Z" fill="white" stroke="black" stroke-width="4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17 30.4345V44H47V30.4345L32.6575 39.8288L32 40.2595L31.3425 39.8288L17 30.4345ZM45.8 26H32H18.2V28.3515L32 37.3905L45.8 28.3515V26Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 716 B

View File

@@ -0,0 +1,9 @@
<svg width="64" height="70" viewBox="0 0 64 70" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M38 4.1547C34.2872 2.01111 29.7128 2.01111 26 4.1547L8.28719 14.3812C4.57437 16.5248 2.28719 20.4863 2.28719 24.7735V45.2265C2.28719 49.5137 4.57437 53.4752 8.28719 55.6188L26 65.8453C29.7128 67.9889 34.2872 67.9889 38 65.8453L55.7128 55.6188C59.4256 53.4752 61.7128 49.5137 61.7128 45.2265V24.7735C61.7128 20.4863 59.4256 16.5248 55.7128 14.3812L38 4.1547Z" fill="#EF9699" stroke="#FFE1E2" stroke-width="4"/>
<g style="mix-blend-mode:overlay">
<path d="M19.715 43.52C18.005 41.105 17 38.18 17 35C17 32.645 17.555 30.41 18.545 28.43" stroke="black" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M32.36 35H47C47 38.03 46.175 40.865 44.705 43.205" stroke="black" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M23.57 47.3C26.06 48.995 29.105 50 32.375 50C35.705 50 38.675 48.965 41.045 47.21" stroke="black" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M21.935 23.975C24.68 21.515 28.325 20 32.36 20C35.54 20 38.51 20.945 40.955 22.55" stroke="black" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,7 @@
<svg width="48" height="50" viewBox="0 0 48 50" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M30 4.1547C26.2872 2.01111 21.7128 2.01111 18 4.1547L8.94744 9.3812C5.23463 11.5248 2.94744 15.4863 2.94744 19.7735V30.2265C2.94744 34.5137 5.23463 38.4752 8.94744 40.6188L18 45.8453C21.7128 47.9889 26.2872 47.9889 30 45.8453L39.0526 40.6188C42.7654 38.4752 45.0526 34.5137 45.0526 30.2265V19.7735C45.0526 15.4863 42.7654 11.5248 39.0526 9.3812L30 4.1547Z" fill="#F9B8D6" stroke="#FBD3E6" stroke-width="4"/>
<g style="mix-blend-mode:overlay">
<path d="M38.9548 26.215C38.2798 34.48 31.0498 40.615 22.7848 39.955C14.5348 39.28 8.3848 32.05 9.0448 23.785C9.7198 15.535 16.9498 9.38501 25.2148 10.045C33.4648 10.72 39.6148 17.965 38.9548 26.215Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.9998 18.3849C15.3312 18.3849 15.5998 18.6536 15.5998 18.9849V18.9999C15.5998 19.3313 15.3312 19.5999 14.9998 19.5999C14.6685 19.5999 14.3998 19.3313 14.3998 18.9999V18.9849C14.3998 18.6536 14.6685 18.3849 14.9998 18.3849ZM19.3637 25.4263C19.4316 24.3068 19.8342 23.3581 20.3942 22.7231C20.9526 22.09 21.6422 21.7888 22.3318 21.8617L22.3323 21.8617C23.036 21.9355 23.7003 22.3896 24.1875 23.1548C24.6735 23.9181 24.9538 24.9535 24.8859 26.0737C24.8181 27.1932 24.4155 28.1419 23.8555 28.7769C23.2971 29.41 22.6075 29.7112 21.9179 29.6383L21.9174 29.6383C21.2137 29.5645 20.5494 29.1104 20.0622 28.3453C19.5761 27.5819 19.2958 26.5466 19.3637 25.4263ZM19.4942 21.9294C20.252 21.0701 21.3024 20.5463 22.4577 20.6683C23.6138 20.7896 24.5695 21.5205 25.1997 22.5103C25.8312 23.5019 26.1659 24.7916 26.0837 26.1463C26.0016 27.5018 25.5117 28.7131 24.7555 29.5706C23.9977 30.4299 22.9475 30.9537 21.7923 30.8317C20.636 30.7105 19.6803 29.9796 19.05 28.9898C18.4185 27.9981 18.0838 26.7085 18.1659 25.3537C18.2481 23.9982 18.738 22.7869 19.4942 21.9294ZM15.5998 23.5C15.5998 23.1686 15.3312 22.9 14.9998 22.9C14.6685 22.9 14.3998 23.1686 14.3998 23.5V29.5C14.3998 29.8313 14.6685 30.1 14.9998 30.1C15.3312 30.1 15.5998 29.8313 15.5998 29.5V23.5ZM35.2229 22.8702C34.5268 21.5799 33.0147 20.4659 31.3663 20.6696L31.3654 20.6697C30.127 20.8245 28.7141 21.6793 28.4215 23.1424L28.4211 23.1442C28.2925 23.7983 28.489 24.3562 28.81 24.7917C29.1187 25.2105 29.5465 25.5251 29.9299 25.7538C30.3941 26.0368 30.9646 26.2308 31.4578 26.3986L31.4579 26.3986C31.6094 26.4501 31.7537 26.4992 31.8853 26.5476C32.5049 26.7754 32.9532 27.013 33.2312 27.4032L33.2329 27.4056C33.5746 27.8802 33.5102 28.4371 33.0456 28.8908L33.0455 28.8908L33.0383 28.8981C31.949 29.9994 30.1312 29.8312 29.1643 28.6164C28.9579 28.3571 28.5805 28.3142 28.3212 28.5206C28.0619 28.727 28.019 29.1044 28.2254 29.3637C29.5975 31.0877 32.2469 31.4003 33.8879 29.7456C34.7099 28.9397 34.9437 27.7293 34.2077 26.7057C33.7056 26.0017 32.9544 25.6621 32.2994 25.4213C32.1008 25.3483 31.9141 25.2846 31.7379 25.2245L31.7379 25.2245L31.7379 25.2245C31.2806 25.0685 30.894 24.9366 30.5527 24.7281L30.5527 24.7281L30.5469 24.7246C30.2261 24.5335 29.9502 24.3161 29.7759 24.0797C29.6134 23.8592 29.5474 23.6374 29.5984 23.3768C29.7562 22.5904 30.5928 21.9758 31.5139 21.8605C32.5353 21.7345 33.6329 22.4503 34.1668 23.4399C34.3241 23.7316 34.6881 23.8404 34.9797 23.6831C35.2714 23.5258 35.3802 23.1618 35.2229 22.8702Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@@ -0,0 +1,7 @@
<svg width="38" height="40" viewBox="0 0 38 40" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M23.75 3.01036C20.8107 1.31335 17.1893 1.31335 14.25 3.01036L6.66154 7.39156C3.72223 9.08857 1.91154 12.2248 1.91154 15.6188V24.3812C1.91154 27.7752 3.72223 30.9114 6.66154 32.6084L14.25 36.9896C17.1893 38.6867 20.8107 38.6866 23.75 36.9896L31.3385 32.6084C34.2778 30.9114 36.0885 27.7752 36.0885 24.3812V15.6188C36.0885 12.2248 34.2778 9.08857 31.3385 7.39156L23.75 3.01036Z" fill="#FFC5C8" stroke="#FFEDEE" stroke-width="3"/>
<g style="mix-blend-mode:overlay">
<path fill-rule="evenodd" clip-rule="evenodd" d="M14.6 16.6667C14.6 14.2397 16.573 12.2667 19 12.2667C21.427 12.2667 23.4 14.2397 23.4 16.6667H14.6ZM13.4 16.6667C13.4 13.577 15.9103 11.0667 19 11.0667C22.0897 11.0667 24.6 13.577 24.6 16.6667L24.8333 16.6667C25.2917 16.6667 25.6667 17.0417 25.6667 17.5V27.5C25.6667 27.9583 25.2917 28.3333 24.8333 28.3333H13.1667C12.7083 28.3333 12.3333 27.9583 12.3333 27.5V17.5C12.3333 17.0417 12.7083 16.6667 13.1667 16.6667L13.4 16.6667Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M19.6 19.1667V18.5667H18.4V19.1667V21.0515L17.0659 19.7174L16.6416 19.2931L15.7931 20.1416L16.2174 20.5659L17.5515 21.9H15.6667H15.0667V23.1H15.6667H17.5514L16.2174 24.434L15.7931 24.8583L16.6416 25.7068L17.0659 25.2825L18.4 23.9484V25.8333V26.4333H19.6V25.8333V23.9485L20.934 25.2825L21.3583 25.7068L22.2068 24.8583L21.7825 24.434L20.4485 23.1H22.3333H22.9333V21.9H22.3333H20.4484L21.7825 20.5659L22.2068 20.1416L21.3583 19.2931L20.934 19.7174L19.6 21.0514V19.1667Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 688 B

View File

@@ -0,0 +1,7 @@
import 'package:flutter/material.dart';
const Color backgroundColor2 = Color(0xFF17203A);
const Color backgroundColorLight = Color(0xFFF2F6FF);
const Color backgroundColorDark = Color(0xFF25254B);
const Color shadowColorLight = Color(0xFF4A5367);
const Color shadowColorDark = Colors.black;

View File

@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:motula_translate_app/screens/onboding/onboding_screen.dart';
void main() {
runApp(const MyApp());
@@ -11,115 +12,33 @@ class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
title: 'The Flutter Way',
theme: ThemeData(
// This is the theme of your application.
//
// TRY THIS: Try running your application with "flutter run". You'll see
// the application has a purple toolbar. Then, without quitting the app,
// try changing the seedColor in the colorScheme below to Colors.green
// and then invoke "hot reload" (save your changes or press the "hot
// reload" button in a Flutter-supported IDE, or press "r" if you used
// the command line to start the app).
//
// Notice that the counter didn't reset back to zero; the application
// state is not lost during the reload. To reset the state, use hot
// restart instead.
//
// This works for code too, not just values: Most code changes can be
// tested with just a hot reload.
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
scaffoldBackgroundColor: const Color(0xFFEEF1F8),
primarySwatch: Colors.blue,
fontFamily: "Intel",
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(foregroundColor: Colors.white),
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
inputDecorationTheme: const InputDecorationTheme(
filled: true,
fillColor: Colors.white,
errorStyle: TextStyle(height: 0),
border: defaultInputBorder,
enabledBorder: defaultInputBorder,
focusedBorder: defaultInputBorder,
errorBorder: defaultInputBorder,
),
),
home: const OnbodingScreen(),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
// This widget is the home page of your application. It is stateful, meaning
// that it has a State object (defined below) that contains fields that affect
// how it looks.
// 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
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
void _incrementCounter() {
setState(() {
// This call to setState tells the Flutter framework that something has
// changed in this State, which causes it to rerun the build method below
// so that the display can reflect the updated values. If we changed
// _counter without calling setState(), then the build method would not be
// called again, and so nothing would appear to happen.
_counter++;
});
}
@override
Widget build(BuildContext context) {
// This method is rerun every time setState is called, for instance as done
// by the _incrementCounter method above.
//
// The Flutter framework has been optimized to make rerunning build methods
// fast, so that you can just rebuild anything that needs updating rather
// than having to individually change instances of widgets.
return Scaffold(
appBar: AppBar(
// TRY THIS: Try changing the color here to a specific color (to
// Colors.amber, perhaps?) and trigger a hot reload to see the AppBar
// change color while the other colors stay the same.
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
const defaultInputBorder = OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(16)),
borderSide: BorderSide(
color: Color(0xFFDEE3F2),
width: 1,
),
body: Center(
// Center is a layout widget. It takes a single child and positions it
// in the middle of the parent.
child: Column(
// Column is also a layout widget. It takes a list of children and
// arranges them vertically. By default, it sizes itself to fit its
// children horizontally, and tries to be as tall as its parent.
//
// Column has various properties to control how it sizes itself and
// how it positions its children. Here we use mainAxisAlignment to
// center the children vertically; the main axis here is the vertical
// axis because Columns are vertical (the cross axis would be
// horizontal).
//
// TRY THIS: Invoke "debug painting" (choose the "Toggle Debug Paint"
// action in the IDE, or press "p" in the console), to see the
// wireframe for each widget.
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}
);

View File

@@ -0,0 +1,39 @@
import 'package:flutter/material.dart' show Color;
class Course {
final String title, description, iconSrc;
final Color color;
Course({
required this.title,
this.description = 'Build and animate an iOS app from scratch',
this.iconSrc = "assets/icons/ios.svg",
this.color = const Color(0xFF7553F6),
});
}
final List<Course> courses = [
Course(
title: "Animations in SwiftUI",
),
Course(
title: "Animations in Flutter",
iconSrc: "assets/icons/code.svg",
color: const Color(0xFF80A4FF),
),
];
final List<Course> recentCourses = [
Course(title: "State Machine"),
Course(
title: "Animated Menu",
color: const Color(0xFF9CC5FF),
iconSrc: "assets/icons/code.svg",
),
Course(title: "Flutter with Rive"),
Course(
title: "Animated Menu",
color: const Color(0xFF9CC5FF),
iconSrc: "assets/icons/code.svg",
),
];

View File

@@ -0,0 +1,93 @@
import 'rive_model.dart';
class Menu {
final String title;
final RiveModel rive;
Menu({required this.title, required this.rive});
}
List<Menu> sidebarMenus = [
Menu(
title: "Home",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "HOME",
stateMachineName: "HOME_interactivity"),
),
Menu(
title: "Search",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "SEARCH",
stateMachineName: "SEARCH_Interactivity"),
),
Menu(
title: "Favorites",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "LIKE/STAR",
stateMachineName: "STAR_Interactivity"),
),
Menu(
title: "Help",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "CHAT",
stateMachineName: "CHAT_Interactivity"),
),
];
List<Menu> sidebarMenus2 = [
Menu(
title: "History",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "TIMER",
stateMachineName: "TIMER_Interactivity"),
),
Menu(
title: "Notifications",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "BELL",
stateMachineName: "BELL_Interactivity"),
),
];
List<Menu> bottomNavItems = [
Menu(
title: "Chat",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "CHAT",
stateMachineName: "CHAT_Interactivity"),
),
Menu(
title: "Search",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "SEARCH",
stateMachineName: "SEARCH_Interactivity"),
),
Menu(
title: "Timer",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "TIMER",
stateMachineName: "TIMER_Interactivity"),
),
Menu(
title: "Notification",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "BELL",
stateMachineName: "BELL_Interactivity"),
),
Menu(
title: "Profile",
rive: RiveModel(
src: "assets/RiveAssets/icons.riv",
artboard: "USER",
stateMachineName: "USER_Interactivity"),
),
];

View File

@@ -0,0 +1,17 @@
import 'package:rive/rive.dart';
class RiveModel {
final String src, artboard, stateMachineName;
late SMIBool? status;
RiveModel({
required this.src,
required this.artboard,
required this.stateMachineName,
this.status,
});
set setStatus(SMIBool state) {
status = state;
}
}

View File

@@ -0,0 +1,25 @@
import 'package:flutter/material.dart';
class AnimatedBar extends StatelessWidget {
const AnimatedBar({
Key? key,
required this.isActive,
}) : super(key: key);
final bool isActive;
@override
Widget build(BuildContext context) {
return AnimatedContainer(
margin: const EdgeInsets.only(bottom: 2),
duration: const Duration(milliseconds: 200),
height: 4,
width: isActive ? 20 : 0,
decoration: const BoxDecoration(
color: Color(0xFF81B4FF),
borderRadius: BorderRadius.all(
Radius.circular(12),
)),
);
}
}

View File

@@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
import '../../../model/menu.dart';
import 'animated_bar.dart';
class BtmNavItem extends StatelessWidget {
const BtmNavItem(
{super.key,
required this.navBar,
required this.press,
required this.riveOnInit,
required this.selectedNav});
final Menu navBar;
final VoidCallback press;
final ValueChanged<Artboard> riveOnInit;
final Menu selectedNav;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: press,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
AnimatedBar(isActive: selectedNav == navBar),
SizedBox(
height: 36,
width: 36,
child: Opacity(
opacity: selectedNav == navBar ? 1 : 0.5,
child: RiveAnimation.asset(
navBar.rive.src,
artboard: navBar.rive.artboard,
onInit: riveOnInit,
),
),
),
],
),
);
}
}

View File

@@ -0,0 +1,33 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class InfoCard extends StatelessWidget {
const InfoCard({
Key? key,
required this.name,
required this.bio,
}) : super(key: key);
final String name, bio;
@override
Widget build(BuildContext context) {
return ListTile(
leading: const CircleAvatar(
backgroundColor: Colors.white24,
child: Icon(
CupertinoIcons.person,
color: Colors.white,
),
),
title: Text(
name,
style: const TextStyle(color: Colors.white),
),
subtitle: Text(
bio,
style: const TextStyle(color: Colors.white70),
),
);
}
}

View File

@@ -0,0 +1,38 @@
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
class MenuBtn extends StatelessWidget {
const MenuBtn({super.key, required this.press, required this.riveOnInit});
final VoidCallback press;
final ValueChanged<Artboard> riveOnInit;
@override
Widget build(BuildContext context) {
return SafeArea(
child: GestureDetector(
onTap: press,
child: Container(
margin: const EdgeInsets.only(left: 12),
height: 40,
width: 40,
decoration: const BoxDecoration(
color: Colors.white,
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: Colors.black12,
offset: Offset(0, 3),
blurRadius: 8,
),
],
),
child: RiveAnimation.asset(
"assets/RiveAssets/menu_button.riv",
onInit: riveOnInit,
),
),
),
);
}
}

View File

@@ -0,0 +1,96 @@
import 'package:flutter/material.dart';
import '../../../model/menu.dart';
import '../../../utils/rive_utils.dart';
import 'info_card.dart';
import 'side_menu.dart';
class SideBar extends StatefulWidget {
const SideBar({super.key});
@override
State<SideBar> createState() => _SideBarState();
}
class _SideBarState extends State<SideBar> {
Menu selectedSideMenu = sidebarMenus.first;
@override
Widget build(BuildContext context) {
return SafeArea(
child: Container(
width: 288,
height: double.infinity,
decoration: const BoxDecoration(
color: Color(0xFF17203A),
borderRadius: BorderRadius.all(
Radius.circular(30),
),
),
child: DefaultTextStyle(
style: const TextStyle(color: Colors.white),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const InfoCard(
name: "Abu Anwar",
bio: "YouTuber",
),
Padding(
padding: const EdgeInsets.only(left: 24, top: 32, bottom: 16),
child: Text(
"Browse".toUpperCase(),
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(color: Colors.white70),
),
),
...sidebarMenus
.map((menu) => SideMenu(
menu: menu,
selectedMenu: selectedSideMenu,
press: () {
RiveUtils.chnageSMIBoolState(menu.rive.status!);
setState(() {
selectedSideMenu = menu;
});
},
riveOnInit: (artboard) {
menu.rive.status = RiveUtils.getRiveInput(artboard,
stateMachineName: menu.rive.stateMachineName);
},
))
.toList(),
Padding(
padding: const EdgeInsets.only(left: 24, top: 40, bottom: 16),
child: Text(
"History".toUpperCase(),
style: Theme.of(context)
.textTheme
.titleMedium!
.copyWith(color: Colors.white70),
),
),
...sidebarMenus2
.map((menu) => SideMenu(
menu: menu,
selectedMenu: selectedSideMenu,
press: () {
RiveUtils.chnageSMIBoolState(menu.rive.status!);
setState(() {
selectedSideMenu = menu;
});
},
riveOnInit: (artboard) {
menu.rive.status = RiveUtils.getRiveInput(artboard,
stateMachineName: menu.rive.stateMachineName);
},
))
.toList(),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,63 @@
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
import '../../../model/menu.dart';
class SideMenu extends StatelessWidget {
const SideMenu(
{super.key,
required this.menu,
required this.press,
required this.riveOnInit,
required this.selectedMenu});
final Menu menu;
final VoidCallback press;
final ValueChanged<Artboard> riveOnInit;
final Menu selectedMenu;
@override
Widget build(BuildContext context) {
return Column(
children: [
const Padding(
padding: EdgeInsets.only(left: 24),
child: Divider(color: Colors.white24, height: 1),
),
Stack(
children: [
AnimatedPositioned(
duration: const Duration(milliseconds: 300),
curve: Curves.fastOutSlowIn,
width: selectedMenu == menu ? 288 : 0,
height: 56,
left: 0,
child: Container(
decoration: const BoxDecoration(
color: Color(0xFF6792FF),
borderRadius: BorderRadius.all(Radius.circular(10)),
),
),
),
ListTile(
onTap: press,
leading: SizedBox(
height: 36,
width: 36,
child: RiveAnimation.asset(
menu.rive.src,
artboard: menu.rive.artboard,
onInit: riveOnInit,
),
),
title: Text(
menu.title,
style: const TextStyle(color: Colors.white),
),
),
],
),
],
);
}
}

View File

@@ -0,0 +1,181 @@
import 'dart:math';
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
import 'package:motula_translate_app/constants.dart';
import 'package:motula_translate_app/screens/home/home_screen.dart';
import 'package:motula_translate_app/utils/rive_utils.dart';
import '../../model/menu.dart';
import 'components/btm_nav_item.dart';
import 'components/menu_btn.dart';
import 'components/side_bar.dart';
class EntryPoint extends StatefulWidget {
const EntryPoint({super.key});
@override
State<EntryPoint> createState() => _EntryPointState();
}
class _EntryPointState extends State<EntryPoint>
with SingleTickerProviderStateMixin {
bool isSideBarOpen = false;
Menu selectedBottonNav = bottomNavItems.first;
Menu selectedSideMenu = sidebarMenus.first;
late SMIBool isMenuOpenInput;
void updateSelectedBtmNav(Menu menu) {
if (selectedBottonNav != menu) {
setState(() {
selectedBottonNav = menu;
});
}
}
late AnimationController _animationController;
late Animation<double> scalAnimation;
late Animation<double> animation;
@override
void initState() {
_animationController = AnimationController(
vsync: this, duration: const Duration(milliseconds: 200))
..addListener(
() {
setState(() {});
},
);
scalAnimation = Tween<double>(begin: 1, end: 0.8).animate(CurvedAnimation(
parent: _animationController, curve: Curves.fastOutSlowIn));
animation = Tween<double>(begin: 0, end: 1).animate(CurvedAnimation(
parent: _animationController, curve: Curves.fastOutSlowIn));
super.initState();
}
@override
void dispose() {
_animationController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
extendBody: true,
resizeToAvoidBottomInset: false,
backgroundColor: backgroundColor2,
body: Stack(
children: [
AnimatedPositioned(
width: 288,
height: MediaQuery.of(context).size.height,
duration: const Duration(milliseconds: 200),
curve: Curves.fastOutSlowIn,
left: isSideBarOpen ? 0 : -288,
top: 0,
child: const SideBar(),
),
Transform(
alignment: Alignment.center,
transform: Matrix4.identity()
..setEntry(3, 2, 0.001)
..rotateY(
1 * animation.value - 30 * (animation.value) * pi / 180),
child: Transform.translate(
offset: Offset(animation.value * 265, 0),
child: Transform.scale(
scale: scalAnimation.value,
child: const ClipRRect(
borderRadius: BorderRadius.all(
Radius.circular(24),
),
child: HomePage(),
),
),
),
),
AnimatedPositioned(
duration: const Duration(milliseconds: 200),
curve: Curves.fastOutSlowIn,
left: isSideBarOpen ? 220 : 0,
top: 16,
child: MenuBtn(
press: () {
isMenuOpenInput.value = !isMenuOpenInput.value;
if (_animationController.value == 0) {
_animationController.forward();
} else {
_animationController.reverse();
}
setState(
() {
isSideBarOpen = !isSideBarOpen;
},
);
},
riveOnInit: (artboard) {
final controller = StateMachineController.fromArtboard(
artboard, "State Machine");
artboard.addController(controller!);
isMenuOpenInput =
controller.findInput<bool>("isOpen") as SMIBool;
isMenuOpenInput.value = true;
},
),
),
],
),
bottomNavigationBar: Transform.translate(
offset: Offset(0, 100 * animation.value),
child: SafeArea(
child: Container(
padding:
const EdgeInsets.only(left: 12, top: 12, right: 12, bottom: 12),
margin: const EdgeInsets.symmetric(horizontal: 24),
decoration: BoxDecoration(
color: backgroundColor2.withOpacity(0.8),
borderRadius: const BorderRadius.all(Radius.circular(24)),
boxShadow: [
BoxShadow(
color: backgroundColor2.withOpacity(0.3),
offset: const Offset(0, 20),
blurRadius: 20,
),
],
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
...List.generate(
bottomNavItems.length,
(index) {
Menu navBar = bottomNavItems[index];
return BtmNavItem(
navBar: navBar,
press: () {
RiveUtils.chnageSMIBoolState(navBar.rive.status!);
updateSelectedBtmNav(navBar);
},
riveOnInit: (artboard) {
navBar.rive.status = RiveUtils.getRiveInput(artboard,
stateMachineName: navBar.rive.stateMachineName);
},
selectedNav: selectedBottonNav,
);
},
),
],
),
),
),
),
);
}
}

View File

@@ -0,0 +1,77 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
class CourseCard extends StatelessWidget {
const CourseCard({
Key? key,
required this.title,
this.color = const Color(0xFF7553F6),
this.iconSrc = "assets/icons/ios.svg",
}) : super(key: key);
final String title, iconSrc;
final Color color;
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 24),
height: 280,
width: 260,
decoration: BoxDecoration(
color: color,
borderRadius: const BorderRadius.all(Radius.circular(30)),
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Padding(
padding: const EdgeInsets.only(top: 6, right: 8),
child: Column(
children: [
Text(
title,
style: Theme.of(context).textTheme.titleLarge!.copyWith(
color: Colors.white, fontWeight: FontWeight.w600),
),
const Padding(
padding: EdgeInsets.only(top: 12, bottom: 8),
child: Text(
"Build and animate an iOS app from scratch",
style: TextStyle(
color: Colors.white38,
),
),
),
const Text(
"61 SECTIONS - 11 HOURS",
style: TextStyle(
color: Colors.white38,
),
),
const Spacer(),
Row(
children: List.generate(
3,
(index) => Transform.translate(
offset: Offset((-10 * index).toDouble(), 0),
child: CircleAvatar(
radius: 20,
backgroundImage: AssetImage(
"assets/avaters/Avatar ${index + 1}.jpg",
),
),
),
),
),
],
),
),
),
SvgPicture.asset(iconSrc),
],
),
);
}
}

View File

@@ -0,0 +1,59 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
class SecondaryCourseCard extends StatelessWidget {
const SecondaryCourseCard({
Key? key,
required this.title,
this.iconsSrc = "assets/icons/ios.svg",
this.colorl = const Color(0xFF7553F6),
}) : super(key: key);
final String title, iconsSrc;
final Color colorl;
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 20),
decoration: BoxDecoration(
color: colorl,
borderRadius: const BorderRadius.all(Radius.circular(20))),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
title,
style: Theme.of(context).textTheme.headlineSmall!.copyWith(
color: Colors.white,
fontWeight: FontWeight.w600,
),
),
const SizedBox(height: 4),
const Text(
"Watch video - 15 mins",
style: TextStyle(
color: Colors.white60,
fontSize: 16,
),
)
],
),
),
const SizedBox(
height: 40,
child: VerticalDivider(
// thickness: 5,
color: Colors.white70,
),
),
const SizedBox(width: 8),
SvgPicture.asset(iconsSrc)
],
),
);
}
}

View File

@@ -0,0 +1,70 @@
import 'package:flutter/material.dart';
import '../../model/course.dart';
import 'components/course_card.dart';
import 'components/secondary_course_card.dart';
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
bottom: false,
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 40),
Padding(
padding: const EdgeInsets.all(20),
child: Text(
"Courses",
style: Theme.of(context).textTheme.headlineMedium!.copyWith(
color: Colors.black, fontWeight: FontWeight.bold),
),
),
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: Row(
children: courses
.map(
(course) => Padding(
padding: const EdgeInsets.only(left: 20),
child: CourseCard(
title: course.title,
iconSrc: course.iconSrc,
color: course.color,
),
),
)
.toList(),
),
),
Padding(
padding: const EdgeInsets.all(20),
child: Text(
"Recent",
style: Theme.of(context).textTheme.headlineSmall!.copyWith(
color: Colors.black, fontWeight: FontWeight.bold),
),
),
...recentCourses
.map((course) => Padding(
padding: const EdgeInsets.only(
left: 20, right: 20, bottom: 20),
child: SecondaryCourseCard(
title: course.title,
iconsSrc: course.iconSrc,
colorl: course.color,
),
))
.toList(),
],
),
),
),
);
}
}

View File

@@ -0,0 +1,49 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
class AnimatedBtn extends StatelessWidget {
const AnimatedBtn({
Key? key,
required RiveAnimationController btnAnimationController,
required this.press,
}) : _btnAnimationController = btnAnimationController,
super(key: key);
final RiveAnimationController _btnAnimationController;
final VoidCallback press;
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: press,
child: SizedBox(
height: 64,
width: 236,
child: Stack(
children: [
RiveAnimation.asset(
"assets/RiveAssets/button.riv",
controllers: [_btnAnimationController],
),
Positioned.fill(
top: 8,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Icon(CupertinoIcons.arrow_right),
const SizedBox(width: 8),
Text(
"Start the course",
style: Theme.of(context).textTheme.labelLarge,
)
],
),
)
],
),
),
);
}
}

View File

@@ -0,0 +1,161 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'sign_in_form.dart';
void showCustomDialog(BuildContext context, {required ValueChanged onValue}) {
showGeneralDialog(
context: context,
barrierLabel: "Barrier",
barrierDismissible: true,
barrierColor: Colors.black.withOpacity(0.5),
transitionDuration: const Duration(milliseconds: 400),
pageBuilder: (_, __, ___) {
return Center(
child: Container(
height: 670,
margin: const EdgeInsets.symmetric(horizontal: 16),
padding: const EdgeInsets.symmetric(vertical: 32, horizontal: 24),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.95),
borderRadius: BorderRadius.circular(40),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.3),
offset: const Offset(0, 30),
blurRadius: 60,
),
const BoxShadow(
color: Colors.black45,
offset: Offset(0, 30),
blurRadius: 60,
),
],
),
child: Scaffold(
// backgroundColor: Colors.transparent,
body: Stack(
clipBehavior: Clip.none,
children: [
SingleChildScrollView(
child: Column(
children: [
const Text(
"Sign in",
style: TextStyle(
fontSize: 34,
fontFamily: "Poppins",
fontWeight: FontWeight.w600,
),
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 16),
child: Text(
"Access to 240+ hours of content. Learn design and code, by building real apps with Flutter and Swift.",
textAlign: TextAlign.center,
),
),
const SignInForm(),
const Row(
children: [
Expanded(
child: Divider(),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: 16),
child: Text(
"OR",
style: TextStyle(
color: Colors.black26,
fontWeight: FontWeight.w500,
),
),
),
Expanded(child: Divider()),
],
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 24),
child: Text(
"Sign up with Email, Apple or Google",
style: TextStyle(color: Colors.black54),
),
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
IconButton(
onPressed: () {},
padding: EdgeInsets.zero,
icon: SvgPicture.asset(
"assets/icons/email_box.svg",
height: 64,
width: 64,
),
),
IconButton(
onPressed: () {},
padding: EdgeInsets.zero,
icon: SvgPicture.asset(
"assets/icons/apple_box.svg",
height: 64,
width: 64,
),
),
IconButton(
onPressed: () {},
padding: EdgeInsets.zero,
icon: SvgPicture.asset(
"assets/icons/google_box.svg",
height: 64,
width: 64,
),
),
],
),
],
),
),
const Positioned(
left: 0,
right: 0,
bottom: -48,
child: CircleAvatar(
radius: 16,
backgroundColor: Colors.white,
child: Icon(
Icons.close,
size: 20,
color: Colors.black,
),
),
)
],
),
),
),
);
},
transitionBuilder: (_, anim, __, child) {
Tween<Offset> tween;
// if (anim.status == AnimationStatus.reverse) {
// tween = Tween(begin: const Offset(0, 1), end: Offset.zero);
// } else {
// tween = Tween(begin: const Offset(0, -1), end: Offset.zero);
// }
tween = Tween(begin: const Offset(0, -1), end: Offset.zero);
return SlideTransition(
position: tween.animate(
CurvedAnimation(parent: anim, curve: Curves.easeInOut),
),
// child: FadeTransition(
// opacity: anim,
// child: child,
// ),
child: child,
);
},
).then(onValue);
}

View File

@@ -0,0 +1,225 @@
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:rive/rive.dart';
import 'package:motula_translate_app/screens/entryPoint/entry_point.dart';
class SignInForm extends StatefulWidget {
const SignInForm({
Key? key,
}) : super(key: key);
@override
State<SignInForm> createState() => _SignInFormState();
}
class _SignInFormState extends State<SignInForm> {
final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
bool isShowLoading = false;
bool isShowConfetti = false;
late SMITrigger error;
late SMITrigger success;
late SMITrigger reset;
late SMITrigger confetti;
void _onCheckRiveInit(Artboard artboard) {
StateMachineController? controller =
StateMachineController.fromArtboard(artboard, 'State Machine 1');
artboard.addController(controller!);
error = controller.findInput<bool>('Error') as SMITrigger;
success = controller.findInput<bool>('Check') as SMITrigger;
reset = controller.findInput<bool>('Reset') as SMITrigger;
}
void _onConfettiRiveInit(Artboard artboard) {
StateMachineController? controller =
StateMachineController.fromArtboard(artboard, "State Machine 1");
artboard.addController(controller!);
confetti = controller.findInput<bool>("Trigger explosion") as SMITrigger;
}
void singIn(BuildContext context) {
// confetti.fire();
setState(() {
isShowConfetti = true;
isShowLoading = true;
});
Future.delayed(
const Duration(seconds: 1),
() {
if (_formKey.currentState!.validate()) {
success.fire();
Future.delayed(
const Duration(seconds: 2),
() {
setState(() {
isShowLoading = false;
});
confetti.fire();
// Navigate & hide confetti
Future.delayed(const Duration(seconds: 1), () {
// Navigator.pop(context);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => const EntryPoint(),
),
);
});
},
);
} else {
error.fire();
Future.delayed(
const Duration(seconds: 2),
() {
setState(() {
isShowLoading = false;
});
reset.fire();
},
);
}
},
);
}
@override
Widget build(BuildContext context) {
return Stack(
children: [
Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
"Email",
style: TextStyle(
color: Colors.black54,
),
),
Padding(
padding: const EdgeInsets.only(top: 8, bottom: 16),
child: TextFormField(
validator: (value) {
if (value!.isEmpty) {
return "";
}
return null;
},
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.next,
decoration: InputDecoration(
prefixIcon: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: SvgPicture.asset("assets/icons/email.svg"),
),
),
),
),
const Text(
"Password",
style: TextStyle(
color: Colors.black54,
),
),
Padding(
padding: const EdgeInsets.only(top: 8, bottom: 16),
child: TextFormField(
obscureText: true,
validator: (value) {
if (value!.isEmpty) {
return "";
}
return null;
},
decoration: InputDecoration(
prefixIcon: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8),
child: SvgPicture.asset("assets/icons/password.svg"),
),
),
),
),
Padding(
padding: const EdgeInsets.only(top: 8, bottom: 24),
child: ElevatedButton.icon(
onPressed: () {
singIn(context);
},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFFF77D8E),
minimumSize: const Size(double.infinity, 56),
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(25),
bottomRight: Radius.circular(25),
bottomLeft: Radius.circular(25),
),
),
),
icon: const Icon(
CupertinoIcons.arrow_right,
color: Color(0xFFFE0037),
),
label: const Text("Sign In"),
),
),
],
),
),
isShowLoading
? CustomPositioned(
child: RiveAnimation.asset(
'assets/RiveAssets/check.riv',
fit: BoxFit.cover,
onInit: _onCheckRiveInit,
),
)
: const SizedBox(),
isShowConfetti
? CustomPositioned(
scale: 6,
child: RiveAnimation.asset(
"assets/RiveAssets/confetti.riv",
onInit: _onConfettiRiveInit,
fit: BoxFit.cover,
),
)
: const SizedBox(),
],
);
}
}
class CustomPositioned extends StatelessWidget {
const CustomPositioned({super.key, this.scale = 1, required this.child});
final double scale;
final Widget child;
@override
Widget build(BuildContext context) {
return Positioned.fill(
child: Column(
children: [
const Spacer(),
SizedBox(
height: 100,
width: 100,
child: Transform.scale(
scale: scale,
child: child,
),
),
const Spacer(flex: 2),
],
),
);
}
}

View File

@@ -0,0 +1,132 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:rive/rive.dart';
import 'components/animated_btn.dart';
import 'components/sign_in_dialog.dart';
class OnbodingScreen extends StatefulWidget {
const OnbodingScreen({super.key});
@override
State<OnbodingScreen> createState() => _OnbodingScreenState();
}
class _OnbodingScreenState extends State<OnbodingScreen> {
late RiveAnimationController _btnAnimationController;
bool isShowSignInDialog = false;
@override
void initState() {
_btnAnimationController = OneShotAnimation(
"active",
autoplay: false,
);
super.initState();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Stack(
children: [
Positioned(
width: MediaQuery.of(context).size.width * 1.7,
left: 100,
bottom: 100,
child: Image.asset(
"assets/Backgrounds/Spline.png",
),
),
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 20, sigmaY: 20),
child: const SizedBox(),
),
),
const RiveAnimation.asset(
"assets/RiveAssets/shapes.riv",
),
Positioned.fill(
child: BackdropFilter(
filter: ImageFilter.blur(sigmaX: 30, sigmaY: 30),
child: const SizedBox(),
),
),
AnimatedPositioned(
top: isShowSignInDialog ? -50 : 0,
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
duration: const Duration(milliseconds: 260),
child: SafeArea(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 32),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Spacer(),
const SizedBox(
width: 260,
child: Column(
children: [
Text(
"Learn design & code",
style: TextStyle(
fontSize: 60,
fontWeight: FontWeight.w700,
fontFamily: "Poppins",
height: 1.2,
),
),
SizedBox(height: 16),
Text(
"Dont skip design. Learn design and code, by building real apps with Flutter and Swift. Complete courses about the best tools.",
),
],
),
),
const Spacer(flex: 2),
AnimatedBtn(
btnAnimationController: _btnAnimationController,
press: () {
_btnAnimationController.isActive = true;
Future.delayed(
const Duration(milliseconds: 800),
() {
setState(() {
isShowSignInDialog = true;
});
showCustomDialog(
context,
onValue: (_) {},
);
// showCustomDialog(
// context,
// onValue: (_) {
// setState(() {
// isShowSignInDialog = false;
// });
// },
// );
},
);
},
),
const Padding(
padding: EdgeInsets.symmetric(vertical: 24),
child: Text(
"Purchase includes access to 30+ courses, 240+ premium tutorials, 120+ hours of videos, source files and certificates."),
)
],
),
),
),
),
],
),
);
}
}

View File

@@ -0,0 +1,23 @@
import 'package:rive/rive.dart';
class RiveUtils {
static SMIBool getRiveInput(Artboard artboard,
{required String stateMachineName}) {
StateMachineController? controller =
StateMachineController.fromArtboard(artboard, stateMachineName);
artboard.addController(controller!);
return controller.findInput<bool>("active") as SMIBool;
}
static void chnageSMIBoolState(SMIBool input) {
input.change(true);
Future.delayed(
const Duration(seconds: 1),
() {
input.change(false);
},
);
}
}

View File

@@ -5,6 +5,8 @@
import FlutterMacOS
import Foundation
import rive_common
func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) {
RivePlugin.register(with: registry.registrar(forPlugin: "RivePlugin"))
}

View File

@@ -1,6 +1,14 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
args:
dependency: transitive
description:
name: args
sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
url: "https://pub.dev"
source: hosted
version: "2.4.2"
async:
dependency: transitive
description:
@@ -57,6 +65,14 @@ packages:
url: "https://pub.dev"
source: hosted
version: "1.3.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
flutter:
dependency: "direct main"
description: flutter
@@ -66,15 +82,52 @@ packages:
dependency: "direct dev"
description:
name: flutter_lints
sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
url: "https://pub.dev"
source: hosted
version: "3.0.1"
version: "2.0.3"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2"
url: "https://pub.dev"
source: hosted
version: "2.0.10+1"
flutter_test:
dependency: "direct dev"
description: flutter
source: sdk
version: "0.0.0"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
graphs:
dependency: transitive
description:
name: graphs
sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19
url: "https://pub.dev"
source: hosted
version: "2.3.1"
http:
dependency: "direct main"
description:
name: http
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
leak_tracker:
dependency: transitive
description:
@@ -103,10 +156,10 @@ packages:
dependency: transitive
description:
name: lints
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
url: "https://pub.dev"
source: hosted
version: "3.0.0"
version: "2.1.1"
matcher:
dependency: transitive
description:
@@ -139,6 +192,46 @@ 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"
petitparser:
dependency: transitive
description:
name: petitparser
sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27
url: "https://pub.dev"
source: hosted
version: "6.0.2"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
rive:
dependency: "direct main"
description:
name: rive
sha256: ae75a6e9cfbf146630bfb1feba97ee582d935508be6b362e4bd197b9c55a6dd3
url: "https://pub.dev"
source: hosted
version: "0.12.4"
rive_common:
dependency: transitive
description:
name: rive_common
sha256: f4e20d0a99c5040c85624a3eb2b0b6b19e614d93a693c3bb25cf6e7bb2d3d6d3
url: "https://pub.dev"
source: hosted
version: "0.2.8"
sky_engine:
dependency: transitive
description: flutter
@@ -192,6 +285,38 @@ packages:
url: "https://pub.dev"
source: hosted
version: "0.6.1"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev"
source: hosted
version: "1.3.2"
vector_graphics:
dependency: transitive
description:
name: vector_graphics
sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
vector_graphics_codec:
dependency: transitive
description:
name: vector_graphics_codec
sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
vector_graphics_compiler:
dependency: transitive
description:
name: vector_graphics_compiler
sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81"
url: "https://pub.dev"
source: hosted
version: "1.1.11+1"
vector_math:
dependency: transitive
description:
@@ -208,5 +333,22 @@ packages:
url: "https://pub.dev"
source: hosted
version: "13.0.0"
web:
dependency: transitive
description:
name: web
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "0.5.1"
xml:
dependency: transitive
description:
name: xml
sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226
url: "https://pub.dev"
source: hosted
version: "6.5.0"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.7.0-0"

View File

@@ -2,7 +2,7 @@ name: motula_translate_app
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
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
@@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 1.0.0+1
environment:
sdk: '>=3.3.0 <4.0.0'
sdk: ">=3.2.0 <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
@@ -31,10 +31,12 @@ 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.6
cupertino_icons: ^1.0.2
rive: ^0.12.4
flutter_svg: ^2.0.9
http: ^1.2.1
dev_dependencies:
flutter_test:
@@ -45,23 +47,24 @@ dev_dependencies:
# 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: ^3.0.0
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:
# - images/a_dot_burr.jpeg
# - images/a_dot_ham.jpeg
assets:
- assets/avaters/
- assets/Backgrounds/
- assets/icons/
- assets/RiveAssets/
# An image asset can refer to one or more resolution-specific "variants", see
# https://flutter.dev/assets-and-images/#resolution-aware
@@ -74,17 +77,16 @@ flutter:
# "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
fonts:
- family: Intel
fonts:
- asset: assets/Fonts/Inter-Regular.ttf
- asset: assets/Fonts/Inter-SemiBold.ttf
weight: 600
- family: Poppins
fonts:
- asset: assets/Fonts/Poppins-Bold.ttf
weight: 700
#
# For details regarding fonts from package dependencies,
# see https://flutter.dev/custom-fonts/#from-packages

View File

@@ -6,6 +6,9 @@
#include "generated_plugin_registrant.h"
#include <rive_common/rive_plugin.h>
void RegisterPlugins(flutter::PluginRegistry* registry) {
RivePluginRegisterWithRegistrar(
registry->GetRegistrarForPlugin("RivePlugin"));
}

View File

@@ -3,6 +3,7 @@
#
list(APPEND FLUTTER_PLUGIN_LIST
rive_common
)
list(APPEND FLUTTER_FFI_PLUGIN_LIST