Files
blitzkit/packages/website/src/components/Tankopedia/GameModeSection.tsx
T

123 lines
4.1 KiB
TypeScript
Raw Normal View History

2026-08-06 20:01:50 -05:00
import { alias } from "@blitzkit/core";
2026-01-02 12:09:23 -06:00
import { Box, Flex, Heading, Text } from "@radix-ui/themes";
2026-08-04 14:02:52 -05:00
import { api } from "../../core/blitzkit/api";
2026-01-02 12:09:23 -06:00
import { useLocale } from "../../hooks/useLocale";
import { Duel } from "../../stores/duel";
2024-08-16 12:52:29 -05:00
2024-11-29 13:20:27 -06:00
const [gameDefinitions, consumableDefinitions, provisionDefinitions] =
2026-08-30 14:26:08 -05:00
await Promise.all([api.game(), api.consumables(), api.provisions()]);
2024-09-21 20:26:58 -05:00
2024-08-16 12:52:29 -05:00
export function GameModeSection() {
2025-01-14 19:28:14 -06:00
const { unwrap, strings } = useLocale();
2024-08-16 12:52:29 -05:00
const tank = Duel.use((state) => state.protagonist.tank);
2024-08-16 20:06:37 -05:00
const roles = Object.entries(tank.roles);
if (roles.length === 0) return null;
2024-08-16 12:52:29 -05:00
return (
<Flex direction="column" gap="4" align="center">
2025-01-14 19:28:14 -06:00
<Heading size="6">
{strings.website.tools.tankopedia.game_modes.title}
</Heading>
2024-08-16 12:52:29 -05:00
2024-08-16 12:58:17 -05:00
<Flex justify="center" gap="4" wrap="wrap" px="4">
2024-08-16 20:06:37 -05:00
{roles.map(([key, value]) => {
2024-08-16 12:52:29 -05:00
const id = Number(key);
2024-10-05 16:44:07 -05:00
const gameMode = gameDefinitions.gameModes[id];
2024-08-16 12:52:29 -05:00
return (
<Flex
2024-08-19 20:29:18 -05:00
key={id}
2024-08-21 19:45:33 -05:00
width="16rem"
2024-08-19 13:45:12 -05:00
height="20rem"
2024-08-16 12:52:29 -05:00
overflow="hidden"
2024-08-16 19:41:03 -05:00
direction="column"
2024-08-16 12:52:29 -05:00
style={{
2026-01-02 12:09:23 -06:00
borderRadius: "var(--radius-3)",
2026-08-06 20:01:50 -05:00
background: `url(${alias(
"api",
`/gamemodes/${id}/banner.webp`,
)})`,
2026-01-02 12:09:23 -06:00
backgroundSize: "cover",
backgroundPosition: "center",
2024-08-16 12:52:29 -05:00
}}
>
<Box
2024-08-26 10:21:03 -05:00
flexGrow="1"
2024-08-16 12:52:29 -05:00
style={{
2026-08-06 20:01:50 -05:00
background: `url(${alias(
"api",
`/gamemodes/${id}/banner.webp`,
)})`,
2026-01-02 12:09:23 -06:00
backgroundSize: "cover",
backgroundPosition: "center",
2024-08-16 12:52:29 -05:00
}}
/>
<Flex
p="3"
2024-08-16 12:58:17 -05:00
direction="column"
2024-08-19 13:45:12 -05:00
height="98px"
flexShrink="0"
2024-08-16 12:52:29 -05:00
style={{
2026-01-02 12:09:23 -06:00
backdropFilter: "blur(4rem)",
WebkitBackdropFilter: "blur(4rem)",
2024-08-16 12:52:29 -05:00
}}
2024-08-16 14:09:58 -05:00
align="center"
justify="center"
2024-08-16 12:52:29 -05:00
>
2024-08-16 14:09:58 -05:00
<Text size="4" weight="bold">
2026-03-31 14:11:45 -05:00
{unwrap(gameMode.name!)}
2024-08-16 14:09:58 -05:00
</Text>
<Flex direction="column">
2024-10-05 16:44:07 -05:00
{gameDefinitions.roles[value].provisions.map((id) => {
const provisions = provisionDefinitions.provisions[id];
2024-08-16 14:09:58 -05:00
return (
2024-08-19 20:28:25 -05:00
<Text color="gray" wrap="nowrap" key={id}>
2024-08-16 14:09:58 -05:00
<Flex align="center" gap="1">
<img
style={{
2026-01-02 12:09:23 -06:00
width: "1.5em",
height: "1.5em",
objectFit: "contain",
2024-08-16 14:09:58 -05:00
}}
2026-08-06 20:01:50 -05:00
src={alias("api", `/icons/provisions/${id}.webp`)}
2026-03-31 14:11:45 -05:00
alt={unwrap(provisions.name!)}
2024-08-16 14:09:58 -05:00
/>
2026-03-31 14:11:45 -05:00
{unwrap(provisions.name!)}
2024-08-16 14:09:58 -05:00
</Flex>
</Text>
);
})}
2026-01-02 12:09:23 -06:00
2024-10-05 16:44:07 -05:00
{gameDefinitions.roles[value].consumables.map((id) => {
const consumable = consumableDefinitions.consumables[id];
2024-08-16 14:09:58 -05:00
return (
2024-08-19 20:28:56 -05:00
<Text color="gray" wrap="nowrap" key={id}>
2024-08-16 14:09:58 -05:00
<Flex align="center" gap="1">
<img
style={{
2026-01-02 12:09:23 -06:00
width: "1.5em",
height: "1.5em",
objectFit: "contain",
2024-08-16 14:09:58 -05:00
}}
2026-08-06 20:01:50 -05:00
src={alias("api", `/icons/consumables/${id}.webp`)}
2026-03-31 14:11:45 -05:00
alt={unwrap(consumable.name!)}
2024-08-16 14:09:58 -05:00
/>
2026-03-31 14:11:45 -05:00
{unwrap(consumable.name!)}
2024-08-16 14:09:58 -05:00
</Flex>
</Text>
);
})}
</Flex>
2024-08-16 12:52:29 -05:00
</Flex>
</Flex>
);
})}
</Flex>
</Flex>
);
}