From 9b488164e00fc392c1b532fd7f27de58d2fd6642 Mon Sep 17 00:00:00 2001 From: AnRil Date: Sun, 17 May 2026 18:00:52 +0700 Subject: [PATCH] =?UTF-8?q?release(v0.3.3):=20=D0=B0=D0=BA=D1=86=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=BD=D0=B0=D1=8F=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D1=84=D0=B8=D1=8F=20=E2=80=94=20=D0=B2=D1=81=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=B0=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20=D0=BA=D1=80?= =?UTF-8?q?=D1=83=D0=BF=D0=BD=D0=B5=D0=B5=20=D0=B8=20=D0=BA=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D1=81=D1=82=D0=BD=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Жалоба: вторичные подписи (Активных / До следующего / Трекинг матчей / Возобнови чтобы продолжить отсчёт) выглядели мелко и плохо читались. Сделан sweep по всему UI: - Базовая шкала secondary text: 12px → 13-14px - Контрастность подписей: text-text/45 → text-text/65 (или /75 для лейблов) - font-medium → font-semibold для метаданных карточек Dashboard: - Дата: 13/font-medium → 14/font-semibold - HeroStat label: 12/medium/55 → 14/semibold/75 (вот эти "Активных" и пр.) - HeroStat value: 26/semibold → 28/bold - HeroStat subvalue: 12/45 → 13/60/medium - HeroStat icon plaque: 24px → 28px - Paused banner title: 14 → 16, hint: 12 → 14/70 - Иконка баннера 36→40px Settings: - ToggleRow/SelectRow label: medium → semibold - Hint: 12/55 → 13/65/medium - "Конфигурация": 13/45/medium → 14/65/semibold Exercises/Challenges (row + page): - Row title: 15/medium → 16/semibold - Row subtitle: 13/55 → 14/65/medium - Стат-метрики bold - Empty state: 14/55 → 15/65/medium - Warning banner: 13/80 → 14/85/medium + иконка крупнее Games: - Game title: 17/semibold → 18/bold - Install path subtitle: 12/45 → 13/55/medium - Queue/error banners: 13/80 → 14/85/medium + крупнее иконки и code ExerciseCard: - Title: 17/semibold → 18/bold - Reps meta: 13/55 → 14/65/medium - Countdown label "Через/Сейчас": 11/45 → 12/60/semibold - Countdown value: 22/semibold → 24/bold - "Готово" CTA: 14/semibold → 15/bold, h-10 → h-11 ReminderApp: - "Время тренировки" label: 12/45 → 13 + accent цвет + bold - "Раз" подпись: 14/55 → 15/65/semibold - "Следующее через": 12/45 → 13/65/medium - Match summary header: 11/45 → 12/65/semibold - Match summary subtitle: 12/45 → 13/65/medium - Match summary total: 12/55 → 13/65/medium + 14 → 16 для числа - ChallengeRow title: 14/medium → 15/semibold - ChallengeRow subtitle: 12/55 → 13/65/medium - CTA Готово: 15/semibold → 16/bold UpdaterCard: - Cell title medium → semibold - Cell subtitle: 12/55 → 13/65/medium - Иконка ячеек 36→40px - Progress download title medium → semibold + 18px процент Card SectionHeader: - 12/medium/45 → 13/semibold/60 Co-Authored-By: Claude Opus 4.7 --- package.json | 2 +- src/renderer/src/ReminderApp.tsx | 40 ++++++++++---------- src/renderer/src/components/ExerciseCard.tsx | 10 ++--- src/renderer/src/components/UpdaterCard.tsx | 18 ++++----- src/renderer/src/components/ui/Card.tsx | 10 +++-- src/renderer/src/pages/Challenges.tsx | 22 +++++------ src/renderer/src/pages/Dashboard.tsx | 22 ++++++----- src/renderer/src/pages/Exercises.tsx | 8 ++-- src/renderer/src/pages/Games.tsx | 28 +++++++------- src/renderer/src/pages/Settings.tsx | 14 ++++--- 10 files changed, 92 insertions(+), 82 deletions(-) diff --git a/package.json b/package.json index dc61103..e631a99 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "laude", - "version": "0.3.2", + "version": "0.3.3", "description": "Exercise reminder — Windows desktop app", "main": "out/main/index.js", "author": "AnRil", diff --git a/src/renderer/src/ReminderApp.tsx b/src/renderer/src/ReminderApp.tsx index c97b14e..afe7522 100644 --- a/src/renderer/src/ReminderApp.tsx +++ b/src/renderer/src/ReminderApp.tsx @@ -139,7 +139,7 @@ function ExerciseReminder({ -
+
Время тренировки

@@ -150,11 +150,11 @@ function ExerciseReminder({ {exercise.reps} - раз + раз

-
- +
+ Следующее через {formatInterval(exercise.intervalMinutes)}
@@ -163,20 +163,20 @@ function ExerciseReminder({
@@ -208,8 +208,8 @@ function MatchSummaryView({ return (
-
- {summary.gameName} +
+ {summary.gameName}
-
+
Всего ·{' '} - + {totalReps} {' '} повторов @@ -326,14 +326,14 @@ function ChallengeRow({
{result.exerciseName}
-
- +
+ {result.statValue} {' '} {result.statLabel} → {result.name} diff --git a/src/renderer/src/components/ExerciseCard.tsx b/src/renderer/src/components/ExerciseCard.tsx index cc11abd..89f00b8 100644 --- a/src/renderer/src/components/ExerciseCard.tsx +++ b/src/renderer/src/components/ExerciseCard.tsx @@ -97,7 +97,7 @@ export function ExerciseCard({
-

+

{exercise.name}

@@ -138,19 +138,19 @@ export function ExerciseCard({ )}
-
+
{exercise.reps} раз · каждые {formatInterval(exercise.intervalMinutes)}
{/* Countdown + switch */}
-
+
{isDue ? 'Сейчас' : 'Через'}
@@ -172,7 +172,7 @@ export function ExerciseCard({ initial={{ opacity: 0, y: 4 }} animate={{ opacity: 1, y: 0 }} onClick={onMarkDone} - className="mt-4 w-full h-10 rounded-xl bg-accent text-white text-[14px] font-semibold inline-flex items-center justify-center gap-1.5 active:scale-[0.98] transition-transform" + className="mt-4 w-full h-11 rounded-xl bg-accent text-white text-[15px] font-bold inline-flex items-center justify-center gap-1.5 active:scale-[0.98] transition-transform" > Готово diff --git a/src/renderer/src/components/UpdaterCard.tsx b/src/renderer/src/components/UpdaterCard.tsx index 1eee41e..a70cc80 100644 --- a/src/renderer/src/components/UpdaterCard.tsx +++ b/src/renderer/src/components/UpdaterCard.tsx @@ -126,19 +126,19 @@ function Body({ return (
-
- +
+
-
+
Загружаем обновление
-
+
{mb(status.transferred)} / {mb(status.total)} МБ ·{' '} {(status.bytesPerSecond / 1024 / 1024).toFixed(2)} МБ/с
-
+
{pct.toFixed(0)}%
@@ -218,19 +218,19 @@ function Cell({ muted: 'bg-surface-2 text-text/55' }[tone] return ( -
+
{icon}
-
{title}
+
{title}
{subtitle && ( -
+
{subtitle}
)} diff --git a/src/renderer/src/components/ui/Card.tsx b/src/renderer/src/components/ui/Card.tsx index 11977b0..dd4b769 100644 --- a/src/renderer/src/components/ui/Card.tsx +++ b/src/renderer/src/components/ui/Card.tsx @@ -39,12 +39,16 @@ export function SectionHeader({ action?: ReactNode }): JSX.Element { return ( -
+
-
+
{title}
- {hint &&
{hint}
} + {hint && ( +
+ {hint} +
+ )}
{action}
diff --git a/src/renderer/src/pages/Challenges.tsx b/src/renderer/src/pages/Challenges.tsx index 3f76451..642fccf 100644 --- a/src/renderer/src/pages/Challenges.tsx +++ b/src/renderer/src/pages/Challenges.tsx @@ -48,14 +48,14 @@ export default function ChallengesPage(): JSX.Element {
-
+
Правила за матч

Челленджи

-

- Повторов = статистика × коэффициент +

+ Повторов = статистика × коэффициент

)} @@ -225,19 +225,21 @@ function HeroStat({
{icon}
-
{label}
+
{label}
-
+
{value}
{subvalue && ( -
{subvalue}
+
+ {subvalue} +
)}
) diff --git a/src/renderer/src/pages/Exercises.tsx b/src/renderer/src/pages/Exercises.tsx index 2a04d57..a1d292c 100644 --- a/src/renderer/src/pages/Exercises.tsx +++ b/src/renderer/src/pages/Exercises.tsx @@ -22,7 +22,7 @@ export default function Exercises(): JSX.Element {
-
+
Программа

@@ -79,7 +79,7 @@ export default function Exercises(): JSX.Element { {exercises.length === 0 && ( -
+
Программа пуста — добавь первое упражнение
@@ -126,10 +126,10 @@ function ExerciseRow({ onClick={onEdit} className="flex-1 min-w-0 text-left active:opacity-70 transition-opacity" > -
+
{exercise.name}
-
+
{exercise.reps} раз · {formatInterval(exercise.intervalMinutes)}
diff --git a/src/renderer/src/pages/Games.tsx b/src/renderer/src/pages/Games.tsx index da230b6..23b9fc1 100644 --- a/src/renderer/src/pages/Games.tsx +++ b/src/renderer/src/pages/Games.tsx @@ -61,18 +61,18 @@ export default function GamesPage(): JSX.Element {
-
+
Трекинг матчей

Игры

-

+

Подключи игру — челленджи сработают сразу после матча {liveCount > 0 && ( <> {' · '} - + {liveCount} live @@ -154,13 +154,13 @@ function GameCard({

-

+

{game.name}

{game.installPath && ( -
+
{game.installPath}
)} @@ -176,15 +176,15 @@ function GameCard({
{game.integrationActive && game.launchOptionStatus === 'queued' && ( -
+
-
+
Steam запущен. Параметр{' '} - + {game.launchOption} {' '} пропишется автоматически при следующем закрытии Steam. @@ -193,15 +193,15 @@ function GameCard({ )} {game.integrationActive && game.launchOptionStatus === 'no_user' && ( -
+
-
+
В Steam нет залогиненного аккаунта (нет папки{' '} - userdata). + userdata). Запусти Steam один раз и нажми «Установить интеграцию».
@@ -224,7 +224,7 @@ function GameCard({ )} {!game.installed && ( -
+
Установи игру в Steam и нажми «Обновить»
)} diff --git a/src/renderer/src/pages/Settings.tsx b/src/renderer/src/pages/Settings.tsx index ca0be39..bc5946c 100644 --- a/src/renderer/src/pages/Settings.tsx +++ b/src/renderer/src/pages/Settings.tsx @@ -21,7 +21,7 @@ export default function SettingsPage(): JSX.Element {
-
+
Конфигурация

@@ -132,9 +132,11 @@ function ToggleRow({ return (
-
{label}
+
{label}
{hint && ( -
{hint}
+
+ {hint} +
)}
@@ -160,9 +162,11 @@ function SelectRow({ return (
-
{label}
+
{label}
{hint && ( -
{hint}
+
+ {hint} +
)}