mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-24 03:59:50 +02:00
pretty and visually functional stock and upgraded buttons
This commit is contained in:
1 parent
006b2fef78
commit
c678830fd2
6 files changed
+91
-47
No files matched your search
@@ -2443,7 +2443,7 @@
|
|||||||
|
|
||||||
"potpack": ["[email protected]", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
|
"potpack": ["[email protected]", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="],
|
||||||
|
|
||||||
"prettier": ["[email protected].1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
|
"prettier": ["[email protected].3", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw=="],
|
||||||
|
|
||||||
"pretty-bytes": ["[email protected]", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="],
|
"pretty-bytes": ["[email protected]", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="],
|
||||||
|
|
||||||
@@ -3247,6 +3247,8 @@
|
|||||||
|
|
||||||
"yaml-language-server/lodash": ["[email protected]", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
|
"yaml-language-server/lodash": ["[email protected]", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
|
||||||
|
|
||||||
|
"yaml-language-server/prettier": ["[email protected]", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
|
||||||
|
|
||||||
"yaml-language-server/request-light": ["[email protected]", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="],
|
"yaml-language-server/request-light": ["[email protected]", "", {}, "sha512-3Zjgh+8b5fhRJBQZoy+zbVKpAQGLyka0MPgW3zruTF4dFFJ8Fqcfu9YsAvi/rvdcaTeWG3MkbZv4WKxAn/84Lg=="],
|
||||||
|
|
||||||
"yaml-language-server/yaml": ["[email protected]", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
|
"yaml-language-server/yaml": ["[email protected]", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ=="],
|
||||||
|
|||||||
@@ -10,12 +10,28 @@
|
|||||||
border: none;
|
border: none;
|
||||||
|
|
||||||
font-family: var(--font-family-regular);
|
font-family: var(--font-family-regular);
|
||||||
font-size: var(--font-size-minor);
|
font-size: 0.75rem;
|
||||||
color: var(--gray-1);
|
color: var(--gray-1);
|
||||||
font-weight: var(--weight-medium);
|
font-weight: var(--weight-medium);
|
||||||
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
|
&[data-size="minor"] {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&[data-array="true"] {
|
||||||
|
&:first-child {
|
||||||
|
border-top-right-radius: 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:last-child {
|
||||||
|
border-top-left-radius: 0;
|
||||||
|
border-bottom-left-radius: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
svg,
|
svg,
|
||||||
img {
|
img {
|
||||||
width: 1em;
|
width: 1em;
|
||||||
@@ -33,6 +49,7 @@
|
|||||||
&[data-variant="surface"],
|
&[data-variant="surface"],
|
||||||
&[data-variant="soft"] {
|
&[data-variant="soft"] {
|
||||||
background-color: var(--accent-3);
|
background-color: var(--accent-3);
|
||||||
|
color: var(--gray-12);
|
||||||
}
|
}
|
||||||
|
|
||||||
&[data-variant="inverted"] {
|
&[data-variant="inverted"] {
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ export interface ButtonProps extends ComponentProps<"button"> {
|
|||||||
color?: Color;
|
color?: Color;
|
||||||
radius?: `${1 | 2 | 3}` | "max";
|
radius?: `${1 | 2 | 3}` | "max";
|
||||||
variant?: "solid" | "surface" | "soft" | "inverted" | "ghost" | "outline";
|
variant?: "solid" | "surface" | "soft" | "inverted" | "ghost" | "outline";
|
||||||
size?: "regular";
|
size?: "regular" | "minor";
|
||||||
|
array?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const LIGHT_TEXT_COLORS = new Set<Color>([
|
export const LIGHT_TEXT_COLORS = new Set<Color>([
|
||||||
@@ -32,6 +33,7 @@ export function Button({
|
|||||||
style,
|
style,
|
||||||
radius = "max",
|
radius = "max",
|
||||||
size = "regular",
|
size = "regular",
|
||||||
|
array = false,
|
||||||
...props
|
...props
|
||||||
}: ButtonProps) {
|
}: ButtonProps) {
|
||||||
return (
|
return (
|
||||||
@@ -42,6 +44,7 @@ export function Button({
|
|||||||
data-light-text={variant === "solid"}
|
data-light-text={variant === "solid"}
|
||||||
data-radius={radius}
|
data-radius={radius}
|
||||||
data-size={size}
|
data-size={size}
|
||||||
|
data-array={array}
|
||||||
{...props}
|
{...props}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,6 +2,4 @@
|
|||||||
padding: var(--space-3);
|
padding: var(--space-3);
|
||||||
|
|
||||||
aspect-ratio: 1 / 1;
|
aspect-ratio: 1 / 1;
|
||||||
|
|
||||||
font-size: var(--font-size-major);
|
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,11 @@
|
|||||||
.header {
|
.header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: var(--space-3);
|
gap: var(--space-4);
|
||||||
|
|
||||||
|
.upgrade-buttons {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.equipment {
|
.equipment {
|
||||||
@@ -33,16 +37,6 @@
|
|||||||
|
|
||||||
font-size: var(--space-5);
|
font-size: var(--space-5);
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
border-bottom-right-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&:last-child {
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-bottom-left-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
&[data-selected="true"] {
|
&[data-selected="true"] {
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ import { Price } from "../Price";
|
|||||||
import { Section } from "../Section";
|
import { Section } from "../Section";
|
||||||
import { Text } from "../Text";
|
import { Text } from "../Text";
|
||||||
import styles from "./index.module.css";
|
import styles from "./index.module.css";
|
||||||
|
import { IconButton } from "../IconButton";
|
||||||
|
import { Tank } from "@protos/tank";
|
||||||
|
|
||||||
export function TankopediaLoadout() {
|
export function TankopediaLoadout() {
|
||||||
const tank = useProtagonist();
|
const tank = useProtagonist();
|
||||||
@@ -164,6 +166,7 @@ function EquipmentOption({
|
|||||||
variant={isSelected ? "surface" : "soft"}
|
variant={isSelected ? "surface" : "soft"}
|
||||||
data-selected={isSelected}
|
data-selected={isSelected}
|
||||||
radius="1"
|
radius="1"
|
||||||
|
array
|
||||||
className={styles.slot}
|
className={styles.slot}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
Tankopedia.mutate((draft) => {
|
Tankopedia.mutate((draft) => {
|
||||||
@@ -183,45 +186,72 @@ function EquipmentOption({
|
|||||||
function Modules() {
|
function Modules() {
|
||||||
const strings = useStrings();
|
const strings = useStrings();
|
||||||
const tank = useProtagonist();
|
const tank = useProtagonist();
|
||||||
|
const upgrades = Tankopedia.use((state) => state.protagonist.upgrades);
|
||||||
|
const alternates = Tankopedia.use((state) => state.protagonist.alternates);
|
||||||
|
const isStock = useMemo(() => {
|
||||||
|
return tank.tank!.upgrade_lines.every((line) => {
|
||||||
|
if (isAlternativeLine(line.name)) return true;
|
||||||
|
return upgrades[line.name] === 0;
|
||||||
|
});
|
||||||
|
}, [upgrades]);
|
||||||
|
const isUpgraded = useMemo(() => {
|
||||||
|
return tank.tank!.upgrade_lines.every((line) => {
|
||||||
|
if (isAlternativeLine(line.name)) return true;
|
||||||
|
|
||||||
|
return (
|
||||||
|
upgrades[line.name] === line.stages.length - 1 ||
|
||||||
|
(line.name in alternates && alternates[line.name])
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}, [upgrades]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.section}>
|
<div className={styles.section}>
|
||||||
<div className={styles.header}>
|
<div className={styles.header}>
|
||||||
<Heading size="4">{strings.tanks.loadout.modules}</Heading>
|
<Heading size="4">{strings.tanks.loadout.modules}</Heading>
|
||||||
|
|
||||||
<Link
|
<div className={styles["upgrade-buttons"]}>
|
||||||
onClick={() => {
|
<IconButton
|
||||||
Tankopedia.mutate((draft) => {
|
variant={isStock ? "solid" : "soft"}
|
||||||
for (const line of tank.tank!.upgrade_lines) {
|
size="minor"
|
||||||
if (isAlternativeLine(line.name)) continue;
|
array
|
||||||
|
onClick={() => {
|
||||||
|
Tankopedia.mutate((draft) => {
|
||||||
|
for (const line of tank.tank!.upgrade_lines) {
|
||||||
|
if (isAlternativeLine(line.name)) continue;
|
||||||
|
|
||||||
draft.protagonist.upgrades[line.name] = 0;
|
draft.protagonist.upgrades[line.name] = 0;
|
||||||
draft.protagonist.alternates[line.name] = false;
|
draft.protagonist.alternates[line.name] = false;
|
||||||
}
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
color="gray"
|
|
||||||
>
|
|
||||||
<DoubleArrowLeftIcon />
|
|
||||||
</Link>
|
|
||||||
|
|
||||||
<Link
|
|
||||||
onClick={() => {
|
|
||||||
Tankopedia.mutate((draft) => {
|
|
||||||
for (const line of tank.tank!.upgrade_lines) {
|
|
||||||
draft.protagonist.upgrades[line.name] = line.stages.length - 1;
|
|
||||||
|
|
||||||
if (isAlternativeLine(line.name)) {
|
|
||||||
const original = originalLineName(line.name)!;
|
|
||||||
draft.protagonist.alternates[original] = true;
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
}}
|
||||||
}}
|
color="gray"
|
||||||
color="gray"
|
>
|
||||||
>
|
<DoubleArrowLeftIcon />
|
||||||
<DoubleArrowRightIcon />
|
</IconButton>
|
||||||
</Link>
|
|
||||||
|
<IconButton
|
||||||
|
variant={isUpgraded ? "solid" : "soft"}
|
||||||
|
size="minor"
|
||||||
|
array
|
||||||
|
onClick={() => {
|
||||||
|
Tankopedia.mutate((draft) => {
|
||||||
|
for (const line of tank.tank!.upgrade_lines) {
|
||||||
|
draft.protagonist.upgrades[line.name] =
|
||||||
|
line.stages.length - 1;
|
||||||
|
|
||||||
|
if (isAlternativeLine(line.name)) {
|
||||||
|
const original = originalLineName(line.name)!;
|
||||||
|
draft.protagonist.alternates[original] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
color="gray"
|
||||||
|
>
|
||||||
|
<DoubleArrowRightIcon />
|
||||||
|
</IconButton>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className={styles.lines}>
|
<div className={styles.lines}>
|
||||||
|
|||||||
Reference in new issue
Block a user