This commit is contained in:
tresabhi committed 2026-10-31 16:56:42 -05:00
1 parent 4ae327b6fc
commit 234d927313
8 files changed
+157 -159

No files matched your search

@@ -16,11 +16,6 @@
cursor: pointer; cursor: pointer;
&[data-disabled="true"] {
cursor: default;
opacity: 0.5;
}
&[data-size="minor"] { &[data-size="minor"] {
font-size: 0.7em; font-size: 0.7em;
padding: var(--space-2) var(--space-3); padding: var(--space-2) var(--space-3);
@@ -67,6 +62,8 @@
width: 1.25em; width: 1.25em;
height: 1.25em; height: 1.25em;
margin: -0.25em 0;
object-fit: contain; object-fit: contain;
} }
@@ -78,6 +75,7 @@
background-color: var(--accent-8); background-color: var(--accent-8);
&[data-high-contrast="true"] { &[data-high-contrast="true"] {
color: var(--accent-1);
background-color: var(--accent-12); background-color: var(--accent-12);
} }
} }
@@ -111,4 +109,10 @@
outline: var(--space-1) solid var(--accent-11); outline: var(--space-1) solid var(--accent-11);
} }
} }
&[disabled] {
cursor: default;
opacity: 0.5;
outline: none;
}
} }
@@ -39,7 +39,6 @@ export function Button({
listChild, listChild,
parentListChild, parentListChild,
disabled,
highContrast, highContrast,
...props ...props
}: ButtonProps) { }: ButtonProps) {
@@ -54,8 +53,6 @@ export function Button({
data-list-child={listChild} data-list-child={listChild}
data-parent-list-child={parentListChild} data-parent-list-child={parentListChild}
data-high-contrast={highContrast} data-high-contrast={highContrast}
data-disabled={disabled}
disabled={disabled}
{...props} {...props}
/> />
); );
@@ -52,6 +52,9 @@
img, img,
svg { svg {
width: 1em;
height: 1em;
&:last-child { &:last-child {
margin-left: auto; margin-left: auto;
} }
@@ -65,12 +68,6 @@
display: flex; display: flex;
transform: translate(calc(-50% + var(--gutter) / 2), -50%); transform: translate(calc(-50% + var(--gutter) / 2), -50%);
img,
svg {
width: 1em;
height: 1em;
}
} }
} }
} }
@@ -2,10 +2,4 @@
padding: var(--space-3); padding: var(--space-3);
aspect-ratio: 1 / 1; aspect-ratio: 1 / 1;
img,
svg {
width: 0.75em;
height: 0.75em;
}
} }
@@ -1,4 +1,8 @@
.container { .container {
display: flex;
flex-direction: column;
gap: var(--space-4);
flex: 1; flex: 1;
.label { .label {
@@ -206,7 +206,7 @@ export const TankSearch = memo<TankSearchProps>(
}); });
return ( return (
<Flex className={styles.container} column gap="4"> <div className={styles.container}>
<TankSearchBar <TankSearchBar
skeleton={skeleton} skeleton={skeleton}
topResult={sorted[0]} topResult={sorted[0]}
@@ -288,7 +288,7 @@ export const TankSearch = memo<TankSearchProps>(
{!skeleton && sorted.length === 0 && ( {!skeleton && sorted.length === 0 && (
<TankSearchNoResults type="search" /> <TankSearchNoResults type="search" />
)} )}
</Flex> </div>
); );
}, },
); );
@@ -1,25 +1,39 @@
.nation { .filters {
.flag { display: flex;
position: absolute;
top: 0;
right: 0;
width: var(--space-7); gap: var(--space-3);
height: 100%;
background-size: 200%; .nation {
background-position: 0% 50%; .flag {
position: absolute;
top: 0;
right: 0;
width: var(--space-7);
height: 100%;
background-size: 200%;
background-position: 0% 50%;
}
}
.plus {
color: var(--gray-11);
} }
}
.plus { .icon {
color: var(--gray-11); filter: drop-shadow(var(--shadow-icon));
}
& + &:not([data-no-overlap]) {
margin-left: calc(-0.5em - var(--space-3));
}
.icon { &[data-no-overlap] {
filter: drop-shadow(var(--shadow-icon)); margin: 0 calc(-1 * var(--space-1));
}
}
& + & { .grouped {
margin-left: -0.5em; display: flex;
} }
} }
@@ -153,7 +153,7 @@ const TIERS = await awaitableTiers;
export function TankSearchFilters() { export function TankSearchFilters() {
return ( return (
<Flex gap="3" wrap> <div className={styles.filters}>
<TiersFilter /> <TiersFilter />
<ClassFilter /> <ClassFilter />
<TypeFilter /> <TypeFilter />
@@ -163,14 +163,14 @@ export function TankSearchFilters() {
<TestFilter /> <TestFilter />
<GunTypeFilter /> <GunTypeFilter />
<ShellFilter /> {/* <ShellFilter />
<ConsumablesFilter /> <ConsumablesFilter />
<ProvisionsFilter /> <ProvisionsFilter />
<GameModeAbilitiesFilter /> <GameModeAbilitiesFilter />
<ResetButton /> <ResetButton /> */}
</Flex> </div>
); );
} }
@@ -196,7 +196,7 @@ function TiersFilter() {
return ( return (
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="soft">
{tiers {tiers
.slice(0, MAX_ICONS) .slice(0, MAX_ICONS)
.map((tier) => romanize(tier)) .map((tier) => romanize(tier))
@@ -272,16 +272,14 @@ function NationsFilter() {
return ( return (
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="soft">
<Flex> {nations.map((nation) => (
{nations.map((nation) => ( <img
<img className={styles.icon}
className={styles.icon} key={nation}
key={nation} src={alias("api", `/flags/circle/${nation}.webp`)}
src={alias("api", `/flags/circle/${nation}.webp`)} />
/> ))}
))}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
@@ -355,18 +353,16 @@ function ClassFilter() {
return ( return (
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="soft">
<Flex> {classes.map((tankClass) => {
{classes.map((tankClass, index) => { return (
return ( <ClassIcon
<ClassIcon key={tankClass}
key={tankClass} class={tankClass}
class={tankClass} className={styles.icon}
className={styles.icon} />
/> );
); })}
})}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
@@ -435,24 +431,17 @@ function GunTypeFilter() {
return ( return (
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="soft">
<Flex> {gunTypes.map((gunType) => {
{gunTypes.map((gunType) => { return (
return ( <GunTypeIcon
<GunTypeIcon key={gunType}
key={gunType} type={gunType}
type={gunType} data-no-overlap
style={{ className={styles.icon}
margin: gunType === "regular" ? "0 -0.125em" : undefined, />
opacity: 1, );
color: "var(--gray-12)", })}
width: "1.25em",
height: "1.25em",
}}
/>
);
})}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
@@ -476,12 +465,13 @@ function GunTypeFilter() {
checked={selected} checked={selected}
key={gunType} key={gunType}
> >
<GunTypeIcon <DropdownMenu.ItemIndicator>
type={gunType} <CheckIcon />
style={{ width: "1.25em", height: "1.25em" }} </DropdownMenu.ItemIndicator>
/>
{strings.common.gun_types[gunType]} {strings.common.gun_types[gunType]}
<GunTypeIcon type={gunType} />
</DropdownMenu.CheckboxItem> </DropdownMenu.CheckboxItem>
); );
})} })}
@@ -498,8 +488,9 @@ function GunTypeFilter() {
}); });
}} }}
> >
<TrashIcon />
{strings.website.common.tank_search.clear} {strings.website.common.tank_search.clear}
<TrashIcon />
</DropdownMenu.Item> </DropdownMenu.Item>
</DropdownMenu.Content> </DropdownMenu.Content>
</DropdownMenu.Root> </DropdownMenu.Root>
@@ -514,22 +505,21 @@ function TypeFilter() {
return ( return (
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="soft">
<Flex gap="1"> {types.map((tankType) => {
{types.map((tankType) => { return (
return ( <ResearchedIcon
<ResearchedIcon style={{
style={{ color: `var(--${TANK_TYPE_COLORS[tankType]}-${
color: `var(--${TANK_TYPE_COLORS[tankType]}-${ tankType === TankType.TANK_TYPE_RESEARCHABLE ? "12" : "11"
tankType === TankType.TANK_TYPE_RESEARCHABLE ? "12" : "11" })`,
})`, }}
}} data-no-overlap
className={styles.icon} className={styles.icon}
key={tankType} key={tankType}
/> />
); );
})} })}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
@@ -730,10 +720,11 @@ function OwnershipFilterInternal() {
borderTopRightRadius: 0, borderTopRightRadius: 0,
borderBottomRightRadius: 0, borderBottomRightRadius: 0,
}} }}
listChild listChild="horizontal"
disabled={!wargaming} disabled={!wargaming}
variant={showOwned ? "solid" : "surface"} variant={showOwned ? "solid" : "soft"}
color={showOwned ? undefined : "gray"} color={showOwned ? undefined : "gray"}
highContrast={showOwned}
onClick={() => { onClick={() => {
TankFilters.mutate((draft) => { TankFilters.mutate((draft) => {
draft.showOwned = !draft.showOwned; draft.showOwned = !draft.showOwned;
@@ -750,10 +741,11 @@ function OwnershipFilterInternal() {
borderBottomLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: "-1px", marginLeft: "-1px",
}} }}
listChild listChild="horizontal"
disabled={!wargaming} disabled={!wargaming}
variant={showUnowned ? "solid" : "surface"} variant={showUnowned ? "solid" : "soft"}
color={showUnowned ? undefined : "gray"} color={showUnowned ? undefined : "gray"}
highContrast={showUnowned}
onClick={() => { onClick={() => {
TankFilters.mutate((draft) => { TankFilters.mutate((draft) => {
draft.showUnowned = !draft.showUnowned; draft.showUnowned = !draft.showUnowned;
@@ -772,15 +764,16 @@ function TestFilter() {
const showNonTesting = TankFilters.use((state) => state.showNonTesting); const showNonTesting = TankFilters.use((state) => state.showNonTesting);
return ( return (
<Flex> <div className={styles.grouped}>
<IconButton <IconButton
style={{ style={{
borderTopRightRadius: 0, borderTopRightRadius: 0,
borderBottomRightRadius: 0, borderBottomRightRadius: 0,
}} }}
variant={showNonTesting ? "solid" : "surface"} variant={showNonTesting ? "solid" : "soft"}
color={showNonTesting ? undefined : "gray"} color={showNonTesting ? undefined : "gray"}
listChild highContrast={showNonTesting}
listChild="horizontal"
onClick={() => { onClick={() => {
TankFilters.mutate((draft) => { TankFilters.mutate((draft) => {
draft.showNonTesting = !draft.showNonTesting; draft.showNonTesting = !draft.showNonTesting;
@@ -799,9 +792,10 @@ function TestFilter() {
borderBottomLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: "-1px", marginLeft: "-1px",
}} }}
variant={showTesting ? "solid" : "surface"} variant={showTesting ? "solid" : "soft"}
color={showTesting ? undefined : "gray"} color={showTesting ? undefined : "gray"}
listChild highContrast={showTesting}
listChild="horizontal"
onClick={() => { onClick={() => {
TankFilters.mutate((draft) => { TankFilters.mutate((draft) => {
draft.showTesting = !draft.showTesting; draft.showTesting = !draft.showTesting;
@@ -813,7 +807,7 @@ function TestFilter() {
style={{ width: "1em", height: "1em", color: "currentColor" }} style={{ width: "1em", height: "1em", color: "currentColor" }}
/> />
</IconButton> </IconButton>
</Flex> </div>
); );
} }
@@ -828,23 +822,21 @@ function ConsumablesFilter() {
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="surface">
<Flex> {consumables.slice(0, MAX_ICONS).map((consumable, index) => (
{consumables.slice(0, MAX_ICONS).map((consumable, index) => ( <img
<img key={consumable}
key={consumable} className={styles.icon}
className={styles.icon} src={alias("api", `/icons/consumables/${consumable}.webp`)}
src={alias("api", `/icons/consumables/${consumable}.webp`)} />
/> ))}
))}
{consumables.length > MAX_ICONS && ( {consumables.length > MAX_ICONS && (
<span className={styles.plus}> <span className={styles.plus}>
{literals(strings.common.units.plus, { {literals(strings.common.units.plus, {
value: consumables.length - MAX_ICONS, value: consumables.length - MAX_ICONS,
})} })}
</span> </span>
)} )}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
@@ -917,23 +909,21 @@ function ProvisionsFilter() {
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="surface">
<Flex> {provisions.slice(0, MAX_ICONS).map((provision, index) => (
{provisions.slice(0, MAX_ICONS).map((provision, index) => ( <img
<img key={provision}
key={provision} className={styles.icon}
className={styles.icon} src={alias("api", `/icons/provisions/${provision}.webp`)}
src={alias("api", `/icons/provisions/${provision}.webp`)} />
/> ))}
))}
{provisions.length > MAX_ICONS && ( {provisions.length > MAX_ICONS && (
<span className={styles.plus}> <span className={styles.plus}>
{literals(strings.common.units.plus, { {literals(strings.common.units.plus, {
value: provisions.length - MAX_ICONS, value: provisions.length - MAX_ICONS,
})} })}
</span> </span>
)} )}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>
@@ -1021,19 +1011,17 @@ function GameModeAbilitiesFilter() {
<DropdownMenu.Root modal={false}> <DropdownMenu.Root modal={false}>
<DropdownMenu.Trigger asChild> <DropdownMenu.Trigger asChild>
<Button color="gray" variant="surface"> <Button color="gray" variant="surface">
<Flex> {icons.slice(0, MAX_ICONS).map((icon, index) => (
{icons.slice(0, MAX_ICONS).map((icon, index) => ( <img key={icon} className={styles.icon} src={icon} />
<img key={icon} className={styles.icon} src={icon} /> ))}
))}
{icons.length > MAX_ICONS && ( {icons.length > MAX_ICONS && (
<span className={styles.plus}> <span className={styles.plus}>
{literals(strings.common.units.plus, { {literals(strings.common.units.plus, {
value: icons.length - MAX_ICONS, value: icons.length - MAX_ICONS,
})} })}
</span> </span>
)} )}
</Flex>
</Button> </Button>
</DropdownMenu.Trigger> </DropdownMenu.Trigger>