Компонент · рівень 1

Рядок посилань

Текст, що веде кудись. Дві гучності: тихе посилання в юридичному рядку, довідці й згоді, і гучне посилання, яке саме і є дією екрана.

рівень 1design/system/components/link-row.css270 рядківперебудовано на кроці 7.30
Анатомія

Розмітка нижче взята з продукту, не намальована для стенда: перший блок це юридичний рядок футера, другий - навігація діалогу входу.

© 2026 Stack. Спортивне харчування в Україні. · Політика · Умови · Змінити згоду
1Тихе - --text-secondary, на крок темніше за абзац навколо; підкреслення --line-strong, тонше за текст
2Гучне - --text-body, --fw-bold; підкреслення currentColor, тим самим чорнилом
3Наведення - тихе йде в --text-body, гучне в --text-action разом із підкресленням
4Фокус - --ring-focus-control на :focus-visible, з'явився на цьому кроці
Перепис: що було до кроку 7.30

Пораховано в браузері на 40 кольорових екранах при 1280: 124 підкреслених посилання і тринадцять редакцій у шести файлах. Плюс одне, яке не малював жоден файл, і одне, яке малював атрибут style у розмітці.

×дебуло: хто малювавстало: селекторщабель
87юридичний рядок футераінлайновий style у wireframes/_nav.js, без класу.wff-legal aтихе
24підвал чекаутуcheckout-form.css, без підкреслення.co-foot-links aтихе
6діалог входуlink-row.css, 600 / --line-strong.linkrow aгучне
5«Повернутися до магазину»auth-dialog.css.auth-foot aтихе
4оферта й політикаauth-dialog.css.auth-consent aтихе
4«Усі акції»banner.css, з двома !important.promo .ps aгучне
3«Залишити відгук»account-shell.css.ln-reviewгучне
2«Змінити номер»auth-dialog.css, 600 / --line-strong.auth-sub aгучне
2довідка чекаутуcheckout-form.css.co-help aтихе
2згода в чекаутіcheckout-form.css, без підкреслення.co-consent aтихе
2«Очистити все»chip.css.afilters .clearгучне
1«Завантажити квитанцію»account-shell.css.ob-receiptгучне
1скасувати оплатуcheckout-form.css.co-proc-cancelтихе
3overview.htmlнічого, синє #0000EE браузеране полагоджено-

Про 87 «без класу». Клас отримав не кожен якір, а обгортка: <span class="wff-legal">. Самі <a> як були без класу, так і лишилися - і це навмисно. Ці 87 малює одна рендер-функція; класу на батькові досить, щоб селектор існував, а 87 атрибутів у розмітці існували б лише для того, щоб їх там було 87. Правило тепер живе в CSS, а не в атрибуті - це і був дефект.

Найповторюваніше посилання сайту було єдиним, до якого не дотягувався жоден стиль. Правило 3 цієї теки каже: що повторюється на двох і більше екранах - їде в _wf.css. Це повторювалося на 129.

Дві гучності

Матриця осей, а не перелік входжень: кожен рядок це питання, на яке відповідає розмітка, і правило, за яким обирають.

ВісьТихеГучнеПравило вибору
Питаннямусить бутиі є дієюЯкщо прибрати посилання і екран далі працює - воно тихе.
Текст--text-secondary--text-bodyТихе темніше за абзац навколо, інакше його не знайти.
Насиченість400--fw-bold700 робить гучне читабельним як контрол на 12px, де живе 5 із 18.
Підкреслення--line-strongcurrentColorТихе не кричить, гучне підкреслене власним чорнилом.
Наведення→ --text-body→ --text-actionУ гучного текст і підкреслення йдуть разом: двоколірне наведення на 12px читається як збій рендера, а не як стан.
Розмір12 або 14, вирішує контекстФайл посилання не ставить font-size нікому, крім самого рядка.

Обидві незгоди - це одна незгода: насиченість 600 проти 700 стояла 8 до 10, підкреслення --line-strong проти чорнила - теж 8 до 10, і ці 8 щоразу ті самі: .linkrow a і .auth-sub a, дві сім'ї, які малює діалог входу. Не два розходження, а один файл, що розходиться з сайтом.

Цифру підкреслення без браузера дістати не можна було. У banner.css стояло text-decoration-color: var(--line-strong) для .promo .ps a, тобто за джерелом ці 4 йшли до вісімки. Але в розмітці був інлайновий text-decoration: underline, а шорткат скидає decoration-color у currentColor, і перебити інлайновий стиль не може жодна таблиця стилів. За джерелом розклад 12 до 6 і відповідь перевертається. Саме для цього правило каже читати з браузера, а не з тексту CSS.

Клавіатура

Чотири посилання діалогу входу - <a onclick> без href, а якір без href не бере фокус. Перевірено двічі: .focus(), викликаний на кожному, відмовлено; 120 кроків Tab на auth-code.html сіли на кнопку закриття і на всі комірки коду, і жодного разу на посилання.

Було

Діалог входу неможливо пройти з клавіатури. Закріплене рішення 5 веде через цей діалог тренера, покупця і новачка - усіх трьох.

Стало

uivDeadLinks() у design/_nav.js дає їм role="button", tabindex="0" і Enter / Space. Жодне з чотирьох нікуди не веде: три перемикають крок діалогу, четверте його закриває - тому кнопка, а не href="#", який оголошує неіснуючу адресу і засмічує історію.

Правило написане формою, а не переліком із чотирьох: a[onclick]:not([href]). Наступне таке посилання буде досяжним у день, коли з'явиться.

Ролі виявилося замало. Перевірка після правки показала, що Tab доходить лише до першого з чотирьох, а далі 41 крок поспіль сидить на input.box, яких у полі коду шість. Пастка фокуса лежала в іншому файлі: fields.js має правило «клік у порожню комірку садить туди, де робота», написане через focusin - а focusin не відрізняє клік від Tab, тому кожен крок уперед відтягувало назад до першої порожньої комірки. Три посилання з чотирьох стоять у DOM нижче поля коду, тож жодне з них не було досяжним.

Полагоджено там само: прапорець pointerdown, який focusin зчитує і гасить. Правило миші лишилося (клік у 6-ту комірку садить у 4-ту, перевірено), стрілки й авто-перехід при наборі не змінилися. Порядок Tab у діалозі тепер: закрити → «Змінити номер» → шість комірок коду → «Підтвердити» → «← Змінити номер» → «Ввів неправильний код?» → «Повернутися до магазину».

Усі входження в продукті

Кожна сім'я з перепису, живою розміткою. Тихі три ліворуч, гучні - праворуч.

Не проходить оплата? Спробуйте накладений платіж або Напишіть нам.

Публічна офертаКонфіденційністьПідтримка
Не отримали код? Повернутися до магазину

Ми надіслали SMS на номер +380 67 000 00 00. Змінити номер

Скасувати та повернутися до кошика
Залишити відгук
Завантажити квитанцію
Протеїн ✕Очистити все
Акція тижня
Знижка на весь Optimum Nutrition. Усі акції

У суцільному тексті SEO посилання не оголошує себе, доки на ньому немає курсора:

Протеїн для набору маси - це сироватковий концентрат із повним амінокислотним профілем.

Тут стояли дві пілюлі, і це був дефект - крок 7.30b. .flinks, ряд опцій фільтра, лишався в цьому файлі відтоді, як на 7.23 сам .flink поїхав у chip.css: переїхав чип, а його ряд забули. Тобто файл текстового посилання малював ряд чипів. У chip.css ті самі три оголошення вже стояли двічі - як .dr-chips і .cegoals; тепер це один рядок на три імені. Побачити це можна було тільки на стенді, зібраному з живої розмітки: на переліку класів такого не видно.

ПОВЕДІНКА НА ШИРИНІ - етап 10, крок 4

Від якого порогу: жодного. Що саме міняється: ряд переносить посилання через flex-wrap. Плинне з самого початку.
Коли вживати

Тихе - там, де перехід не є дією екрана: юридичні документи, згода, довідка, «повернутись». Гучне - там, де дія є, але вона другорядна для екрана, тому не заслуговує на коробку кнопки. Головну дію екрана робить Кнопка, і принцип 2 каже: така дія на екрані рівно одна.

.btn--text схожа на посилання і ним не є: це кнопка, яка скинула коробку, і вона лишається у button.css. Чотири «Читати більше» в переписі - саме вона, тому їх немає в жодній із двох гучностей.

Правило і антиправило

Правило

У тихого підкреслення тонше за текст. Помітно, що це посилання, і не рябить у рядку з п'яти.

Антиправило

Не роби посилання помаранчевим у суцільному тексті. Акцент на 13px тексті - 3.13:1, тобто нижче AA. Правило 19px bold стоїть у DESIGN-artifacts.md і порушується саме тут найчастіше.
Стани, що є в коді

У коді є :hover і :focus-visible. Другий з'явився на кроці 7.30: --ring-focus-control існує з кроку 6.2, і жодне посилання його не читало.

Натиску немає, і це записано крок 7.33

Крок 7.33 пройшов кожен атом, який можна натиснути, і дав тим, у кого є земля, відповідь на палець. Цей набір - найбільший з тих, хто не отримав нічого, і саме тому це абзац, а не пропуск: 601 посилання, що збігається з власними селекторами цього файлу, досяжне на 39 кольорових екранах - більше, ніж будь-яке одне сімейство контролів. Наступний прохід із питанням «що ще не відповідає на натиск» прийде сюди першим.

У текстового посилання немає землі. Рухати лишається тільки шрифт, а це button.css закрив ще на кроці 7.8 словами, які нема сенсу покращувати: шрифт, що стрибає під пальцем, гірший за відсутність відповіді. Колір, що змінюється, не краще - це те саме наведення, вистрелене вдруге, і на дотику воно блимнуло б раз і залипло до наступного тапу деінде.

Відповідь - це підкреслення, і воно намальоване у спокої. Саме для цього дві сходинки вище: посилання каже, що воно посилання, до того, як його торкнулись. Це і є стан, потрібний пальцю. Контрол, який зізнається, чим він є, лише поки над ним курсор, - це те, що цей файл виправив на 7.30.

.ln-review, .ob-receipt і .afilters .clear входять у відмову, хоч у кожного поруч стоїть сусід із коробом, який землю взяв. Вирішує те, чим річ є, а не те, біля чого вона стоїть.

Холостий контроль

Сторінка звіряє себе з файлом: 14 власних класів і 2 стани оголошено в link-row.css. Нижче - ті, яких на цій сторінці немає ні в демо, ні в розмітці. Чужий контекст (.clear, .ps) не рахується: у цих селекторах компонент не є підметом, він лише стоїть усередині когось.

Рух

Робота: ВІДПОВІДЬ. Рухається: color, text-decoration-color. Тривалість --dur-fast (150ms), крива --ease-standard. Значення читаються через var() з tokens.css: підміна токена в браузері веде за собою кожне з них, тобто числа у файлі немає. При prefers-reduced-motion рух зникає, а стан лишається.

Токени

Прочитані з link-row.css, не переписані руками. Колір іде лише через роль, геометрія - напряму з примітива.

Семантичні ролі (5)Примітиви (5)
--line-strong --ring-focus-control --text-action --text-body --text-secondary--fs-14 --fw-bold --radius-4 --size-44 --space-16
–--dur-fast --ease-standard

Десять токенів на 159 рядків - файл майже не має власної геометрії, і це правильно: посилання не має коробки. Розмір, відступ і місце дає компонент, усередині якого воно стоїть.

Розмітка
<!-- тихе: рядок усередині речення --> <span class="wff-legal">© 2026 Stack. · <a href="content-legal.html">Політика</a> · <a href="content-legal.html">Умови</a></span> <!-- гучне: окремий рядок під формою --> <div class="linkrow"><a onclick="wfAuthGo('phone')">← Змінити номер</a></div>

Другий приклад - це саме той <a onclick> без href, якому uivDeadLinks() дає роль і крок табуляції. Розмітка лишається такою, якою її пише заморожений сірий шар.

Де вживається

Якорі: .linkrow .wff-legal .auth-sub .auth-foot .auth-consent .co-help .co-consent .co-foot-links .co-proc-cancel .ln-review .ob-receipt .afilters .promo .seolink

Частина не зустрічається у розмітці екранів: футер, діалог входу і підвал чекауту будує рендер-функція у wireframes/_nav.js, тому сканування класів по html дає нуль, а на екранах вони є.

Немає в коді -> етап 09

Чого бракує

  • Немає :visited - жодне посилання сайту не показує, що за ним уже ходили
  • П'ятнадцять селекторів замість двох класів - .ln-review, .ob-receipt, .clear і решта мали б стати .tlink і .tlink--loud. Перейменування ламає сірий шар, тому це Крок 6, після етапу 09.
  • Три сині посилання на overview.html - #0000EE браузера на сторінці дизайн-системи. Знайдено на цьому кроці, не полагоджено: хаб не є продуктовим екраном.
  • Три інлайнові style="color:inherit" у .wff-soc - той самий дефект, що й у юридичного рядка, але це навігація футера, а не рядок посилань. Належить кроку футера.

Не домальовано наперед і не замовчано: етап 09 стартує з цього списку, зведеного в design/kit/docs/architecture.md.