+ {data.inGameName && (
+
+ {t("user:ign.short")}{" "}
+ {data.inGameName}
+
+ )}
+ {typeof data.stickSens === "number" && (
+
+ {t("user:sens")}{" "}
+ {t("user:stick")} {rawSensToString(data.stickSens)}
+ {motionSensText}
+
+ )}
+
+ );
+}
+
function BadgeContainer(props: { badges: UserPageLoaderData["badges"] }) {
const { t } = useTranslation("badges");
const [badges, setBadges] = React.useState(props.badges);
diff --git a/app/styles/u.css b/app/styles/u.css
index a005cf2e6..9e4c9fffe 100644
--- a/app/styles/u.css
+++ b/app/styles/u.css
@@ -86,6 +86,26 @@
fill: #9146ff;
}
+.u__extra-infos {
+ display: flex;
+ max-width: 24rem;
+ flex-wrap: wrap;
+ gap: var(--s-2-5);
+ margin-inline: auto;
+}
+
+.u__extra-info {
+ padding: var(--s-1) var(--s-1-5);
+ background-color: var(--bg-darker);
+ border-radius: var(--rounded);
+ font-size: var(--fonts-xxs);
+}
+
+.u__extra-info__heading {
+ color: var(--theme);
+ font-weight: var(--bold);
+}
+
.u__badges {
display: flex;
max-width: 24rem;
diff --git a/app/utils/strings.ts b/app/utils/strings.ts
index e7fea579b..b120b99f7 100644
--- a/app/utils/strings.ts
+++ b/app/utils/strings.ts
@@ -21,3 +21,6 @@ export function placementString(placement: number) {
export function semiRandomId() {
return String(Math.random());
}
+
+export const rawSensToString = (sens: number) =>
+ `${sens > 0 ? "+" : ""}${sens / 10}`;
diff --git a/app/utils/zod.ts b/app/utils/zod.ts
index 2ef2dfd2c..f3cff80b9 100644
--- a/app/utils/zod.ts
+++ b/app/utils/zod.ts
@@ -61,6 +61,8 @@ export function undefinedToNull(value: unknown): unknown {
}
export function actualNumber(value: unknown) {
+ if (value === "") return undefined;
+
const parsed = Number(value);
return Number.isNaN(parsed) ? undefined : parsed;
diff --git a/public/locales/en/user.json b/public/locales/en/user.json
index 77ff1b649..2adfd9d68 100644
--- a/public/locales/en/user.json
+++ b/public/locales/en/user.json
@@ -1,10 +1,14 @@
{
"customUrl": "Custom URL",
"ign": "In-game name",
+ "ign.short": "IGN",
"country": "Country",
"bio": "Bio",
"stickSens": "R-stick sens",
"motionSens": "Motion sens",
+ "motion": "Motion",
+ "stick": "Stick",
+ "sens": "Sens",
"results.placing": "Placing",
"results.team": "Team",