Adds a "Cards" tab to the Profile Background picker (BackgroundsView)
that selects a pattern applied to the entire user info card and the
extended profile container, in addition to the existing avatar-pad
background/stand/overlay layers.
- AvatarInfoUser/Utilities: propagate cardBackgroundId from RoomUserData.
- InfoStandWidgetUserView: stateful cardBackgroundId, applied as
.profile-card-background.card-background-{id} on the outer Column
with bg-color suppressed when active.
- UserContainerView: same class on the wrapper of the extended profile.
- BackgroundsView: 4th tab "cards" backed by cards.data config
(falls back to backgrounds.data); sends 4-id message via the
extended sendBackgroundMessage signature.
- ui-config.example: cards.data dataset (15 entries).
- BackgroundsView.css: 188 .card-background-{N} rules cloned from
background-{N} (repeat-tiled) plus 15 CSS-pattern overrides for the
provisional dataset (gradients, stripes, dots, grid, checker).
dangerouslySetInnerHTML is needed for compatibility with existing
external_texts keys that contain HTML markup (e.g. <b>Created:</b>).
Only the missing friends count line is added.
- Remove dangerouslySetInnerHTML for creation date and last login fields
which caused corrupted display
- Use separate LocalizeText keys with safe React rendering instead
- Add missing friends count display
New external_texts keys required:
extendedprofile.created.title, extendedprofile.last.login.title,
extendedprofile.friends.count
- Replace grid layout with NitroCard.Tabs for Badge, Amici, Stanze, Gruppi
- Add BadgeInfoView component with hover tooltip showing badge name/description
- Add Stanze tab that fetches and lists user rooms via NavigatorSearchComposer
- Bold username in profile header
- Badge tab with styled grid slots and empty state
- Amici tab with loading state
- Gruppi tab with full GroupsContainerView