Rework avatars.

Now we have a concept of an avatar at the server, realm, and scene level
and we have the groundwork for a realm store. New uesrs no longer props,
they get a default avatar. New system supports gender
{male,female,neutral} and {child,adult}.
This commit is contained in:
Evan Carroll 2026-01-22 21:04:27 -06:00
parent e4abdb183f
commit 6fb90e42c3
55 changed files with 7392 additions and 512 deletions

View file

@ -15,9 +15,10 @@ use leptos_router::{
use crate::components::{AuthenticatedLayout, LoginLayout};
use crate::pages::{
ConfigPage, DashboardPage, LoginPage, PropsDetailPage, PropsNewPage, PropsPage,
RealmDetailPage, RealmNewPage, RealmsPage, SceneDetailPage, SceneNewPage, ScenesPage,
StaffPage, UserDetailPage, UserNewPage, UsersPage,
AvatarsDetailPage, AvatarsNewPage, AvatarsPage, ConfigPage, DashboardPage, LoginPage,
PropsDetailPage, PropsNewPage, PropsPage, RealmAvatarsDetailPage, RealmAvatarsNewPage,
RealmAvatarsPage, RealmDetailPage, RealmNewPage, RealmsPage, SceneDetailPage, SceneNewPage,
ScenesPage, StaffPage, UserDetailPage, UserNewPage, UsersPage,
};
/// Admin routes that can be embedded in a parent Router.
@ -91,6 +92,23 @@ pub fn AdminRoutes() -> impl IntoView {
</AuthenticatedLayout>
} />
// Server Avatars
<Route path=StaticSegment("avatars") view=|| view! {
<AuthenticatedLayout current_page="avatars">
<AvatarsPage />
</AuthenticatedLayout>
} />
<Route path=(StaticSegment("avatars"), StaticSegment("new")) view=|| view! {
<AuthenticatedLayout current_page="avatars_new">
<AvatarsNewPage />
</AuthenticatedLayout>
} />
<Route path=(StaticSegment("avatars"), ParamSegment("avatar_id")) view=|| view! {
<AuthenticatedLayout current_page="avatars">
<AvatarsDetailPage />
</AuthenticatedLayout>
} />
// Realms
<Route path=StaticSegment("realms") view=|| view! {
<AuthenticatedLayout current_page="realms">
@ -120,6 +138,23 @@ pub fn AdminRoutes() -> impl IntoView {
</AuthenticatedLayout>
} />
// Realm Avatars (nested under realms)
<Route path=(StaticSegment("realms"), ParamSegment("slug"), StaticSegment("avatars")) view=|| view! {
<AuthenticatedLayout current_page="realm_avatars">
<RealmAvatarsPage />
</AuthenticatedLayout>
} />
<Route path=(StaticSegment("realms"), ParamSegment("slug"), StaticSegment("avatars"), StaticSegment("new")) view=|| view! {
<AuthenticatedLayout current_page="realm_avatars_new">
<RealmAvatarsNewPage />
</AuthenticatedLayout>
} />
<Route path=(StaticSegment("realms"), ParamSegment("slug"), StaticSegment("avatars"), ParamSegment("avatar_id")) view=|| view! {
<AuthenticatedLayout current_page="realm_avatars">
<RealmAvatarsDetailPage />
</AuthenticatedLayout>
} />
// Realm detail (must come after more specific realm routes)
<Route path=(StaticSegment("realms"), ParamSegment("slug")) view=|| view! {
<AuthenticatedLayout current_page="realms">