diff --git a/Android/app/src/main/AndroidManifest.xml b/Android/app/src/main/AndroidManifest.xml
index 8618e06..e51a195 100644
--- a/Android/app/src/main/AndroidManifest.xml
+++ b/Android/app/src/main/AndroidManifest.xml
@@ -12,17 +12,22 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
+
+
+
+
+
+
+
-
-
-
-
-
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/MainActivity.java b/Android/app/src/main/java/com/majinnaibu/monstercards/MainActivity.java
index 37ea0a6..96729d0 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/MainActivity.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/MainActivity.java
@@ -58,12 +58,33 @@ public class MainActivity extends AppCompatActivity {
@SuppressWarnings("ConstantConditions")
@Override
protected void onCreate(Bundle savedInstanceState) {
+ setTheme(R.style.AppTheme);
WindowCompat.setDecorFitsSystemWindows(getWindow(), false);
super.onCreate(savedInstanceState);
AppCenterInitializer.init(getApplication());
setContentView(R.layout.activity_main);
+ com.google.android.material.appbar.MaterialToolbar toolbar = findViewById(R.id.toolbar);
+ if (toolbar != null) {
+ setSupportActionBar(toolbar);
+ }
+
+ View appBarLayout = findViewById(R.id.app_bar_layout);
BottomNavigationView navView = findViewById(R.id.nav_view);
+
+ View container = findViewById(R.id.container);
+ if (container != null) {
+ ViewCompat.setOnApplyWindowInsetsListener(container, (v, windowInsets) -> {
+ Insets systemBars = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
+ if (appBarLayout != null) {
+ appBarLayout.setPadding(0, systemBars.top, 0, 0);
+ }
+ if (navView != null) {
+ navView.setPadding(0, 0, 0, systemBars.bottom);
+ }
+ return windowInsets;
+ });
+ }
// Passing each menu ID as a set of Ids because each
// menu should be considered as top level destinations.
AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/SplashActivity.java b/Android/app/src/main/java/com/majinnaibu/monstercards/SplashActivity.java
new file mode 100644
index 0000000..942fb5f
--- /dev/null
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/SplashActivity.java
@@ -0,0 +1,36 @@
+package com.majinnaibu.monstercards;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+public class SplashActivity extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ setTheme(R.style.AppTheme);
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_splash);
+
+ new Handler(Looper.getMainLooper()).postDelayed(() -> {
+ Intent intent = new Intent(SplashActivity.this, MainActivity.class);
+ if (getIntent() != null) {
+ if (getIntent().getExtras() != null) {
+ intent.putExtras(getIntent().getExtras());
+ }
+ if (getIntent().getAction() != null) {
+ intent.setAction(getIntent().getAction());
+ }
+ if (getIntent().getData() != null) {
+ intent.setData(getIntent().getData());
+ }
+ }
+ startActivity(intent);
+ finish();
+ overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
+ }, 1200);
+ }
+}
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/collections/CollectionsFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/collections/CollectionsFragment.java
index 8f52c17..da17887 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/collections/CollectionsFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/collections/CollectionsFragment.java
@@ -31,10 +31,12 @@ import com.majinnaibu.monstercards.utils.Logger;
import java.util.UUID;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.observers.DisposableCompletableObserver;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class CollectionsFragment extends MCFragment {
+ private final CompositeDisposable mDisposables = new CompositeDisposable();
@Nullable
@Override
@@ -48,18 +50,35 @@ public class CollectionsFragment extends MCFragment {
fab.setOnClickListener(v -> showCreateCollectionDialog());
}
+ View emptyState = root.findViewById(R.id.empty_state);
+ View emptyStateButton = root.findViewById(R.id.empty_state_button);
+ if (emptyStateButton != null) {
+ emptyStateButton.setOnClickListener(v -> showCreateCollectionDialog());
+ }
+
RecyclerView recyclerView = root.findViewById(R.id.collection_list);
if (recyclerView != null) {
- setupRecyclerView(recyclerView);
+ setupRecyclerView(recyclerView, emptyState);
}
return root;
}
- private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
+ private void setupRecyclerView(@NonNull RecyclerView recyclerView, @Nullable View emptyState) {
Context context = requireContext();
MonsterRepository repository = getMonsterRepository();
+ mDisposables.add(repository.getCollectionsWithCount()
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(collections -> {
+ boolean isEmpty = (collections == null || collections.isEmpty());
+ if (emptyState != null) {
+ emptyState.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
+ }
+ recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE);
+ }, Logger::logError));
+
CollectionsRecyclerViewAdapter adapter = new CollectionsRecyclerViewAdapter(
context,
repository.getCollectionsWithCount(),
@@ -155,4 +174,10 @@ public class CollectionsFragment extends MCFragment {
NavDirections action = CollectionsFragmentDirections.actionNavigationCollectionsToCollectionDetailFragment(collectionId.toString());
Navigation.findNavController(requireView()).navigate(action);
}
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ mDisposables.clear();
+ }
}
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/dashboard/DashboardFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/dashboard/DashboardFragment.java
index 81be1bb..6a1230a 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/dashboard/DashboardFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/dashboard/DashboardFragment.java
@@ -57,6 +57,9 @@ public class DashboardFragment extends MCFragment {
if (fab != null) {
fab.setOnClickListener(v -> showAddToDashboardOptionsDialog());
}
+ if (mHolder.emptyStateButton != null) {
+ mHolder.emptyStateButton.setOnClickListener(v -> showAddToDashboardOptionsDialog());
+ }
setupRecyclerView(mHolder.list);
loadDashboardMonsters();
@@ -88,7 +91,16 @@ public class DashboardFragment extends MCFragment {
}
});
if (monsterData != null) {
- monsterData.observe(getViewLifecycleOwner(), monsters -> mAdapter.submitList(monsters));
+ monsterData.observe(getViewLifecycleOwner(), monsters -> {
+ mAdapter.submitList(monsters);
+ boolean isEmpty = (monsters == null || monsters.isEmpty());
+ if (mHolder.emptyState != null) {
+ mHolder.emptyState.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
+ }
+ if (mHolder.list != null) {
+ mHolder.list.setVisibility(isEmpty ? View.GONE : View.VISIBLE);
+ }
+ });
}
recyclerView.setAdapter(mAdapter);
@@ -301,9 +313,13 @@ public class DashboardFragment extends MCFragment {
private static class ViewHolder {
final RecyclerView list;
+ final View emptyState;
+ final View emptyStateButton;
ViewHolder(View root) {
list = root.findViewById(R.id.list);
+ emptyState = root.findViewById(R.id.empty_state);
+ emptyStateButton = root.findViewById(R.id.empty_state_button);
}
}
}
diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java
index f3661e9..b9695c1 100644
--- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java
+++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/library/LibraryFragment.java
@@ -13,6 +13,7 @@ import android.view.ViewGroup;
import android.widget.EditText;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.navigation.NavController;
import androidx.navigation.NavDirections;
@@ -38,10 +39,12 @@ import com.majinnaibu.monstercards.utils.Logger;
import java.util.UUID;
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
+import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.observers.DisposableCompletableObserver;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class LibraryFragment extends MCFragment {
+ private final CompositeDisposable mDisposables = new CompositeDisposable();
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
@@ -52,9 +55,15 @@ public class LibraryFragment extends MCFragment {
assert fab != null;
setupAddMonsterButton(fab);
+ View emptyState = root.findViewById(R.id.empty_state);
+ View emptyStateButton = root.findViewById(R.id.empty_state_button);
+ if (emptyStateButton != null) {
+ emptyStateButton.setOnClickListener(v -> createNewMonster());
+ }
+
final RecyclerView recyclerView = root.findViewById(R.id.monster_list);
assert recyclerView != null;
- setupRecyclerView(recyclerView);
+ setupRecyclerView(recyclerView, emptyState);
return root;
}
@@ -130,10 +139,21 @@ public class LibraryFragment extends MCFragment {
builder.show();
}
- private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
+ private void setupRecyclerView(@NonNull RecyclerView recyclerView, @Nullable View emptyState) {
Context context = requireContext();
MonsterRepository repository = this.getMonsterRepository();
+ mDisposables.add(repository.getMonsters()
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(monsters -> {
+ boolean isEmpty = (monsters == null || monsters.isEmpty());
+ if (emptyState != null) {
+ emptyState.setVisibility(isEmpty ? View.VISIBLE : View.GONE);
+ }
+ recyclerView.setVisibility(isEmpty ? View.GONE : View.VISIBLE);
+ }, Logger::logError));
+
LibraryRecyclerViewAdapter adapter = new LibraryRecyclerViewAdapter(
context,
repository.getMonsters(),
@@ -165,30 +185,31 @@ public class LibraryFragment extends MCFragment {
}
private void setupAddMonsterButton(@NonNull FloatingActionButton fab) {
- fab.setOnClickListener(view -> {
- Monster monster = new Monster();
- monster.name = getString(R.string.default_monster_name);
- MonsterRepository repository = this.getMonsterRepository();
- repository.addMonster(monster)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(
- new DisposableCompletableObserver() {
- @Override
- public void onComplete() {
- navigateToEditMonster(monster.id);
- }
+ fab.setOnClickListener(view -> createNewMonster());
+ }
- @Override
- public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
- Logger.logError("Error creating monster", e);
- View view = getView();
- if (view != null) {
- Snackbar.make(view, getString(R.string.snackbar_failed_to_create_monster), Snackbar.LENGTH_LONG).show();
- }
- }
- });
- });
+ private void createNewMonster() {
+ Monster monster = new Monster();
+ monster.name = getString(R.string.default_monster_name);
+ MonsterRepository repository = this.getMonsterRepository();
+ mDisposables.add(repository.addMonster(monster)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribeWith(new DisposableCompletableObserver() {
+ @Override
+ public void onComplete() {
+ navigateToEditMonster(monster.id);
+ }
+
+ @Override
+ public void onError(@io.reactivex.rxjava3.annotations.NonNull Throwable e) {
+ Logger.logError("Error creating monster", e);
+ View view = getView();
+ if (view != null) {
+ Snackbar.make(view, getString(R.string.snackbar_failed_to_create_monster), Snackbar.LENGTH_LONG).show();
+ }
+ }
+ }));
}
protected void navigateToMonsterDetail(@NonNull UUID monsterId) {
@@ -203,4 +224,10 @@ public class LibraryFragment extends MCFragment {
action = MonsterDetailFragmentDirections.actionNavigationMonsterToEditMonsterFragment(monsterId.toString());
navController.navigate(action);
}
+
+ @Override
+ public void onDestroyView() {
+ super.onDestroyView();
+ mDisposables.clear();
+ }
}
diff --git a/Android/app/src/main/res/drawable/ic_launcher_background.xml b/Android/app/src/main/res/drawable/ic_launcher_background.xml
index 07d5da9..4213cda 100644
--- a/Android/app/src/main/res/drawable/ic_launcher_background.xml
+++ b/Android/app/src/main/res/drawable/ic_launcher_background.xml
@@ -5,166 +5,6 @@
android:viewportWidth="108"
android:viewportHeight="108">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Android/app/src/main/res/drawable/ic_launcher_foreground.png b/Android/app/src/main/res/drawable/ic_launcher_foreground.png
new file mode 100644
index 0000000..74e3837
Binary files /dev/null and b/Android/app/src/main/res/drawable/ic_launcher_foreground.png differ
diff --git a/Android/app/src/main/res/drawable/ic_logo.png b/Android/app/src/main/res/drawable/ic_logo.png
new file mode 100644
index 0000000..aba1ea5
Binary files /dev/null and b/Android/app/src/main/res/drawable/ic_logo.png differ
diff --git a/Android/app/src/main/res/drawable/ic_splash_combined.png b/Android/app/src/main/res/drawable/ic_splash_combined.png
new file mode 100644
index 0000000..98211a0
Binary files /dev/null and b/Android/app/src/main/res/drawable/ic_splash_combined.png differ
diff --git a/Android/app/src/main/res/drawable/ic_splash_logo.png b/Android/app/src/main/res/drawable/ic_splash_logo.png
new file mode 100644
index 0000000..56d94cd
Binary files /dev/null and b/Android/app/src/main/res/drawable/ic_splash_logo.png differ
diff --git a/Android/app/src/main/res/drawable/splash_window_background.xml b/Android/app/src/main/res/drawable/splash_window_background.xml
new file mode 100644
index 0000000..7921faf
--- /dev/null
+++ b/Android/app/src/main/res/drawable/splash_window_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/Android/app/src/main/res/font/spindles_end.ttf b/Android/app/src/main/res/font/spindles_end.ttf
new file mode 100644
index 0000000..d1890a7
Binary files /dev/null and b/Android/app/src/main/res/font/spindles_end.ttf differ
diff --git a/Android/app/src/main/res/layout/activity_main.xml b/Android/app/src/main/res/layout/activity_main.xml
index 07813c0..dd1bb83 100644
--- a/Android/app/src/main/res/layout/activity_main.xml
+++ b/Android/app/src/main/res/layout/activity_main.xml
@@ -6,6 +6,25 @@
android:layout_height="match_parent"
android:background="?attr/colorSurface">
+
+
+
+
+
-
\ No newline at end of file
+
diff --git a/Android/app/src/main/res/layout/activity_splash.xml b/Android/app/src/main/res/layout/activity_splash.xml
new file mode 100644
index 0000000..f1f0509
--- /dev/null
+++ b/Android/app/src/main/res/layout/activity_splash.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
diff --git a/Android/app/src/main/res/layout/fragment_collections.xml b/Android/app/src/main/res/layout/fragment_collections.xml
index 60c9863..a551ef4 100644
--- a/Android/app/src/main/res/layout/fragment_collections.xml
+++ b/Android/app/src/main/res/layout/fragment_collections.xml
@@ -17,6 +17,56 @@
app:layout_constraintTop_toTopOf="parent"
tools:listitem="@layout/collection_list_item" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Android/app/src/main/res/values/strings.xml b/Android/app/src/main/res/values/strings.xml
index a4fef13..0288947 100644
--- a/Android/app/src/main/res/values/strings.xml
+++ b/Android/app/src/main/res/values/strings.xml
@@ -180,4 +180,12 @@
Imported binder successfully
MonsterCards Library
MonsterCards Dashboard
+
+ Dashboard is Empty
+ Pin monster cards or collections here for quick reference during your tabletop sessions.
+ No Collections Yet
+ Organize your monsters into custom campaign or encounter collections.
+ Your Library is Empty
+ Create new monster cards or import them from D&D Beyond or Open5e.
+ Monster Cards
diff --git a/Android/app/src/main/res/values/styles.xml b/Android/app/src/main/res/values/styles.xml
index be3f38c..b298f5a 100644
--- a/Android/app/src/main/res/values/styles.xml
+++ b/Android/app/src/main/res/values/styles.xml
@@ -1,6 +1,6 @@
-
+
+
+
diff --git a/icon.png b/icon.png
deleted file mode 100644
index e194030..0000000
Binary files a/icon.png and /dev/null differ
diff --git a/logo.png b/logo.png
deleted file mode 100644
index b1453a7..0000000
Binary files a/logo.png and /dev/null differ
diff --git a/shared/fonts/mountain-king-font.zip b/shared/fonts/mountain-king-font.zip
new file mode 100644
index 0000000..60246eb
Binary files /dev/null and b/shared/fonts/mountain-king-font.zip differ
diff --git a/shared/fonts/mountain-king/MountainKingRegular-woBYn.ttf b/shared/fonts/mountain-king/MountainKingRegular-woBYn.ttf
new file mode 100644
index 0000000..b4df1f6
Binary files /dev/null and b/shared/fonts/mountain-king/MountainKingRegular-woBYn.ttf differ
diff --git a/shared/fonts/mountain-king/info.txt b/shared/fonts/mountain-king/info.txt
new file mode 100644
index 0000000..95d7f6b
--- /dev/null
+++ b/shared/fonts/mountain-king/info.txt
@@ -0,0 +1,2 @@
+license: Creative Commons (by) Attribution
+link: https://www.fontspace.com/mountain-king-font-f119642
\ No newline at end of file
diff --git a/shared/fonts/mountain-king/misc/mountain_king_by_michael_w_moss.txt b/shared/fonts/mountain-king/misc/mountain_king_by_michael_w_moss.txt
new file mode 100644
index 0000000..16e2afe
--- /dev/null
+++ b/shared/fonts/mountain-king/misc/mountain_king_by_michael_w_moss.txt
@@ -0,0 +1,12 @@
+Mountain King Regular
+Version 1.0
+
+Designed by Michael W. Moss
+
+https://michaelwmoss.com
+Contact me at mechanismatic@gmail.com for questions or feedback.
+
+7/24/2024
+
+Copyright and Licensing:
+This work is licensed under a Creative Commons Attribution 4.0 International License. http://creativecommons.org/licenses/by/4.0/
\ No newline at end of file
diff --git a/shared/fonts/spindles-end-font.zip b/shared/fonts/spindles-end-font.zip
new file mode 100644
index 0000000..60246eb
Binary files /dev/null and b/shared/fonts/spindles-end-font.zip differ
diff --git a/shared/fonts/spindles-end/SpindlesEnd-YqV8.ttf b/shared/fonts/spindles-end/SpindlesEnd-YqV8.ttf
new file mode 100644
index 0000000..d1890a7
Binary files /dev/null and b/shared/fonts/spindles-end/SpindlesEnd-YqV8.ttf differ
diff --git a/shared/fonts/spindles-end/info.txt b/shared/fonts/spindles-end/info.txt
new file mode 100644
index 0000000..2fab2b2
--- /dev/null
+++ b/shared/fonts/spindles-end/info.txt
@@ -0,0 +1,2 @@
+license: Freeware
+link: https://www.fontspace.com/spindles-end-font-f2715
\ No newline at end of file
diff --git a/shared/fonts/spindles-end/misc/readme.txt b/shared/fonts/spindles-end/misc/readme.txt
new file mode 100644
index 0000000..19796e8
--- /dev/null
+++ b/shared/fonts/spindles-end/misc/readme.txt
@@ -0,0 +1,39 @@
+ __
+ _________ __ /\_\
+/\ _______\ /\ \ \/_/
+\ \ \______/ _\_\ \____ _____ __ _____ __ ___ ___ __ __ _____
+ \ \ \_______ X X /\____ ___\ /'____'\ /\ V_____\/\ V V \ /\ \ /\ V __ \
+ \ \ _______\ X X \/___/\ \__/ /\ \__L\ \\ \ \____/\ \ /\ /\ \\ \ \\ \ /_/\ \
+ \ \ \______/ X \ \ \ \ \ ____/ \ \ \ \ \ \ \ \ \ \\ \ \\ \ \ \ \ \
+ \ \ \_______ X X \ \ \___\ \ \___L__\ \ \ \ \ \ \ \ \ \\ \ \\ \ \ \ \ \
+ \ \_________\ X X \ \____\\ \_______\\ \_\ \ \_\ \_\ \_\\ \_\\ \_\ \ \_\
+ \/_________/ \/____/ \/_______/ \/_/ \/_/\/_/\/_/ \/_/ \/_/ \/_/
+
+
+ _____ __
+ / ___ \ /\ \
+ /\ \ \ \ _\_\ \____ ______ __ _____
+ \ \ \__\ \ /\____ ___\ / ____ \ /\ V_____\
+ \ > ___< \/___/\ \__/ /\ \__/\ \\ \ \____/
+ > \ \ \ \ \ \ \ \ \ \ \ \ \\ \ \
+ \ \ \__\ \ \ \ \___\ \ \_\_\ \\ \ \
+ \ \_____/ \ \____\\ \______/ \ \_\
+ \/____/ \/____/ \/_____/ \/_/
+
+
+
+
+ +-----------------------------------------------------------+
+ ¦ Spindle's End Font version 1 -2005 ¦
+ ¦ created by extermin8tor ¦
+ +-----------------------------------------------------------+
+:::::::::::::!Thanks for downloading this font!:::::::::::::
+
+I hope you enjoy using this font, please distribute it anywhere, and you may bundle it with anything eg. templates, etc. You do not have to leave any credit to me, but if you host this font on your site i would like you to leave it in the original package. This font may be modified. Thanks.
+
+Have fun using the font!!!!!!!!!!!!!!!
+;)
+
+For more fonts, templates, webmaster resources and much more visit www.bestfreetemplates.net.
+I make custom fonts as well as sites and HTML templates. Please visit my site, if you like this font. And if you dont, then go there and find something you Do like! :)
+If you have any questions or comments please mail me at extermin8tor(at)gmail.coma
\ No newline at end of file
diff --git a/shared/icon.png b/shared/icon.png
new file mode 100644
index 0000000..556a604
Binary files /dev/null and b/shared/icon.png differ
diff --git a/shared/logo.png b/shared/logo.png
new file mode 100644
index 0000000..27d44f3
Binary files /dev/null and b/shared/logo.png differ
diff --git a/shared/screenshots.png b/shared/screenshots.png
new file mode 100644
index 0000000..f4f9890
Binary files /dev/null and b/shared/screenshots.png differ
diff --git a/Screenshot_20260920_002454.png b/shared/screenshots/Screenshot_20260920_002454.png
similarity index 100%
rename from Screenshot_20260920_002454.png
rename to shared/screenshots/Screenshot_20260920_002454.png
diff --git a/Screenshot_20260920_002511.png b/shared/screenshots/Screenshot_20260920_002511.png
similarity index 100%
rename from Screenshot_20260920_002511.png
rename to shared/screenshots/Screenshot_20260920_002511.png
diff --git a/Screenshot_20260920_002529.png b/shared/screenshots/Screenshot_20260920_002529.png
similarity index 100%
rename from Screenshot_20260920_002529.png
rename to shared/screenshots/Screenshot_20260920_002529.png