Кнопка
Основна дія екрана. Ця сторінка зібрана з перепису, а не зі стилю. Крок 6.7 переписав компонент цілком: 704 кнопки на 39 кольорових екранах носили 56 різних класів і давали 44 різні вигляди - тепер це обробка плюс модифікатори, 22 комбінації й 24 вигляди, з яких зайві - це стани (вимкнена, поточна сторінка, збережене) і текстова обробка, що навмисно бере тип від речення довкола.
btn--sbtn--icon, слово живе в aria-labelНомер підтверджено. у будь-який момент.
дія всередині речення -btn--text btn--inline, тип успадковується від реченняКрок 6.7. Кроки 6.1-6.6 звели правила й лишили імена: 704 кнопки на 39 екранах носили 56 різних класів і давали 44 різні вигляди. Тепер вигляд висить на класі, а старе ім'я лишається в розмітці як гачок компонента - де кнопка стоїть, а не яка вона.
.field - той самий рунг, і в цьому вся сутьbtn--full (ширина, не розмір) і btn--icon у комбінації з btn--text: гола позначка на картці, серце й кошик, у якої є коробка 44, але немає ґрунту.btn--text btn--icon · btn--fullВласник знайшов на сайті три кнопки й не знайшов їх на цій сторінці. Жодна з трьох не була помилкою розмітки, і всі три виявились претензією до стенда, а не до компонента. Знято обходом 39 кольорових екранів у двох в'юпортах: 657 видимих кнопок, з них залитих 235, контурних 159, текстових 153, з підкладкою 110.
У наборі вище великий розмір це 18px. На товарній сторінці «У кошик» - той самий btn--accent btn--l - міряється 18 на 1280 і 16 на 360. Це не дрейф, це правило, яке живе в button.css з кроку 6.8 і якого стенд не показував: сторінка показувала один в'юпорт, а компонент має два.
| Розмір | 1280 | 360 | Що рухається |
|---|---|---|---|
btn--s | 40 · 14px · 8/12 | 40 · 14px · 8/8 | лише бокове повітря |
| M (обробка сама) | 52 · 16px · 12/16 | 52 · 16px · 12/12 | лише бокове повітря |
btn--l | 64 · 18px · 16/24 | 64 · 16px · 16/16 | повітря і кегель |
btn--icon | 40 · 44 · 52 | без змін | нічого: палець не торгується |
Причина одна: кнопка не переносить рядок. У колонці 360 ширина 328, і три підписи в неї не вміщались - «Повідомити про надходження» роздувала блок покупки до 404 і гнала сторінку вбік. Тому нижче 480 кожен розмір віддає один щабель бокового повітря, а великий ще й сідає на кегель середнього. Висота й палець не рухаються ніколи.
«Для тренерів →» на банері й «Усі товари →» у заголовку розділу на стенді не було, бо стрілка не була з набору. Виміряно: 34 кнопки закінчувались типографським знаком (32 це →, 2 це ▾), і жодна не вживала компонент позначки, тоді як справжню кінцеву позначку носили рівно 8 кнопок - тригери меню, які малює menu.js. Три малюнки на два значення.
Спершу тут було написано, що так і треба, бо знак росте разом із підписом сам. Аргумент виявився неповним, і його зламала одна річ: → це U+2192, тобто частина підпису, і читач екрана вимовляє його. «Усі товари →» звучить як «Усі товари, стрілка вправо» - напрямок, прочитаний уголос як слово. Позначка з aria-hidden мовчить, а декорація й має мовчати. Що ж до росту разом із підписом - це вміє 1.15em у button.css, тож єдина перевага знака була в наборі й так.
Адресовано контролем і позицією, а не списком імен: будь-яка кнопка, чий підпис закінчується знаком із мапи, де б вона не стояла. Та сама поправка, яку на кроці 7 отримав вартовий числових полів: правило, що дістає лише туди, де хтось згадав ім'я, і є дефектом. Пробіл перед знаком іде разом із ним - кнопка це flex-ряд із gap, і збережений пробіл відсунув би позначку вдвічі далі за решту набору.
Популярні товари
Усі товари.sech .all:hoverДві позиції - два різні правила, і тепер обидва в коді. Ведуча позначка це іменник: вона називає річ, над якою дія, і має власну драбину - 18 / 20 / 24 за розміром кнопки. Кінцева позначка це пунктуація: вона каже, куди веде натиск, і росте разом із підписом - 1.15em, хоч би якого розміру була кнопка. До 7.5 друге правило жило в цьому абзаці й не діяло ніде: єдиним кінцевим знаком у продукті був набраний символ, який іншого вибору й не мав. Тепер це :last-child у button.css, і модифікатора знову не треба - бік уже сказала розмітка.
Каретка більше не намальована двічі. ▾ літерою на .dpcity був другим малюнком того самого знака; тепер це чеврон із icons.js, як на 8 тригерах меню. Разом із літерою пішов і .dpcar - спан, який існував тільки щоб зменшити її до 10px.
Спершу було закрито тільки для кнопок, і це було видно. Переміряно після 7.5: лишилось 20 кінцевих знаків, і жоден не на кнопці - «Докладніше про програму →», «Усі покупки →», «Як це працює →», ▾ у .chev, плюс усі шапки колонок мега-меню. Усе це посилання, а пас був адресований [class*="btn--"]: той самий знак і далі мав два малюнки, просто розділ переїхав на один клас убік.
Крок 7.6 переніс адресу з кнопки на контрол - a, button, summary, [role=button]. Не на ще один список імен, і не на текст: абзац у цей перелік не входить, тож копія лишається копією. Разом із цим і розмір переїхав із button.css у icon.css: пунктуація не може мати один кегель на кнопці й інший на посиланні, тож правило тепер одне - .uiv-ic.uiv-trail svg{ 1.15em }, і воно однакове скрізь.
Клас btn--text на стенді один, а на сайті він рендериться кількома способами, і обробка навмисне оголошувала font-size: inherit, тобто тип бере не вона, а речення довкола. На кроці 7.8 це перевірили лічбою, і речення виявилось мовчазним. Браузер обійшов 39 кольорових екранів і зняв 163 елементи з класом btn--text у 12 комбінаціях. Одиниця тут інша, ніж у переписі вище: там рахували форми кнопок, тут - кожен елемент, разом із голими серцями.
| × | Де стоїть | Гачок | Кегель | Чорнило |
|---|---|---|---|---|
| З ПІДПИСОМ - сім комбінацій, і всі сім міряють 14 | ||||
| 28 | заголовок розділу, «Усі товари →» | .sech .all | 14 | вторинне |
| 12 | рядок кошика, «Змінити» / «Видалити» | .ci-lnk · .strong | 14 | основне |
| 3 | картка профілю, «Змінити - код у SMS» | .pf-act.pf-actbtn | 14 | основне |
| 3 | чекаут, «Списати бонуси» | .co-toggle | 14 | основне |
| 3 | адреси, «‹ Інший спосіб» | .addr-back | 14 | основне |
| 1 | профіль, «Видалити акаунт» | .pf-dangerbtn | 14 | основне |
| БЕЗ ПІДПИСУ - п'ять комбінацій, кожна зі своїм числом і своєю причиною | ||||
| 92 | серце на картці, три стани | .fav · .wlrm · .fav.on | інертний | вторинне / акцент |
| 14 | фільтр, «+ ще 11» | .fmore | 12 | вторинне |
| 7 | серце на картці-рядку | .pcard-l .lfav | 18 | вторинне |
Сім із семи підписів дали 14 - і жоден не взяв це число зі спадкування. Кожен написав його своєю рукою, у своєму файлі: section-head, cart-row, checkout-form (двічі), address-card. П'ять власників на одне значення, і inherit, який не вирішував нічого в жодному з них. Це і є форма, якої дрейф набуває до того, як стає дрейфом: поки що все правильно, але місця, куди прийти й змінити, не існує.
Зроблено на кроці 7.8: .btn--text{ font-size: var(--fs-14) }, п'ять повторів знято. Вага лишилась на inherit - її ніхто не міряв, тож і рухати нема підстав. Переміряно 73 сторінки у двох в'юпортах, 135 256 елементів, 33 властивості плюс геометрія: жодна текстова кнопка продукту не зрушила ні на піксель. Три рядки без підпису теж не зрушили - .fmore і .lfav тримають власні числа, а в іконкових коробка 44 і позначка 20 абсолютні, тому кегель під ними інертний.
А ось стенд зрушив, і саме в цьому був сенс. Зразки btn--text на цій сторінці малювались 16-м, бо демо-коробка навколо них 16-та - тобто стенд показував текстову кнопку більшою, ніж її бачить покупець. Це той самий розрив «у системі один кегель, на продукті інший», з якого почався крок 7. Тепер зразок нижче міряє 14, як і на сайті.
Раніше тут стояло відкрите рішення власника - «дати базу 14 / вторинне чорнило», з розрахунку «14 у 43 випадках з 57, вторинне в 42 з 57». Половина того розрахунку була хибна, і хиба була в одиниці: рахувались екземпляри, а 83 однакових серця на картках перетягували підсумок на вторинне чорнило. За комбінаціями класів картина протилежна - з семи підписів шість носять основне чорнило, і виняток рівно один, .sech .all. База --text-body вже стояла правильно, і чорнило не рухали.
Чотири рядки таблиці стоять на одному екрані - це картка профілю в кабінеті: «Змінити - код у SMS» біля телефону, «Додати - код на пошту» біля пошти, «Змінити» біля мови, «Видалити акаунт» унизу. До кроку 7.6 вони носили ще й btn--inline і через це рахувались окремо.
Знахідка, і вона проти чинного коду. btn--inline оголошений для кнопки, що стоїть усередині речення, де більше ніщо не каже, що це контрол - і сам button.css додає: «у ряду контролів позицію вже сказано». Виміряно всі чотири: три стоять у .pf-row, це flex з space-between, притиснуті праворуч, і в тому вузлі поруч із ними немає жодного слова; четверта стоїть сама у своєму блоці. Жодна не всередині речення. Тоді я дописав «а справжнього вживання в продукті немає взагалі» - і це виявилось неправдою, знайшов власник. Хиба методу, не арифметики: я міряв елементи, які вже носили btn--inline, і робив висновок з них, замість шукати ті, які мали б його носити. Справжнє вживання є, воно одне, і про нього нижче, у пункті 5. Тобто підкреслення, яке малює btn--inline, тут прикраса, якої власне правило системи не просить: сусід по задачі - .sech .all, 28 таких самих текстових дій праворуч у ряду, і в них підкреслення немає, роботу робить ховер. Знято на кроці 7.6 за рішенням власника: усі чотири втратили btn--inline, підкреслення зникло, чорнило й ховер не рухались (основне в спокої, акцент під курсором). Після цього btn--inline не вживається в продукті жодного разу - як і btn--ghost середнього розміру, він лишається в наборі оголошеним і невжитим, і сторінка каже це вголос замість того, щоб показувати його як щось наявне.
Сторінка каже S 40 · M 52 · L 64, і це правда для кнопки з підписом. Браузер обійшов 39 екранів і зміряв 504 кнопки з коробкою: на цій драбині стоять 233. Решта 271 - не хаос, а всього вісім видів, і сім із восьми це два числа, 44 і 46.
| Висота | × | Хто | Звідки |
|---|---|---|---|
| 44 | 101 | .cartbtn · .cartbtn.notify · .co-getcode · .menu-trig | Своя драбина, і вона законна. btn--icon оголошує 40 / 44 / 52 просто тому, що квадрату нема від чого міряти ширину. 44 це мінімум пальця, і на ньому ж стоять поле (field.css) і рядок меню (menu.css). |
| 46 → 44 | 136 | .wfh-act.numbtn · .wfh-act.stack · .wfh-cabbtn | Було єдине число такої висоти в системі. --size-46 більше не тримає жодного контролу - тільки спінери й мініатюри. Опущено до 44 на кроці 7.8. |
| 37 → 41 | 34 | .go, пошук у шапці | Не дефект. Кнопка стоїть усередині поля і бере його внутрішню грань: 44 мінус рамка 1.5 з двох боків. Так само, як текстова обробка бере кегель від речення - просто це правило ніде не було назване. |
Чому саме клампом, а не «хай самі». Зняли кламп і зміряли: .numbtn дав 40 і 43 (один несе двоповерхові підпис+значення, другий просто слово), а .stack - 60.6 і 63, бо це колонка, позначка над підписом. Чотири різні числа в одному ряду - це рівно те, для чого клампи існують. Питання було тільки в числі, і відповідь уже стояла в системі: 44, мінімум пальця, на якому в цьому ж ряду стоїть кошик. Перевірено на всіх 34 сторінках із шапкою: на 44 вміст не вилазить за коробку ніде, на 40 - не вміщається.
Поле пошуку піднялось назустріч з 40 на 44, і тепер увесь рядок шапки має одну висоту. Воно читає field-grp--s, чия єдина робота і є 40, тому це перекриття в header.css, а не зміна щабля: малий інпут скрізь інде лишається 40. Шапка це поверхня для пальця, і її контролам місце на мінімумі пальця, а не під ним. Зняти --s із розмітки не можна звідси - вона живе в спільному wireframes/_nav.js; це записано на крок 6.
Знайшов власник, зі скріншота: <a class="more" href="#seo">Читати більше ↓</a> у ввідному абзаці лістингу. Виміряно: <a>, inline, 14px, 700, акцент. Дія, написана словами всередині речення - рівно те, для чого оголошений btn--text btn--inline, і рівно те, чого за моїм записом на 7.6 у продукті «немає взагалі». Чотири входження на чотирьох сторінках лістингу, і це єдиний чесний --inline у крамниці.
Сироватковий, ізолят, казеїн і рослинний протеїн від перевірених брендів. Для кожного товару показуємо склад, походження і сертифікат - щоб ви бачили, що берете. Читати більше ↓
--inline: усередині речення позиція нічого не каже, тож контрол мусить сказати про себе сам.Разом із кнопкою переїхав і абзац. .lintro і .lintro .more лежали в loyalty-rung.css - файлі про щаблі лояльності - хоча .lintro стоїть на 11 сторінках (index, три home, сім listing) і на жодному екрані лояльності. Розділ на кроці 3 переніс їх туди просто тому, що в _wf.css вони лежали поруч. Тепер вони в seo-text.css, і це не «кудись подалі»: у SEO-тексту два кінці - ввідний абзац під H1 і повний блок з id="seo" внизу тієї самої сторінки, а href="#seo" веде з першого в другий. Один компонент, один файл.
Що зрушило. 73 сторінки × 2 в'юпорти: рухнули рівно чотири елементи - самі посилання. display з inline на inline-flex (коробка бере всю висоту рядка, 17 → 22.4, базова лінія на місці), text-decoration з none на underline. Абзац не перевився, висота його лишилась 44.8, і жоден інший елемент на жодній сторінці не зрушив - тобто перенесення правил між файлами не програло жодної гонки в каскаді. Решта різниць у знімку - ті самі скелетони й спінери, шум приладу.
Було відкрито, ЗАКРИТО 12.08.2026 - рішення власника. 14px bold акцентом - це 3.13:1 на білому, а DESIGN-artifacts.md пускав акцент на текст лише від 19px bold. Бар'єр провели через ціну і не приклали більше ні до чого. Приклали на 8.19, до всього продукту одразу: для крамниці недобір за AA прийнятний, і ця кнопка лишається помаранчевою. Вона одна з шести названих класів - повний перепис і числа на color.html.
on: збережене серце наливаєтьсяbtn--ghost середнього розміру, бо обробка з підкладкою живе тільки в малому розмірі. До 7.3 звірка не сходилась в обидва боки: btn--outline btn--icon btn--s стояла на 5 екранах і на стенді її не було. Форма «з позначкою» не має власного класу і не потребує його: кнопка це inline-flex з gap, тож позначка перед підписом стоїть ліворуч, а після - праворуч, і розмітка вже це сказала. У Figma це властивість компонента (icon: none / left / right), у коді - порядок вузлів. Чого їй бракувало, так це правила: біля одного й того ж 14px підпису чорнило позначки міряло 15, 17, 18, 19 і 21. Тепер його вирішує розмір кнопки - S 18 · M 20 · L 24. Лічильники шапки показані всіма чотирма станами - вони єдині, хто носить у кнопці два рядки, і це не перенос: підпис і значення це дві різні речі, вирівняні по лівому краю. Крок 6.10. Два серця в ряду «іконкова» несуть той самий рядок класів і різняться станом on: збережене наливається. До 6.10 воно виглядало точно як незбережене, бо «збережено» описували три файли трьома різними наборами властивостей - .pcard .fav.on лише чорнилом, .pcard-l .lfav.on чорнилом і заливкою, .bb .wish.on ще й рамкою - і жоден із трьох не діяв поза своєю карткою. Тепер це один стан у button.css, як і вимкнена. Лічильники стоять на спільній підлозі 124px, знятій з найширшого порожнього стану: порожній - єдиний, чию ширину тримає копірайт, тому саме він задає підлогу, і шапка більше не смикається на 25px, коли приходить число.Це знімок ДО перепису класів, і він лишається на сторінці, бо саме він і був підставою переписати компонент. Ліва колонка - імена, яких більше не існує як вигляду: сьогодні кожен із цих рядків це btn плюс обробка плюс розмір, а старе ім'я лишилось у розмітці тільки як гачок компонента.
Браузер обійшов 39 кольорових екранів у двох в'юпортах і зняв 8523 клікабельних елементів. Кнопкою-дією з них виявились 57 форм, і оголошують їх 38 файлів - button.css лише один із них. Ось і весь діагноз: атом був не файлом, а звичкою, повтореною в сорока місцях.
Підсвічені рядки - той самий вигляд під різними іменами: три й більше класів з однаковою обробкою, радіусом і кеглем. немає у колонці станів - форма без ховера, натиску й вимкненого стану; таких 2 серед кнопок-дій і 14 разом із текстовими.
Колонку станів перезнято на кроці 6.2, і вона змінилась у 25 рядках. Стан не можна знайти пошуком по тексту css: .wff-msg має ховер через .wff-col a:hover - правило, яке ніде не називає цей клас, - а .btn не має жодного, хоча button.css містить і .btn, і :hover. Тепер кожне правило зі станом на суб'єкті позбавляється псевдокласу і проганяється через querySelectorAll на живому екрані: стан зараховано, якщо елемент повернувся. Рахунок ведеться по екземплярах, тому 7 з 58 у колонці означає рівно те, що написано - ховер існує лише в одному контейнері й формі не належить. Таких форм 4.
| × | обробка | клас | оголошує | висота | радіус | ширина | стани |
|---|---|---|---|---|---|---|---|
| 1035 | текстова | без класу«6» | поза системою | 20,22,30,32,34,38,39,45,53,61 | 0px,8px | auto/fixed/full | :hover :active :focus-visible :disabled 1143 з 1154 |
| 408 | текстова | .dr-cat | cart-drawer | 50 | 0px | full | немає |
| 350 | текстова | .fopt | filter-group | 22,45 | 0px | fixed | :hover |
| 306 | текстова | .dr-link | cart-drawer | 47 | 0px | fixed | немає |
| 188 | іконка · акцент | .cartbtn | button | 40,44 | 8px | fixed | :hover :active :focus-visible :disabled |
| 184 | текстова | .nm | account-shell+gallery+product-card | 36,44 | 0px | fixed | :hover |
| 170 | текстова | .wf-tab | mega-menu+tabbar | 59 | 0px | fixed | немає |
| 166 | іконка · гола | .fav | favourite+product-card | 44 | 0px | fixed | :hover :focus-visible :disabled |
| 140 | текстова | .fh | filter-group | 22 | 0px | fixed | :hover |
| 116 | текстова | .wff-msg | footer | 30 | 0px | full | :hover |
| 86 | іконка · гола | без класу | поза системою | 32 | 0px | fixed | :hover :disabled |
| 68 | текстова | .wfh-logo | header+section-head | 21 | 0px | fixed | немає |
| 68 | контур | .wfh-act.numbtn | button+header | 46 | 8px | fixed | :hover :active :focus-visible :disabled |
| 59 | контур | .btn | 16 файлів | 41,53,64 | 8px,12px | fixed/full | :hover :active :focus-visible :disabled |
| 58 | акцент | без класу«Підписатись» | button | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
| 58 | текстова | .wff-phone | footer | 34 | 0px | full | :hover |
| 58 | текстова | .seolink | link-row | 15,34 | 0px | fixed/full | :hover |
| 56 | текстова | .all | section-head | 30 | 8px | fixed | :hover |
| 56 | підкладка | .acc-link | account-shell | 40,47 | 0px,100px | fixed | :hover |
| 55 | текстова | .wfh-act.stack | header | 46 | 8px | fixed | :hover :disabled |
| 48 | підкладка + контур | .acc-link | account-shell | 40,47 | 0px,100px | fixed | :hover |
| 45 | акцент | .btn.dark | 16 файлів | 41,53,64 | 8px,12px | fixed/full | :hover :active :focus-visible :disabled |
| 34 | текстова | .wfh-burger | header | 30 | 0px | fixed | немає |
| 34 | текстова | .dr-city | cart-drawer | 47 | 0px | fixed | немає |
| 34 | текстова | .dr-link.strong | cart-drawer | 47 | 0px | fixed | немає |
| 34 | акцент | .navbtn | header | 41 | 8px | full | :hover |
| 34 | текстова | .navlink | header | 41 | 8px | fixed | :hover |
| 34 | акцент | .go | header+status-pill+system-page | 38 | 8px | fixed | :hover |
| 32 | підкладка + контур | без класу«За ціллю» | поза системою | 41 | 100px | fixed | :hover |
| 24 | контур | без класу«2» | поза системою | 34 | 8px | fixed | :hover :active :focus-visible |
| 22 | текстова | .ci-lnk | button+cart-row | 22,45,67 | 0px | fixed | :hover :focus-visible :disabled |
| 16 | підкладка | без класу«Склад ▾» | поза системою | 62 | 0px | full | :hover |
| 14 | підкладка + контур | .btn.dark | 16 файлів | 41,53,64 | 8px,12px | fixed/full | :hover :active :focus-visible :disabled |
| 14 | контур | .mc | button+toolbar | 53 | 8px | fixed | :hover :active :focus-visible :disabled |
| 14 | контур | .loadmore | button+pagination | 53 | 8px | fixed | :hover :active :focus-visible :disabled |
| 14 | текстова | .lnm | product-card | 20,45 | 0px | fixed | немає |
| 14 | іконка · гола | .lfav | product-card | 20 | 0px | fixed | :hover :disabled |
| 13 | текстова | .wfh-act.stack.wfh-cabbtn | header | 46 | 8px | full | :hover :disabled |
| 12 | текстова | .lnk | account-shell | 20,22,45 | 0px | fixed | :hover |
| 12 | іконка · гола | .wlrm | favourite | 44 | 0px | fixed | :hover :focus-visible :disabled |
| 10 | іконка · підкладка | .cartbtn.notify | button | 40,44 | 8px | fixed | :hover :active :focus-visible :disabled |
| 10 | контур | .auth-x | auth-dialog | 38 | 8px | fixed/full | :hover |
| 10 | акцент | .auth-cta | auth-dialog | 52,56,61 | 12px | fixed | :hover |
| 10 | текстова | .co-logo | checkout-form | 21 | 0px | fixed | немає |
| 10 | акцент | .on | 22 файлів | 34,35,38 | 0px,8px | fixed | :hover :focus-visible 14 з 18 |
| 10 | іконка · контур | без класу | поза системою | 34 | 8px | fixed | :hover :active :focus-visible |
| 8 | акцент | .acc-link | account-shell | 40,47 | 0px,100px | fixed | :hover |
| 8 | підкладка + контур | .acc-link.logout | account-shell | 40,46 | 0px,100px | fixed | :hover |
| 8 | підкладка | .acc-link.logout | account-shell | 40,46 | 0px,100px | fixed | :hover |
| 7 | текстова | .x | 5 файлів | 19,32 | 0px | fixed | немає |
| 7 | підкладка + контур | .ctrl.uiv-sort | stepper | 41 | 8px | fixed | :hover |
| 7 | іконка · акцент | .on | 22 файлів | 34,35,38 | 0px,8px | fixed | :hover :focus-visible 14 з 18 |
| 7 | іконка · підкладка | без класу | поза системою | 35 | 0px | fixed | :hover |
| 6 | текстова | .pf-act.pf-actbtn | button+checkout-form | 22 | 0px | fixed | :hover :focus-visible :disabled |
| 6 | іконка · гола | .fav.on | favourite+product-card | 44 | 0px | fixed | :hover :focus-visible :disabled |
| 6 | підкладка + контур | .sbtn | button | 53 | 8px | full | :hover :active :focus-visible :disabled |
| 6 | контур | .cd-x | cart-drawer | 36 | 8px | fixed | :hover |
| 6 | текстова | .co-toggle | button+checkout-form | 22 | 0px | fixed | :hover :focus-visible :disabled |
| 6 | акцент | .co-confirm | checkout-form | 61 | 12px | fixed | :hover |
| 6 | підкладка + контур | .co-soc | button+checkout-form | 41,64 | 8px | fixed | :hover :active :focus-visible :disabled |
| 6 | іконка · контур | .wish | button+buy-box | 54 | 12px | fixed | :hover :active :focus-visible :disabled |
| 4 | акцент | .btn.dark.rk-add | 16 файлів | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
| 4 | контур | .btn.cd-cont | 16 файлів | 64 | 12px | fixed | :hover :active :focus-visible :disabled |
| 4 | підкладка + контур | .co-edit | button+checkout-form | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
| 4 | контур | .co-city | button+checkout-form | 53,78 | 8px | fixed/full | :hover :active :focus-visible :disabled |
| 4 | текстова | .on | 22 файлів | 34,35,38 | 0px,8px | fixed | :hover :focus-visible 14 з 18 |
| 4 | акцент | .addcart | buy-box | 61 | 12px | fixed | :hover |
| 4 | підкладка + контур | .dpcity | buy-box | 40 | 8px | fixed | :hover :active :focus-visible :disabled |
| 4 | підкладка | .ord-h | order-row | 70,153,213 | 0px | fixed | немає |
| 4 | текстова | .lead | filter-rail | 38 | 0px | fixed | :hover |
| 3 | акцент | .mba | buy-bar | 61 | 12px | fixed | :hover |
| 2 | акцент | .btn.dark.addr-add | 16 файлів | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
| 2 | текстова | .ob-receipt | account-shell | 22 | 0px | fixed | :hover |
| 2 | акцент | .btn.dark.ob-repeat | 16 файлів | 41 | 8px | full | :hover :active :focus-visible :disabled |
| 2 | акцент | .btn.dark.pf-save | 16 файлів | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
| 2 | текстова | .pf-dangerbtn | button+checkout-form | 22 | 0px | fixed | :hover :focus-visible :disabled |
| 2 | контур | .auth-alt | auth-dialog+button | 64 | 12px | fixed | :hover :active :focus-visible :disabled |
| 2 | текстова | .optin | checkbox | 45 | 0px | fixed | немає |
| 2 | контур | .btn.gh | 16 файлів | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
| 2 | текстова | .ci-lnk.strong | button+cart-row | 45,67 | 0px | fixed | :hover :focus-visible :disabled |
| 2 | акцент | .btn.dark.cd-fix | 16 файлів | 64,93 | 12px | fixed | :hover :active :focus-visible :disabled |
| 2 | підкладка + контур | .cd-blocked | button+cart-drawer | 53 | 8px | fixed | немає |
| 2 | акцент | .btn.dark.cd-cta | 16 файлів | 64 | 12px | fixed | :hover :active :focus-visible :disabled |
| 2 | акцент | .co-proc-go | checkout-form | 61,90 | 12px | fixed | :hover |
| 2 | текстова | .co-proc-cancel | checkout-form | 22 | 0px | fixed | немає |
| 2 | заливка чорнилом | .co-getcode | checkout-form | 44,47 | 8px | fixed | :hover |
| 2 | контур | .btn.oosback | 16 файлів | 53 | 8px | fixed | :hover :active :focus-visible :disabled |
| 2 | контур | .pmback | gallery | 35 | 0px | fixed | :hover |
| 1 | підкладка + контур | .ob-collapse | account-shell+button | 41 | 8px | fixed | :hover :active :focus-visible :disabled |
Ширина не є розміром: 48 форм auto проти 4 full. Full - виняток, і він ніколи не змінює обробку.
Матриця осей, а не перелік входжень: кожен рядок це питання, на яке відповідає розмітка, і правило, за яким обирають.
| Вісь | Значення | Правило вибору |
|---|---|---|
| Наголос | залита 235 · контурна 159 · текстова 153 · підкладка 110 · обернена 0 | Заливка акцентом означає головну дію ділянки, і вона в ділянці одна. Оберненої обробки в кольоровому шарі немає - переміряно на кроці 7.3, і рядок про білу заливку був неправдою: клас .dark носять 34 кнопки, і всі 34 малюються звичайним акцентом. Обернену заливку мав сірий прототип, у колір вона не переїхала. До кроку 7.9 один випадок із 34 був живий - .fsheet-foot .btn.dark{ flex: 2 }, гачок розкладки. Саме він і був проблемою: сторінка мусила носити виняток, який читають один раз, а розмітку не можна було вимести, не зламавши підвал шторки. 7.9 перевів це правило на .btn--accent - не перейменування, а власне сенс: акцент і є головна дія ділянки, тому саме він отримує подвійну частку. Тепер клас dark у кольоровому шарі не означає нічого, і те саме зроблено з btn: його тримали 11 правил, усі про одне - як контрол ділить рядок. Обидва імені знімаються з розмітки на кроці 6 уже механічно. |
| Вміст | текст · іконка+текст · текст+стрілка · лише іконка 188 | Ведуча іконка - дія тут («У кошик», «Продовжити з Google»). Кінцева стрілка - перехід звідси («Для тренерів →»). Лише іконка - там, де слово не вміщається і робота однозначна з контексту. Тоді потрібна назва для читача екрана: з 559 таких кнопок 518 її мають, 41 ні. |
| Розмір | малий 40 · середній 52 · великий 64іконкова: 40 · 44 · 52 | Диктує контейнер, а не важливість: рядок списку бере малий, картка і форма - середній, смуга покупки і порожній стан - великий. Ширина сюди не входить: 100% проти auto вирішує макет, тому кнопка в картці і кнопка в смузі - одна кнопка. Драбин дві, і друга не виняток: у квадрата немає підпису, від якого міряти ширину, тому btn--icon має власний ряд, де середній щабель - 44, мінімум пальця. Переміряно на кроці 7.8: з 504 кнопок з коробкою на драбині підпису стоять 233, а майже вся решта - на 44. Розбір у розділі «Чого стенд не казав», пункт 4. |
| Супровід | сам · з підказкою поруч | .goalcta .hint - єдиний випадок, де біля кнопки стоїть пояснення, і воно частина кнопкового блоку, а не окремий абзац: «Підібрати набір» без «разом дешевше» не пояснює, навіщо тиснути. |
Рішення живе там, де на нього дивляться. Перепис показав дрейф, крок 5.5 його зняв - і цей блок каже, що саме обрали, що лишили і чому, на сторінці самого компонента, а не тільки в журналі.
| Вісь | Було | Стало | Чому |
|---|---|---|---|
| Радіус | 10 · 11 · 8 · 12 · 0 | 8 · 12 · 0 | Шкала 4/8/12/16: 10 і 11 сіли на 8, бо нічия йде вниз - менше округлення читається як інструмент. Кнопка тепер бере 8, а 12 лишається там, де кнопка сама є панеллю. |
| Колір рамки | | | Зведено на кроці 6.3, і питання було не про значення. Див. рядок «Контурна кнопка» нижче: край контрола проти волосіні всередині поверхні. |
| Тінь наведення | | | Крок 6.0: підйом контрола під курсором - рівень драбини, а не окреме значення в кожному файлі. |
| Кегль | 11 | 11 | Не чіпали: у кнопки кегль - це вісь розміру, а не дрейф. |
| Кнопка футера 6.2 | | | Єдина акцентна кнопка продукту, написана з нуля поза button.css: власний радіус 4 - єдина четвірка на контролі в усьому продукті - власний кегль 12 і рамка 1px там, де в кожної іншої 1.5. Тепер це набір, обробка «акцент», розмір S, а footer.css не оголошує про неї нічого: 58 екземплярів, обидва в'юпорти. Поле поруч підтягнуло радіус за нею - зварена пара не може округлятись по-різному. |
| Іконкова кнопка 6.2 | | | Виміряно: 15 іконкових форм, 506 екземплярів, сім різних боксів - а анатомія вище обіцяє 44px зону дотику. Обидва твердження разом хибні. Тепер чорнило лишається яким було, а ціль ніде не менша за 44: серце на картці виросло з 26 до 44 і не зрушило ні на піксель (12 - (44-26)/2 = 3), решта отримала ::after, який нічого не коштує в макеті. cart-button.css видалено: він двічі казав те саме - окремо для .pcard і для .pcard-l - і казав це в контексті картки, хоча в цій кнопці немає нічого картчиного. |
| Контурна кнопка 6.3 | | | І тут же відповідь на питання, яке крок 5.5 лишив відкритим. Контурна кнопка читала і --line-strong, і --line-hair, і 5.5 відмовився це зводити, бо це не дрейф значення, а нерозв'язане питання ролі. Відповідь: лінія кнопки - це край контрола. Волосінь розділяє те, що лежить на одній плиті; кнопку натискають, і її край має триматись проти плити, а не зливатись із нею. Далі: рамка скрізь 1.5 (було 1 у сторінкуванні та .ob-collapse), підпис скрізь чорнилом (було вторинним у п'ятьох формах без жодної ознаки, що вони тихіші), ховер один - край і підпис ідуть в акцент. Він теж не вигаданий: продукт уже писав саме такий ховер у чотирьох місцях окремо. Локальні редакції знято з дев'яти файлів. |
| Текстова кнопка 6.4 | | | Спершу поділ, і він вирішує майже все: 2 850 елементів на кольорових екранах не мають ні ґрунту, ні рамки, і за власною розміткою - <button>, onclick, role чи справжній href - 542 з них дії, а 2 308 посилання. Посилання не кнопка, це справа компонента «рядок посилань». Тому фініш накрив сім імен, а не три тисячі. Перевірено і визнано посиланнями: «Усі 6 →», «Читати більше ↓» (стрілка чесна - вона веде вниз тією ж сторінкою), «Залишити відгук», «Очистити все», «Завантажити квитанцію», «Скасувати та повернутись». Далі один колір (чорнило), один ховер (акцент), кільце фокусу - і підкреслення як правило, а не смак: воно є там, де кнопка стоїть усередині речення, і його немає в ряду контролів, де на кнопку вказує саме місце. :active у текстової немає навмисно: тиснути нічого, а рухати сам текст під пальцем гірше, ніж не відповідати зовсім. |
| Вимкнено 6.5 | | | Шість вимкнених контролів на екранах, і два різні вигляди - які виявились правильними й ненаписаними. У лічильника немає плити, тому блідне лише знак (--mark-disabled); у кнопки кошика плита є, тому вона й гасне: --bg-sunken, волосінь, приглушений підпис. Продукт уже був згоден сам із собою - він просто ніколи цього не сказав, і сказав це класом. Клас - це варіант, а тут стан: та сама кнопка, зараз недоступна. Тепер вона тримається на атрибуті - [disabled] там, де тег дозволяє, і [aria-disabled="true"] там, де в розмітці <a> чи <span>; це заодно єдина версія, яку чує читач екрана. Правила стоять останніми у файлі навмисно: кожна обробка вище оголошує ховер, натиск і фокус на тій самій вазі, і саме позиція в кінці дозволяє вимкненій кнопці не відповідати ні на що - без жодного !important. |
| Драбина розмірів 6.6 | | | Найбільше зведення цієї серії, і воно було найпотрібнішим. П'ять обробок поверх такого дрейфу не дають набору - вони дають п'ять способів бути неузгодженим. Розмір тепер вирішується один раз, за іменем, а компонентний файл не оголошує для кнопки ні падінга, ні кегля, ні радіуса: 122 декларації розміру знято з 20 файлів. Радіус пішов за розміром - 8 для контрола, 12 для тієї єдиної кнопки, яка сама є панеллю, тобто для L; --radius-4 на контролах більше не зустрічається. Виміряно після: висот 25 -> 18, падінгів 13 -> 6, радіусів 4 -> 3, і розкладка по сходинках S 500 · M 164 · L 151 · іконкові 204. |
Кнопка - це дія, а не перехід, і на кроці 6.4 це нарешті виміряно, а не проголошено: з 2 850 елементів без ґрунту й рамки 542 є діями за власною розміткою і 2 308 - посиланнями. Якщо натискання веде на іншу сторінку і нічого не змінює, це посилання: див. Рядок посилань. Підпис береться з voice/docs/microcopy.md і завжди каже, що станеться («У кошик», «Оформити замовлення»), а не де ти опинишся.
Правило
Одна заливка на екран. Помаранчева кнопка називає ту єдину дію, заради якої екран існує. Решта - рамка або текст. Перепис це підтверджує: залитих 308 на 39 екранів, тобто вони розкладені по ділянках, а не скупчені.Антиправило
Не давай одній роботі два наголоси. «Залишити відгук» сьогодні залита на трьох екранах товару, контурна в кабінеті і простий лінк у списку замовлень - тобто продукт каже, що відгук важливий там, де його не залишають, і дрібний там, де залишають. Це не варіант, це втрачене рішення.ПОВЕДІНКА НА ШИРИНІ - етап 10, крок 4
Від якого порогу: жодного - запит зник. Було@media (max-width: 479px), а 479 немає в реєстрі точок. Що саме міняється: горизонтальний паддінг тепер clamp() - 12px на 360, 16px від 860 (у --s 8 -> 12, у --l 16 -> 24). Кожен пандус починається рівно з того числа, яке стара умова давала телефону, тож на 360 не зрушило нічого, а між 361 і 859 кнопка набирає повітря поступово замість стрибка на 480. І перемикання кегля пішло: .btn--l читав --fs-16 нижче 480 і --fs-18 вище - етап забороняє міняти розмір на точці, бо стрибок стається в ту саму мить, коли людина тягне край вікна.Правила вживання, які називають саме цей компонент: U8 · U9. Автор правил один, і це architecture.html, розділ I; тут - витяг.
btn--accent це фініш, а не ранг. Видимих акцентних кнопок буває 13 на одному екрані, бо акцент носить кожна кнопка «У кошик». Дві залиті акцентні дії не стоять одна над одною в одній зоні. Ряд із двох дій береться патерном .actions, а не новим ім'ям контейнера.
Крок 6.2 дав акцентній обробці два стани, яких у продукті не було взагалі. :active читає --bg-action-pressed - роль, що вже існувала і була прочитана рівно один раз, кнопкою «Каталог» при відкритому меню: її назвали «натиснутий акцент», а вжили як варіант. :focus-visible читає нове --ring-focus-control: --ring-focus - це підсвітка всередині краю, вона працює на білому полі й зникає на помаранчевій заливці, бо це той самий колір. Кільце контрола малюється зовні: розрив кольором сторінки, потім акцентна лінія.
Наведення не чіпали. opacity:.93 лишилось, бо три компоненти перефарбовують .btn.dark на темному тлі і кожен гасить цей ховер через opacity:1 - зміна осі тут тихо зламала б усі три.
Крок 6.3 замкнув контурну. Було: .btn:hover не існував ніде, а сім із 58 екземплярів реагували через чуже локальне правило в .pstrip. Стало 58 із 58, і той самий ховер у всієї родини.
Винятки названі поіменно. .sbtn і .co-soc підіймаються на --elevation-control замість акценту - це один контрол «увійти через Google / Apple» під двома іменами. .auth-x і .cd-x - це ✕ діалогу: обробка в них іконкова, мітка лишається тихою, а під курсором підіймається теплий ґрунт - закриття не є дією того екрана, який воно закриває. БОНУСИ і КОШИК лишились контурними за рішенням власника: це два лічильники шапки, вони несуть число, а число потребує рамки.
Крок 6.5 додав четвертий стан - вимкнено. Він не обробка: це та сама кнопка, якої зараз не можна натиснути, тому тримається на атрибуті, а не на класі. Дві форми, бо їх дві й було: у контрола з коробкою гасне коробка, у контрола без коробки блідне сам знак.
У переписі без жодного стану лишились три форми-дії, і третя з них у списку помилково: .cd-blocked і є вимкнений стан, тому власного ховера в неї бути не може. Справжніх дві - .on у галереї та .ord-h, заголовок рядка замовлення, який його розкриває.
Цей файл був єдиним у системі, хто мав стан натиску. Перепис у браузері по 39 кольорових екранах: 3 854 контроли, до яких палець реально дістає, і 503 з них відповідають на натиск. Усі 503 - кнопки. Решта 3 351 під пальцем не робить нічого, і 52 з тих сімейств відповідають миші. Тобто відповідь існувала, її просто написали під другорядний пристрій.
| Контрол | Відповідь на натиск |
|---|---|
| має землю | земля йде на сходинку до акценту: --bg-action-soft, або --bg-action-pressed, якщо земля вже акцентна |
| тільки шрифт | нічого. Шрифт, що стрибає під пальцем, гірший за відсутність відповіді |
| піднімається | підйом падає (.btn--lift:active) |
Жодного нового значення. Обидві землі лежать у tokens.css з кроку 5.5 і названі саме під цю роботу: --bg-action-pressed витягли тоді як «єдиний стан натиску в продукті, і в нього не було імені». Тепер у нього ще шість.
Іконкова кнопка теж відповідає, і це нове. --text відмовляється від натиску, і причина - про слово. Іконкова кнопка не слово, і цей файл сам це каже там, де видає --text --icon короб 44px. Відмова, написана для підпису, керувала 92 позначками, яким є чим відповісти. --ghost --icon у селектор не входить: .btn--ghost:active уже дає ту саму землю.
.btn--accent вводить елемент у :active, земля читається #E85200 проти #FF5A00 у спокої. Чи потрібен iOS Safari порожній слухач touchstart - [?]: пристрою iOS у цій сесії немає, тож це записано, а не вгаданоПерепис у браузері по 40 кольорових екранах: десять руйнівних контролів, розкиданих по чотирьох обробках цього файлу плюс одна, що не має обробки взагалі, і чотири з десяти залиті акцентом. Три з тих чотирьох це підтвердження - та сама кнопка, яку тиснуть у мить, коли дані вже йдуть.
| Контрол | Було | Стало |
|---|---|---|
| «Видалити клієнта» · діалог тренера | btn--accent btn dark | btn--outline btn--danger |
| «Видалити» · діалог адреси | btn--accent btn dark | btn--outline btn--danger |
| «Видалити акаунт» · діалог профілю | btn--accent btn dark, віддається disabled | btn--outline btn--danger, так само disabled |
| «Видалити» · картка адреси, 3 шт | btn--outline btn--s, тобто те саме, що «Редагувати» поруч | плюс btn--danger |
| «🗑 Видалити адресу» · діалог редагування | btn--outline btn--s | плюс btn--danger |
| «Видалити акаунт» · відкривач у профілі | btn--text btn--danger, червоний лише на ховері | червоний у спокої |
«Видалити недоступний товар» · cart-oos | btn--accent btn--l btn--full | лишається акцентом: це не видалення в неправильній фарбі, це єдиний шлях уперед. Кошик заблоковано товаром, якого не купити, і саме це його розблоковує |
Найгучніший і найзвабливіший об'єкт системи був той, що щось завершує, і він не відрізнявся від того, що щось купує. Цей файл сам каже: «акцент - це єдина дія ділянки». Видалення не є тією дією; це дія, якої намагаються не зробити випадково.
Жодного нового значення, і форму прочитано, а не обрано. Родина небезпеки лежить у tokens.css з кроку 5.5, і дев'ять файлів уже нею малюють - otp, field, empty-state, checkout-form, auth-dialog, discount, review-modal, buy-box, account-shell - як чорнило, як край або як бліду плиту. Пораховано: жоден із дев'яти не заливає --red-600, ніде і нічим. DESIGN-artifacts.md каже чому: червоне це «серйозний глибокий червоний, свідомо відділений від Signal Orange», і та сама сторінка забороняє «червоні бризки». Залита червона кнопка і є та бризка. Тому руйнівний контрол це контур із небезпечним чорнилом, а плита приходить під пальцем.
| Стан | Виміряно в браузері, з витриманим переходом |
|---|---|
| спокій | чорнило #C42B1C · край #C42B1C · земля прозора |
| ховер | земля --bg-danger-soft rgba(196,43,28,.04), і чорнило лишається червоним |
| натиск | земля --bg-danger #FDF4F2 |
| фокус | те саме кільце, що в усіх: біла щілина 2px, далі акцентна лінія. Кільце каже «ви тут з клавіатури», а не «це небезпечно», і двох значень воно не носить |
| вимкнено | не рухається в жодному з чотирьох станів |
Правило спокою гасить помаранчевий ховер без вищого селектора. .btn--outline:hover це (0,2,0) і ставить --line-action; два класи це теж (0,2,0), тож нічия йде до порядку у файлі, а цей блок нижчий. Земля - єдине, що оголошують правила зі станами, і саме тому «вимкнено» мусило дорости на два селектори: земля на (0,3,0) інакше підсвітила б мертву кнопку. А мертва там справжня.
Коробка не зрушила. Підтвердження адреси було біле на помаранчевому 140x52 і стало червоне на прозорому 140x52. Це не збіг: кожна коробкова обробка в цьому файлі несе однаковий край 1px, тому заміна обробки на обробку не рухає нічого - саме те, що файл обіцяє вище і що тут нарешті перевірено на живій кнопці.
Правило
Червоне там, де натиск не відкотити. Три підтвердження, кнопки адреси і відкривач видалення акаунта. Дев'ять екземплярів на двох екранах із сорока: колір рідкісний, і саме тому він щось означає.Антиправило
Не фарбуй те, що повертається одним натиском. «Видалити» в рядку кошика і ✕ на картці обраного лишаються тихими. Червоне на трьох рядках кошика витратило б колір на несерйозне, і тоді воно перестає означати серйозне будь-де._wf.css не має жодного селектора, що починається на btn--, а два імені, які він читає - .btn і .dark - лишились на місці. Підтвердження в сірому прототипі як було біле на #161616 145x44, так і лишилось.co-line .li-acts, яке checkout-form.css малює руками, і ✕ на чипі фільтра. Вони не руйнівні, але вони кнопки поза набором кнопок, тобто рівно та форма, яку мав закінчити крок 6.7. Записано на крок 6Сторінка звіряє себе з файлом: 50 власних класів і 5 станів оголошено в button.css. Нижче - ті, яких на цій сторінці немає ні в демо, ні в розмітці. Чужий контекст (.acc-main .addr-acts .aord-actions .bb .cd-empty .cd-foot .ci-qty .co-err-acts .co-qty .co-social .coachbn .cs-act .cshelf .fsheet-foot .notifyrow .pages .pcard .pcard-l .pm-f .pstrip .rvhead .sys-search .uiv-ic .wff-news .wfh-mi .wfh-nav .wfh-search) не рахується: у цих селекторах компонент не є підметом, він лише стоїть усередині когось.
Робота: ВІДПОВІДЬ. Рухається: background, border-color, color, box-shadow, opacity. Тривалість --dur-fast (150ms), крива --ease-standard. Значення читаються через var() з tokens.css: підміна токена в браузері веде за собою кожне з них, тобто числа у файлі немає. При prefers-reduced-motion рух зникає, а стан лишається.
Один запис на весь набір обробок, тому його носять і серце на картці, і кнопка кошика, і посилання-дія. box-shadow у списку - властивість МАЛЮВАННЯ: на одному контролі вона дешева, на списку з двадцяти карток ні, і це рішення кроку 5.
Прочитані з button.css, не переписані руками. Колір іде лише через роль, геометрія - напряму з примітива.
| Семантичні ролі (21) | Примітиви (19) |
|---|---|
--bg-action --bg-action-pressed --bg-action-soft --bg-danger --bg-danger-soft --bg-page --bg-sunken --bg-surface --elevation-control --line-action --line-danger --line-hair --line-strong --mark-disabled --ring-focus-control --text-action --text-body --text-danger --text-muted --text-onaction --text-secondary | --fs-14 --fs-16 --fs-18 --fw-bold --fw-medium --lh-snug --radius-12 --radius-8 --size-20 --size-24 --size-40 --size-44 --size-52 --size-64 --space-12 --space-16 --space-24 --space-4 --space-8 |
| – | --dur-fast --ease-standard |
Якорі: .btn .navbtn .go .sbtn .fmore .goalcta .coach-newcta .cn-plus .cartbtn .wff-news
111 екранів у wireframes/: 404.html, 500.html, account-addresses-add.html, account-addresses-courier.html, account-addresses-delete.html, account-addresses-edit.html, account-addresses-empty.html, account-addresses-postomat.html, account-addresses-viddilennia.html, account-addresses.html, account-empty.html, account-error.html, account-orders-empty.html, account-orders.html ...
Чого бракує
.fmoreне кнопка для клавіатури - «+ ще 11 брендів» це<div>безroleі безtabindex. Виглядає як дія, працює як дія мишею і не існує ні для клавіатури, ні для читача екрана. Розмітка в замороженому сірому шарі- 10 стрілок сторінкування без назви - вони лише з іконкою і не мають ні тексту, ні
aria-label. Стара цифра 41 на цій сторінці рахувала й сірий прототип; на кольорових екранах їх десять - Дія у футері вдягнена посиланням - «Змінити згоду» це
<a href='#' onclick>, тобто кнопка, написана як лінк. Розмітка живе в замороженому сірому шарі, тож правиться при розморожуванні - Три посилання футера мають inline
style-color:inheritпросто в атрибуті, усі три на.wff-soc, заміряно вwireframes/_nav.js:1940. Тут стояло «шість» і «готова стіна перед темною темою», і обидва слова були хибні (виправлено 13.08.2026). Шість було правдою до кроку 7.30, який зняв інлайн із юридичного рядка; трійку той крок і записав, але назад на цю сторінку її не переніс. А стіноюcolor:inheritне є взагалі: колір береться в батька, батько тематизований, тож під темною темою ці три перемкнуться самі. Лишається справжнє - вони не можуть мати власної ролі
Не домальовано наперед і не замовчано: етап 09 стартує з цього списку, зведеного в design/kit/docs/architecture.md.