Compare commits

..

5 Commits

Author SHA1 Message Date
7b0267f9ac Merge pull request 'fix(frontend): hide calendar popups on empty dates' (#25) from fix/calendar-hide-popover-empty-days into main
Some checks failed
CI / build-and-test (push) Has been cancelled
Reviewed-on: #25
2026-04-13 19:59:16 +00:00
Vaka.pro
a581ffaaff fix(frontend): hide calendar popups on empty dates
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
Keep race popovers limited to dates with events so empty days no longer show misleading hover details.

Made-with: Cursor
2026-04-13 22:58:36 +03:00
429a2924d7 Merge pull request 'fix(frontend): animate full race list row on hover (li, not inner link)' (#24) from fix/race-list-card-hover into main
Some checks failed
CI / build-and-test (push) Has been cancelled
Reviewed-on: #24
2026-04-13 19:51:07 +00:00
Vaka.pro
afb0f7ef31 fix(frontend): animate full race list row on hover (li, not inner link)
Some checks failed
CI / build-and-test (pull_request) Has been cancelled
Move scale/shadow transition to .race-card--action; keyboard focus ring on link.
Version 0.4.2.

Made-with: Cursor
2026-04-13 22:47:06 +03:00
92c2360feb Merge pull request 'fix(frontend): auto-completed on finish time, dashboard links, list/calendar UX' (#23) from fix/dashboard-form-races-ux into main
Some checks failed
CI / build-and-test (push) Has been cancelled
Reviewed-on: #23
2026-04-13 19:36:10 +00:00
4 changed files with 20 additions and 15 deletions

View File

@@ -1,12 +1,12 @@
{ {
"name": "calendar-run-frontend", "name": "calendar-run-frontend",
"version": "0.4.1", "version": "0.4.3",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "calendar-run-frontend", "name": "calendar-run-frontend",
"version": "0.4.1", "version": "0.4.3",
"dependencies": { "dependencies": {
"react": "^18.3.1", "react": "^18.3.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",

View File

@@ -1,7 +1,7 @@
{ {
"name": "calendar-run-frontend", "name": "calendar-run-frontend",
"private": true, "private": true,
"version": "0.4.1", "version": "0.4.3",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@@ -120,7 +120,7 @@ function CalendarMonthBlock(props: {
className={`races-cal__cell${hasRaces ? " races-cal__cell--has-race" : ""}${isOpen ? " races-cal__cell--open" : ""}`} className={`races-cal__cell${hasRaces ? " races-cal__cell--has-race" : ""}${isOpen ? " races-cal__cell--open" : ""}`}
onMouseEnter={() => { onMouseEnter={() => {
cancelClose(); cancelClose();
setOpenYmd(ymd); setOpenYmd(hasRaces ? ymd : null);
}} }}
onMouseLeave={scheduleClose} onMouseLeave={scheduleClose}
> >
@@ -132,7 +132,7 @@ function CalendarMonthBlock(props: {
}} }}
onFocus={() => { onFocus={() => {
cancelClose(); cancelClose();
setOpenYmd(ymd); setOpenYmd(hasRaces ? ymd : null);
}} }}
onBlur={(e) => { onBlur={(e) => {
const next = e.relatedTarget as Node | null; const next = e.relatedTarget as Node | null;
@@ -144,7 +144,7 @@ function CalendarMonthBlock(props: {
> >
{day} {day}
</button> </button>
{isOpen ? ( {isOpen && hasRaces ? (
<DayPopover <DayPopover
ymd={ymd} ymd={ymd}
races={dayRaces} races={dayRaces}
@@ -187,7 +187,7 @@ export function RacesCalendar(props: RacesCalendarProps): JSX.Element {
return ( return (
<div className="races-cal"> <div className="races-cal">
<p className="races-cal__hint">Наведите на дату краткая информация. Клик страница дня.</p> <p className="races-cal__hint">Наведите на дату с забегом краткая информация. Клик страница дня.</p>
{focusedMonthIndex === null || Number.isNaN(focusedMonthIndex) ? ( {focusedMonthIndex === null || Number.isNaN(focusedMonthIndex) ? (
<div className="races-cal__year"> <div className="races-cal__year">
{MONTH_NAMES_RU_SHORT.map((_, mi) => ( {MONTH_NAMES_RU_SHORT.map((_, mi) => (

View File

@@ -321,6 +321,15 @@ a {
.race-card--action { .race-card--action {
padding: 0; padding: 0;
overflow: visible; overflow: visible;
transition:
transform 0.15s ease,
box-shadow 0.15s ease;
}
.race-card--action:hover,
.race-card--action:focus-within {
transform: scale(1.02);
box-shadow: var(--shadow-card-lift);
} }
.race-card__link-surface { .race-card__link-surface {
@@ -333,16 +342,12 @@ a {
border-radius: var(--radius-sm); border-radius: var(--radius-sm);
color: inherit; color: inherit;
text-decoration: none; text-decoration: none;
transition: outline: none;
transform 0.15s ease,
box-shadow 0.15s ease;
} }
.race-card--action:hover .race-card__link-surface, .race-card__link-surface:focus-visible {
.race-card--action:focus-within .race-card__link-surface { outline: 2px solid var(--color-accent);
transform: scale(1.02); outline-offset: 2px;
box-shadow: var(--shadow-card-lift);
outline: none;
} }
.race-card__title-text { .race-card__title-text {