*, *::before, *::after { box-sizing: border-box; } html, body, #root { min-height: 100%; } body { margin: 0; font-family: var(--font-family-base); font-size: var(--font-size-body); line-height: var(--line-height-base); background: var(--color-bg); color: var(--color-text); } a { color: inherit; text-decoration: none; } .app-shell { min-height: 100vh; display: grid; grid-template-rows: auto 1fr; } .app-shell__header { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); padding: var(--space-4) var(--space-6); background: var(--color-surface); border-bottom: 1px solid var(--color-border); } .app-shell__brand { font-size: var(--font-size-h2); font-weight: 700; } .app-shell__nav { display: flex; align-items: center; gap: var(--space-2); } .app-shell__link { padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); color: var(--color-text-muted); } .app-shell__link:hover, .app-shell__link:focus-visible { color: var(--color-text); background: #eef2f6; outline: none; } .app-shell__link--active, .app-shell__link--active:hover, .app-shell__link--active:focus-visible { color: var(--color-surface); background: var(--color-accent); } .app-shell__main { width: min(1080px, 100%); margin: 0 auto; padding: var(--space-6); } .page { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-6); } .page__title { margin: 0 0 var(--space-2); font-size: var(--font-size-h1); } .page__subtitle { margin: 0; color: var(--color-text-muted); } .page__subtitle--error { color: var(--color-error); } .dashboard-grid { margin-top: var(--space-6); display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); } .dashboard-card { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-5); background: #fcfdff; } .dashboard-card__title { margin: 0 0 var(--space-3); font-size: var(--font-size-body); color: var(--color-text-muted); } .dashboard-card__value { margin: 0; font-size: var(--font-size-h2); font-weight: 700; color: var(--color-text); } .dashboard-card__meta { margin: var(--space-2) 0 0; color: var(--color-text); } .dashboard-card__hint, .dashboard-card__empty { margin: var(--space-2) 0 0; color: var(--color-text-muted); font-size: var(--font-size-caption); } .dashboard-section { margin-top: var(--space-6); } .dashboard-section__title { margin: 0 0 var(--space-4); font-size: var(--font-size-h2); } .dashboard-section__intro { margin: calc(var(--space-2) * -1) 0 var(--space-4); max-width: 42rem; color: var(--color-text-muted); font-size: var(--font-size-caption); line-height: 1.5; } .dashboard-grid--pr { margin-top: 0; } .comparison-table-wrapper { overflow-x: auto; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: #fcfdff; } .comparison-table { width: 100%; border-collapse: collapse; min-width: 720px; } .comparison-table th, .comparison-table td { padding: var(--space-3); text-align: left; border-bottom: 1px solid var(--color-border); } .comparison-table th { color: var(--color-text-muted); font-size: var(--font-size-caption); font-weight: 600; } .comparison-table tbody tr:last-child td { border-bottom: none; } .race-lists { margin-top: var(--space-6); display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); } .race-list { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-5); background: #fcfdff; } .race-list__title { margin: 0 0 var(--space-4); font-size: var(--font-size-h2); } .race-list__items { margin: 0; padding: 0; list-style: none; display: grid; gap: var(--space-3); } .race-list__empty { margin: 0; color: var(--color-text-muted); } .race-card { border: 1px solid var(--color-border); border-radius: var(--radius-sm); padding: var(--space-3); display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-3); background: var(--color-surface); } .race-card__title { margin: 0; font-weight: 600; } .race-card__link:hover, .race-card__link:focus-visible { text-decoration: underline; outline: none; } .race-card__meta { margin: var(--space-2) 0 0; color: var(--color-text-muted); font-size: var(--font-size-caption); } .race-card__status { display: inline-flex; align-items: center; white-space: nowrap; border-radius: 999px; padding: 0.2rem 0.5rem; font-size: var(--font-size-caption); font-weight: 600; } .race-card__status--planned { background: #edf3ff; color: var(--color-accent); } .race-card__status--completed { background: #ecf8f1; color: var(--color-success); } .race-card__status--registered { background: #fff4e0; color: #8a5a00; } .races-filter { margin-top: var(--space-5); display: flex; flex-wrap: wrap; gap: var(--space-4); align-items: flex-end; } .races-filter__field { display: flex; flex-direction: column; gap: var(--space-1); min-width: 10rem; } .races-filter__label { font-size: var(--font-size-caption); font-weight: 600; color: var(--color-text-muted); } .races-filter__select { font: inherit; padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); border: 1px solid var(--color-border); background: var(--color-surface); color: var(--color-text); } .pace-chart { margin-top: var(--space-4); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-4); background: #fcfdff; } .pace-chart__svg { display: block; width: 100%; max-width: 560px; height: auto; } .pace-chart__line { stroke: var(--color-accent); stroke-width: 1.5; vector-effect: non-scaling-stroke; } .pace-chart__caption { margin: var(--space-3) 0 0; font-size: var(--font-size-caption); color: var(--color-text-muted); } .pace-chart__empty { margin: var(--space-2) 0 0; color: var(--color-text-muted); font-size: var(--font-size-body); } .page-link { margin-top: var(--space-4); display: inline-flex; color: var(--color-accent); font-weight: 600; } .page-link:hover, .page-link:focus-visible { text-decoration: underline; outline: none; } .race-details-header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-4); } .race-details-grid { margin-top: var(--space-6); display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); } .race-details-card { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: var(--space-5); background: #fcfdff; } .race-details-card--notes { margin-top: var(--space-4); } .race-details-card__title { margin: 0 0 var(--space-3); font-size: var(--font-size-body); color: var(--color-text-muted); } .race-details-card__empty, .race-details-card__notes { margin: 0; color: var(--color-text-muted); } .race-details-meta { margin: 0; display: grid; gap: var(--space-3); } .race-details-meta__item { display: grid; gap: var(--space-1); } .race-details-meta__key { color: var(--color-text-muted); font-size: var(--font-size-caption); } .race-details-meta__value { margin: 0; font-weight: 600; color: var(--color-text); } /* ─── Buttons ──────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; padding: var(--space-2) var(--space-4); border: 1px solid transparent; border-radius: var(--radius-sm); font: inherit; font-weight: 600; font-size: var(--font-size-caption); cursor: pointer; text-decoration: none; white-space: nowrap; transition: background 0.15s, color 0.15s; } .btn:disabled { opacity: 0.55; cursor: not-allowed; } .btn--primary { background: var(--color-accent); color: var(--color-surface); } .btn--primary:hover:not(:disabled) { background: #1766be; } .btn--secondary { background: var(--color-surface); color: var(--color-text); border-color: var(--color-border); } .btn--secondary:hover:not(:disabled) { background: #eef2f6; } .btn--danger { background: var(--color-error); color: var(--color-surface); } .btn--danger:hover:not(:disabled) { background: #a82e2e; } /* ─── Confirm banner ───────────────────────────────────── */ .confirm-banner { margin-top: var(--space-4); padding: var(--space-4); border: 1px solid var(--color-error); border-radius: var(--radius-md); background: #fef2f2; } .confirm-banner__text { margin: 0 0 var(--space-3); font-weight: 600; color: var(--color-error); } .confirm-banner__actions { display: flex; gap: var(--space-3); } /* ─── Race details actions ─────────────────────────────── */ .race-details-actions { margin-top: var(--space-4); display: flex; gap: var(--space-3); } .race-details-meta__link { color: var(--color-accent); word-break: break-all; } .race-details-meta__link:hover { text-decoration: underline; } /* ─── Race form ────────────────────────────────────────── */ .race-form { margin-top: var(--space-6); } .race-form__group { margin: 0 0 var(--space-6); padding: var(--space-5); border: 1px solid var(--color-border); border-radius: var(--radius-md); background: #fcfdff; } .race-form__legend { font-size: var(--font-size-body); font-weight: 700; color: var(--color-text); padding: 0 var(--space-2); } .race-form__field { display: flex; flex-direction: column; gap: var(--space-1); margin-top: var(--space-4); } .race-form__field:first-of-type { margin-top: var(--space-3); } .race-form__label { font-size: var(--font-size-caption); font-weight: 600; color: var(--color-text-muted); } .race-form__input { font: inherit; padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); border: 1px solid var(--color-border); background: var(--color-surface); color: var(--color-text); } .race-form__input:focus { outline: 2px solid var(--color-accent); outline-offset: -1px; border-color: var(--color-accent); } .race-form__input--textarea { resize: vertical; min-height: 5rem; } .race-form__actions { display: flex; gap: var(--space-3); align-items: center; } .form-errors { margin: var(--space-3) 0 0; padding: var(--space-3) var(--space-5); border: 1px solid var(--color-error); border-radius: var(--radius-sm); background: #fef2f2; color: var(--color-error); font-size: var(--font-size-caption); } .form-errors__item { margin: var(--space-1) 0; } /* ─── Responsive ───────────────────────────────────────── */ @media (max-width: 900px) { .dashboard-grid, .race-lists, .race-details-grid { grid-template-columns: 1fr; } .race-details-header { flex-direction: column; } .race-form__actions { flex-direction: column; align-items: stretch; } }