refactor: migrate achievement panel styles from VE to SCSS + BEM

This commit is contained in:
Hachi-R 2025-01-18 22:03:56 -03:00
parent b41e3def4c
commit f74061a69b
4 changed files with 79 additions and 82 deletions

View file

@ -1,71 +0,0 @@
import { style } from "@vanilla-extract/css";
import { recipe } from "@vanilla-extract/recipes";
import { SPACING_UNIT, vars } from "../../theme.css";
export const panel = style({
width: "100%",
padding: `${SPACING_UNIT * 2}px ${SPACING_UNIT * 3}px`,
backgroundColor: vars.color.background,
display: "flex",
flexDirection: "column",
alignItems: "start",
justifyContent: "space-between",
borderBottom: `solid 1px ${vars.color.border}`,
});
export const content = style({
display: "flex",
gap: `${SPACING_UNIT}px`,
justifyContent: "center",
});
export const actions = style({
display: "flex",
gap: `${SPACING_UNIT}px`,
});
export const downloadDetailsRow = style({
gap: `${SPACING_UNIT}px`,
display: "flex",
color: vars.color.body,
alignItems: "center",
});
export const downloadsLink = style({
color: vars.color.body,
textDecoration: "underline",
});
export const progressBar = recipe({
base: {
position: "absolute",
bottom: "0",
left: "0",
width: "100%",
height: "3px",
transition: "all ease 0.2s",
"::-webkit-progress-bar": {
backgroundColor: "transparent",
},
"::-webkit-progress-value": {
backgroundColor: vars.color.muted,
},
},
variants: {
disabled: {
true: {
opacity: vars.opacity.disabled,
},
},
},
});
export const link = style({
textAlign: "start",
color: vars.color.body,
":hover": {
textDecoration: "underline",
cursor: "pointer",
},
});

View file

@ -0,0 +1,70 @@
@use "../../scss/globals.scss";
.achievement-panel {
width: 100%;
padding: globals.$spacing-unit * 2 globals.$spacing-unit * 3;
background-color: var(--color-background);
display: flex;
flex-direction: column;
align-items: start;
justify-content: space-between;
border-bottom: solid 1px var(--color-border);
&__content {
display: flex;
gap: globals.$spacing-unit;
justify-content: center;
align-items: center;
}
&__actions {
display: flex;
gap: globals.$spacing-unit;
}
&__download-details-row {
gap: globals.$spacing-unit;
display: flex;
color: var(--color-body);
align-items: center;
}
&__downloads-link {
color: var(--color-body);
text-decoration: underline;
}
&__progress-bar {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 3px;
transition: all ease 0.2s;
&::-webkit-progress-bar {
background-color: transparent;
}
&::-webkit-progress-value {
background-color: var(--color-muted);
}
&--disabled {
opacity: var(--opacity-disabled);
}
}
&__link {
text-align: start;
color: var(--color-body);
background: none;
border: none;
padding: 0;
&:hover {
text-decoration: underline;
cursor: pointer;
}
}
}

View file

@ -4,7 +4,7 @@ import { UserAchievement } from "@types";
import { useSubscription } from "@renderer/hooks/use-subscription"; import { useSubscription } from "@renderer/hooks/use-subscription";
import { useUserDetails } from "@renderer/hooks"; import { useUserDetails } from "@renderer/hooks";
import { vars } from "@renderer/theme.css"; import { vars } from "@renderer/theme.css";
import * as styles from "./achievement-panel.css"; import "./achievement-panel.scss";
export interface AchievementPanelProps { export interface AchievementPanelProps {
achievements: UserAchievement[]; achievements: UserAchievement[];
@ -28,15 +28,15 @@ export function AchievementPanel({ achievements }: AchievementPanelProps) {
if (!hasActiveSubscription) { if (!hasActiveSubscription) {
return ( return (
<div className={styles.panel}> <div className="achievement-panel">
<div className={styles.content}> <div className="achievement-panel__content">
{t("earned_points")} <HydraIcon width={20} height={20} /> {t("earned_points")} <HydraIcon width={20} height={20} />
??? / ??? ??? / ???
</div> </div>
<button <button
type="button" type="button"
onClick={() => showHydraCloudModal("achievements-points")} onClick={() => showHydraCloudModal("achievements-points")}
className={styles.link} className="achievement-panel__link"
> >
<small style={{ color: vars.color.warning }}> <small style={{ color: vars.color.warning }}>
{t("how_to_earn_achievements_points")} {t("how_to_earn_achievements_points")}
@ -47,8 +47,8 @@ export function AchievementPanel({ achievements }: AchievementPanelProps) {
} }
return ( return (
<div className={styles.panel}> <div className="achievement-panel">
<div className={styles.content}> <div className="achievement-panel__content">
{t("earned_points")} <HydraIcon width={20} height={20} /> {t("earned_points")} <HydraIcon width={20} height={20} />
{achievementsPointsEarnedSum} / {achievementsPointsTotal} {achievementsPointsEarnedSum} / {achievementsPointsTotal}
</div> </div>

View file

@ -1,6 +1,4 @@
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import * as styles from "./achievement-panel.css";
import HydraIcon from "@renderer/assets/icons/hydra.svg?react"; import HydraIcon from "@renderer/assets/icons/hydra.svg?react";
import { ComparedAchievements } from "@types"; import { ComparedAchievements } from "@types";
import { SPACING_UNIT } from "@renderer/theme.css"; import { SPACING_UNIT } from "@renderer/theme.css";
@ -18,7 +16,7 @@ export function ComparedAchievementPanel({
return ( return (
<div <div
className={styles.panel} className="achievement-panel"
style={{ style={{
display: "grid", display: "grid",
gridTemplateColumns: hasActiveSubscription ? "3fr 1fr 1fr" : "3fr 2fr", gridTemplateColumns: hasActiveSubscription ? "3fr 1fr 1fr" : "3fr 2fr",
@ -30,12 +28,12 @@ export function ComparedAchievementPanel({
{achievements.achievementsPointsTotal} {achievements.achievementsPointsTotal}
</div> </div>
{hasActiveSubscription && ( {hasActiveSubscription && (
<div className={styles.content}> <div className="achievement-panel__content">
<HydraIcon width={20} height={20} /> <HydraIcon width={20} height={20} />
{achievements.owner.achievementsPointsEarnedSum ?? 0} {achievements.owner.achievementsPointsEarnedSum ?? 0}
</div> </div>
)} )}
<div className={styles.content}> <div className="achievement-panel__content">
<HydraIcon width={20} height={20} /> <HydraIcon width={20} height={20} />
{achievements.target.achievementsPointsEarnedSum} {achievements.target.achievementsPointsEarnedSum}
</div> </div>