fix(tradein): a11y follow-up — sr-only th-текст + heading-order (#835) (#845)
All checks were successful
Deploy Trade-In / changes (push) Successful in 5s
Deploy Trade-In / test (push) Has been skipped
Deploy Trade-In / build-frontend (push) Successful in 1m35s
Deploy Trade-In / build-backend (push) Has been skipped
Deploy Trade-In / deploy (push) Successful in 37s

Co-authored-by: bot-frontend <bot-frontend@gendsgn.local>
Co-committed-by: bot-frontend <bot-frontend@gendsgn.local>
This commit is contained in:
bot-frontend 2026-05-30 21:13:19 +00:00 committed by bot-reviewer
parent 19c69be493
commit de6afc99fa
5 changed files with 22 additions and 8 deletions

View file

@ -128,7 +128,7 @@ export function DealsCard({ estimate }: Props) {
<th className="num"> / м²</th> <th className="num"> / м²</th>
<th className="num">Цена сделки</th> <th className="num">Цена сделки</th>
<th className="num">Дата</th> <th className="num">Дата</th>
<th aria-label="Действия" /> <th><span className="sr-only">Действия</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View file

@ -258,7 +258,7 @@ export function ListingsCard({ estimate, estimateId }: Props) {
<th className="num"> / м²</th> <th className="num"> / м²</th>
<th className="num">Стоимость</th> <th className="num">Стоимость</th>
<th className="num">Дист.</th> <th className="num">Дист.</th>
<th aria-label="Действия" /> <th><span className="sr-only">Действия</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View file

@ -215,7 +215,7 @@ export function OfferCard({ estimate, brandSlug }: Props) {
<path d="m15.5 7.5 3 3L22 7l-3-3" /> <path d="m15.5 7.5 3 3L22 7l-3-3" />
</svg> </svg>
</div> </div>
<h4>Экономия времени</h4> <h3>Экономия времени</h3>
<p>Берём на себя показы, переговоры и поиск покупателей. Менеджеру остаётся только подписать ДКП.</p> <p>Берём на себя показы, переговоры и поиск покупателей. Менеджеру остаётся только подписать ДКП.</p>
</div> </div>
<div className="advantage"> <div className="advantage">
@ -225,7 +225,7 @@ export function OfferCard({ estimate, brandSlug }: Props) {
<polyline points="9 22 9 12 15 12 15 22" /> <polyline points="9 22 9 12 15 12 15 22" />
</svg> </svg>
</div> </div>
<h4>Юридическая безопасность</h4> <h3>Юридическая безопасность</h3>
<p>Проверяем чистоту документов, ЕГРН, прописанных и обременения. Исключаем риски.</p> <p>Проверяем чистоту документов, ЕГРН, прописанных и обременения. Исключаем риски.</p>
</div> </div>
<div className="advantage"> <div className="advantage">
@ -236,7 +236,7 @@ export function OfferCard({ estimate, brandSlug }: Props) {
<circle cx="17.5" cy="17.5" r="2.5" /> <circle cx="17.5" cy="17.5" r="2.5" />
</svg> </svg>
</div> </div>
<h4>Фиксированная цена новостройки</h4> <h3>Фиксированная цена новостройки</h3>
<p>Сохраняем планировку в каталоге по цене на момент оценки до закрытия сделки.</p> <p>Сохраняем планировку в каталоге по цене на момент оценки до закрытия сделки.</p>
</div> </div>
<div className="advantage"> <div className="advantage">
@ -247,7 +247,7 @@ export function OfferCard({ estimate, brandSlug }: Props) {
<circle cx="12" cy="12" r="2" /> <circle cx="12" cy="12" r="2" />
</svg> </svg>
</div> </div>
<h4>Гарантия цены</h4> <h3>Гарантия цены</h3>
<p>Снимаем риск колебаний рынка выкупная стоимость зафиксирована в оффере на 30 дней.</p> <p>Снимаем риск колебаний рынка выкупная стоимость зафиксирована в оффере на 30 дней.</p>
</div> </div>
</div> </div>

View file

@ -165,7 +165,7 @@ export function StreetDealsCard({ estimate }: Props) {
<th className="num">/м²</th> <th className="num">/м²</th>
<th className="num">Дата</th> <th className="num">Дата</th>
{hasAnyListing && <th>Объявление до сделки</th>} {hasAnyListing && <th>Объявление до сделки</th>}
<th aria-label="Действия" /> <th><span className="sr-only">Действия</span></th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>

View file

@ -1348,7 +1348,7 @@
display: grid; place-items: center; display: grid; place-items: center;
margin-bottom: 4px; margin-bottom: 4px;
} }
.advantage h4 { .advantage h3 {
font-size: 14px; font-size: 14px;
letter-spacing: -0.005em; letter-spacing: -0.005em;
} }
@ -1967,6 +1967,20 @@
.discount-neg { color: var(--success); } .discount-neg { color: var(--success); }
.discount-pos { color: var(--danger); } .discount-pos { color: var(--danger); }
/* #835 a11y: визуально-скрытый текст для скринридеров (sr-only) для пустых
th-заголовков (empty-table-header требует ТЕКСТ, не aria-label). */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* Ячейка listing-колонки */ /* Ячейка listing-колонки */
.listing-cell { .listing-cell {
min-width: 200px; min-width: 200px;