diff --git a/packages/i18n/strings/en.json b/packages/i18n/strings/en.json index 81dc2d47e..708cc87a1 100644 --- a/packages/i18n/strings/en.json +++ b/packages/i18n/strings/en.json @@ -51,5 +51,13 @@ "avatars": { "search": "Search avatars...", "no_description": "Avatar has no description." + }, + + "grades": { + "0": "Unspecified", + "1": "Common", + "2": "Rare", + "3": "Epic", + "4": "Legendary" } } diff --git a/packages/website-ue/src/components/AvatarCard/index.module.css b/packages/website-ue/src/components/AvatarCard/index.module.css index 298b15503..e8492fd97 100644 --- a/packages/website-ue/src/components/AvatarCard/index.module.css +++ b/packages/website-ue/src/components/AvatarCard/index.module.css @@ -58,9 +58,31 @@ flex-direction: column; align-items: center; + padding: var(--space-2); + + &[data-grade="1"] .image { + outline: var(--space-2) solid var(--gray-9); + } + + &[data-grade="2"] .image { + outline: var(--space-2) solid var(--blue-9); + box-shadow: 0 0 var(--space-3) var(--blue-9); + } + + &[data-grade="3"] .image { + outline: var(--space-2) solid var(--purple-9); + box-shadow: 0 0 var(--space-4) var(--purple-9); + } + + &[data-grade="4"] .image { + outline: var(--space-2) solid var(--amber-9); + box-shadow: 0 0 var(--space-5) var(--amber-9); + } + .image { aspect-ratio: 7 / 8; width: 8rem; + border-radius: var(--space-3); background-size: cover; background-position: center; diff --git a/packages/website-ue/src/components/AvatarCard/index.tsx b/packages/website-ue/src/components/AvatarCard/index.tsx index 73c64ac2c..426e393e5 100644 --- a/packages/website-ue/src/components/AvatarCard/index.tsx +++ b/packages/website-ue/src/components/AvatarCard/index.tsx @@ -1,5 +1,7 @@ import { literals } from "@blitzkit/i18n"; -import { Grade } from "@protos/blitz_static_standard_grades_enum"; +import { Grade } from "@protos/auto_items"; +import { StarFilledIcon } from "@radix-ui/react-icons"; +import type { Color } from "../../core/ui/color"; import { useGameStrings } from "../../hooks/useGameStrings"; import { useStrings } from "../../hooks/useStrings"; import type { Avatar } from "../../protos/avatar"; @@ -20,9 +22,6 @@ const MAX_CARDS = 3; const CARD_TRIM = "var(--space-3)"; export function AvatarCard(props: PropsWithSkeleton) { - const gameStrings = useGameStrings("ProfileAvatarEntity"); - const strings = useStrings(); - const card = (
@@ -43,47 +42,67 @@ export function AvatarCard(props: PropsWithSkeleton) { {props.name} - {[...props.avatars].reverse().map((avatar) => { - const description = gameStrings[avatar.stuff_ui!.description]; - const obtaining = gameStrings[avatar.stuff_ui!.obtaining_methods]; - const hasDescription = description || obtaining; - - return ( -
-
-
- - {Grade[avatar.stuff_ui!.grade]} - -
- -
- - {hasDescription ? ( - <> - {description} {obtaining} - - ) : ( - strings.avatars.no_description - )} - -
-
- ); - })} +
); } +interface DetailsProps { + avatars: Avatar[]; +} + +const gradeColors: Record = { + [Grade.GRADE_GRADE_UNSPECIFIED]: "gray", + [Grade.GRADE_GRADE_COMMON]: "gray", + [Grade.GRADE_GRADE_RARE]: "blue", + [Grade.GRADE_GRADE_EPIC]: "purple", + [Grade.GRADE_GRADE_LEGENDARY]: "amber", +}; + +function Details({ avatars }: DetailsProps) { + const gameStrings = useGameStrings("ProfileAvatarEntity"); + const strings = useStrings(); + + return [...avatars].reverse().map((avatar) => { + const description = gameStrings[avatar.stuff_ui!.description]; + const obtaining = gameStrings[avatar.stuff_ui!.obtaining_methods]; + const hasDescription = description || obtaining; + + return ( +
+
+
+ + + {strings.grades[avatar.stuff_ui!.grade]} + +
+ +
+ + {hasDescription ? ( + <> + {description} {obtaining} + + ) : ( + strings.avatars.no_description + )} + +
+
+ ); + }); +} + interface SeriesProps { avatars: Avatar[]; } diff --git a/packages/website-ue/src/components/Badge/index.css b/packages/website-ue/src/components/Badge/index.module.css similarity index 59% rename from packages/website-ue/src/components/Badge/index.css rename to packages/website-ue/src/components/Badge/index.module.css index dc1f8479d..992576163 100644 --- a/packages/website-ue/src/components/Badge/index.css +++ b/packages/website-ue/src/components/Badge/index.module.css @@ -5,4 +5,13 @@ font-size: var(--font-size-minor); font-weight: var(--weight-medium); + + display: flex; + align-items: center; + gap: var(--space-2); + + .svg { + width: 1em; + height: 1em; + } } diff --git a/packages/website-ue/src/components/Badge/index.tsx b/packages/website-ue/src/components/Badge/index.tsx index bb98ffd6d..756715dc2 100644 --- a/packages/website-ue/src/components/Badge/index.tsx +++ b/packages/website-ue/src/components/Badge/index.tsx @@ -1,7 +1,8 @@ import type { ComponentProps } from "react"; import { classNames } from "../../core/ui/classNames"; import type { Color } from "../../core/ui/color"; -import "./index.css"; +import { LIGHT_TEXT_COLORS } from "../Button"; +import styles from "./index.module.css"; export interface BadgeProps extends ComponentProps<"div"> { color?: Color | "accent"; @@ -15,13 +16,14 @@ export function Badge({ highContrast, ...props }: BadgeProps) { + const lightText = LIGHT_TEXT_COLORS.has(color as Color); + return (
{ variant?: "solid"; } -const LIGHT_TEXT_COLORS = new Set([ - "purple", +export const LIGHT_TEXT_COLORS = new Set([ "gold", "bronze", "teal", "grass", + "amber", ]); export function Button({ diff --git a/packages/website-ue/src/pages/[...locale]/avatars/index.astro b/packages/website-ue/src/pages/[...locale]/avatars/index.astro index 34468ebac..62e9ac8b4 100644 --- a/packages/website-ue/src/pages/[...locale]/avatars/index.astro +++ b/packages/website-ue/src/pages/[...locale]/avatars/index.astro @@ -1,4 +1,5 @@ --- +import ColorScale from "../../../components/ColorScale.astro"; import ToolBanner from "../../../components/ToolBanner.astro"; import { tools } from "../../../core/tools/tools"; import BaseLayout from "../../../layouts/BaseLayout.astro"; @@ -10,6 +11,9 @@ const { locale } = Astro.props; --- + + +