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

Кнопка

Основна дія екрана. Ця сторінка зібрана з перепису, а не зі стилю. Крок 6.7 переписав компонент цілком: 704 кнопки на 39 кольорових екранах носили 56 різних класів і давали 44 різні вигляди - тепер це обробка плюс модифікатори, 22 комбінації й 24 вигляди, з яких зайві - це стани (вимкнена, поточна сторінка, збережене) і текстова обробка, що навмисно бере тип від речення довкола.

рівень 1design/system/components/button.css683 рядки138 екранів
Анатомія
Зберегти адресу клас каже, чим кнопка є. Базового класу немає: обробка і є кнопка, тому забути її неможливо. Розмір M мовчить.
Змінити щільний ряд - btn--s
Оплатити карткою єдина дія екрана - btn--l, сама у своєму блоці - btn--full
слова немає - btn--icon, слово живе в aria-label

Номер підтверджено. у будь-який момент.

дія всередині речення - btn--text btn--inline, тип успадковується від речення
Одна коробка на всі обробки: рамка 1px є в кожної, у контурної своя, у акцентної власного кольору, у підкладки прозора. Тому заміна обробки не рухає нічого поруч - до кроку 6.7 акцентна сім'я була розділена між рамкою 1.5 і жодною, і та сама кнопка мала два різні розміри залежно від того, яке ім'я їй дісталось.
Набір: чотири обробки × три розміри + іконкова

Крок 6.7. Кроки 6.1-6.6 звели правила й лишили імена: 704 кнопки на 39 екранах носили 56 різних класів і давали 44 різні вигляди. Тепер вигляд висить на класі, а старе ім'я лишається в розмітці як гачок компонента - де кнопка стоїть, а не яка вона.

акцентодна дія на ділянку
Каталогbtn--accent btn--s
контурдія поруч з головною
Змінитиbtn--outline btn--s
підкладкаґрунт лише на ховері
Квізbtn--ghost btn--s
Обранеbtn--ghost
Googlebtn--lift · підіймається, а не кольориться
у рядку формирунг поля, не кнопки
btn--field · 44 · 16px · medium · кут 12 · вміст ліворуч
сусід: .field - той самий рунг, і в цьому вся суть
текстоватип від речення довкола
btn--text
btn--inline · 0 вживань після 7.6
btn--danger · тихий відкривач у підвалі картки
небезпечнанатиск, який не відкотити
btn--outline btn--danger btn--s
підтвердження в діалозі
вимкнено виграє в модифікатора
іконковаслово в aria-label
btn--icon btn--s · 40
btn--icon · 44, мінімум пальця
btn--icon btn--l · 52
вимкненастан, не обробка
Зберегти[aria-disabled] на <a>
[disabled] на <button>
без коробки бліднішає лише знак
Кожна клітинка несе той самий рядок класів, що й екран: тут немає жодного вигаданого імені, бо їх більше не існує. Що ще лишилось у файлі й не показано матрицею - btn--full (ширина, не розмір) і btn--icon у комбінації з btn--text: гола позначка на картці, серце й кошик, у якої є коробка 44, але немає ґрунту.
btn--text btn--icon · btn--full
Чого стенд не казав кроки 7.3 - 7.8

Власник знайшов на сайті три кнопки й не знайшов їх на цій сторінці. Жодна з трьох не була помилкою розмітки, і всі три виявились претензією до стенда, а не до компонента. Знято обходом 39 кольорових екранів у двох в'юпортах: 657 видимих кнопок, з них залитих 235, контурних 159, текстових 153, з підкладкою 110.

1 · На телефоні це інша кнопка

У наборі вище великий розмір це 18px. На товарній сторінці «У кошик» - той самий btn--accent btn--l - міряється 18 на 1280 і 16 на 360. Це не дрейф, це правило, яке живе в button.css з кроку 6.8 і якого стенд не показував: сторінка показувала один в'юпорт, а компонент має два.

Розмір1280360Що рухається
btn--s40 · 14px · 8/1240 · 14px · 8/8лише бокове повітря
M (обробка сама)52 · 16px · 12/1652 · 16px · 12/12лише бокове повітря
btn--l64 · 18px · 16/2464 · 16px · 16/16повітря і кегель
btn--icon40 · 44 · 52без зміннічого: палець не торгується

Причина одна: кнопка не переносить рядок. У колонці 360 ширина 328, і три підписи в неї не вміщались - «Повідомити про надходження» роздувала блок покупки до 404 і гнала сторінку вбік. Тому нижче 480 кожен розмір віддає один щабель бокового повітря, а великий ще й сідає на кегель середнього. Висота й палець не рухаються ніколи.

У кошик звузьте це вікно до 360 і подивіться на підпис: він сяде з 18 на 16 у вас на очах
2 · Стрілка тепер позначка, а не знак крок 7.5

«Для тренерів →» на банері й «Усі товари →» у заголовку розділу на стенді не було, бо стрілка не була з набору. Виміряно: 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 }, і воно однакове скрізь.

3 · Текстова обробка: один кегель, п'ять власників крок 7.8

Клас btn--text на стенді один, а на сайті він рендериться кількома способами, і обробка навмисне оголошувала font-size: inherit, тобто тип бере не вона, а речення довкола. На кроці 7.8 це перевірили лічбою, і речення виявилось мовчазним. Браузер обійшов 39 кольорових екранів і зняв 163 елементи з класом btn--text у 12 комбінаціях. Одиниця тут інша, ніж у переписі вище: там рахували форми кнопок, тут - кожен елемент, разом із голими серцями.

×Де стоїтьГачокКегельЧорнило
З ПІДПИСОМ - сім комбінацій, і всі сім міряють 14
28заголовок розділу, «Усі товари →».sech .all14вторинне
12рядок кошика, «Змінити» / «Видалити».ci-lnk · .strong14основне
3картка профілю, «Змінити - код у SMS».pf-act.pf-actbtn14основне
3чекаут, «Списати бонуси».co-toggle14основне
3адреси, «‹ Інший спосіб».addr-back14основне
1профіль, «Видалити акаунт».pf-dangerbtn14основне
БЕЗ ПІДПИСУ - п'ять комбінацій, кожна зі своїм числом і своєю причиною
92серце на картці, три стани.fav · .wlrm · .fav.onінертнийвторинне / акцент
14фільтр, «+ ще 11».fmore12вторинне
7серце на картці-рядку.pcard-l .lfav18вторинне

Сім із семи підписів дали 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 середнього розміру, він лишається в наборі оголошеним і невжитим, і сторінка каже це вголос замість того, щоб показувати його як щось наявне.

4 · Драбина висот не одна, а дві крок 7.8

Сторінка каже S 40 · M 52 · L 64, і це правда для кнопки з підписом. Браузер обійшов 39 екранів і зміряв 504 кнопки з коробкою: на цій драбині стоять 233. Решта 271 - не хаос, а всього вісім видів, і сім із восьми це два числа, 44 і 46.

Висота×ХтоЗвідки
44101.cartbtn · .cartbtn.notify · .co-getcode · .menu-trigСвоя драбина, і вона законна. btn--icon оголошує 40 / 44 / 52 просто тому, що квадрату нема від чого міряти ширину. 44 це мінімум пальця, і на ньому ж стоять поле (field.css) і рядок меню (menu.css).
46 → 44136.wfh-act.numbtn · .wfh-act.stack · .wfh-cabbtnБуло єдине число такої висоти в системі. --size-46 більше не тримає жодного контролу - тільки спінери й мініатюри. Опущено до 44 на кроці 7.8.
37 → 4134.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.

5 · Кнопка, якої не було в системі крок 7.10

Знайшов власник, зі скріншота: <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.

Усе, що є на сайті: 34 зразки на 22 комбінації класів
акцентодна дія на ділянку
Каталогbtn--accent btn--s×113.navbtn · .go · .btn.dark у щільному ряду
Очистити фільтриbtn--accent×5.btn.dark
Пройти квізbtn--accent btn--l×11.btn.dark у банері цілі
Підтвердити замовленняbtn--accent btn--l btn--full×12.auth-cta · .co-confirm · .addcart
контурдія поруч з головною
Редагуватиbtn--outline btn--s×97.btn у щільному ряду · .co-edit
Повернутись до кошикаbtn--outline×15.btn · .loadmore · .mc
Клієнтиbtn--outline btn--l×2.btn у кабінеті тренера
Надіслати новий кодbtn--outline btn--full×3.auth-alt · .co-city
До каталогуbtn--outline btn--full btn--s×1.btn.gh
Продовжити покупкиbtn--outline btn--full btn--l×3.btn.cd-cont
Оформити замовленняbtn--outline btn--full×1.cd-blocked · вимкнена
підкладкаґрунт лише на ховері
Квізbtn--ghost btn--s×102.navlink · .wfh-act.stack
підіймаєтьсята сама пара в двох місцях
Googlebtn--outline btn--lift btn--s×3.co-soc у чекауті
Продовжити з Googlebtn--outline btn--lift btn--full×3.sbtn у діалозі входу
текстоватип від речення довкола
btn--text×57.ci-lnk · .co-toggle · .fmore · .all
btn--text×3.pf-actbtn
btn--text btn--danger×1.pf-dangerbtn
з позначкою244 на сайті · класу не потребує
Каталогbtn--accent btn--s×34позначка ЛІВОРУЧ - іменник: називає те, над чим дія
Одесаbtn--outline btn--s·18чорнило позначки з драбини розміру
Оберіть містоbtn--outline·1.15emпозначка ПРАВОРУЧ - пунктуація: росте з підписом, не з драбиною
Повідомитиbtn--accent btn--l·24L
btn--text·1.15emтекстова поза драбиною: тип від речення, і позначка теж
Googlebtn--lift btn--sмарка бренду міряється чорнилом, не коробкою
іконковаслово в aria-label
btn--accent btn--icon×94.cartbtn · 44
btn--outline btn--icon×5.cartbtn.notify · 44
btn--text btn--icon×89.fav · .wlrm · гола позначка на картці
btn--text btn--icon on×3той самий рядок і стан on: збережене серце наливається
btn--outline btn--icon btn--l×3.bb .wish · 52
btn--ghost btn--icon btn--s×8.auth-x · .cd-x · .x · 40
12btn--outline btn--icon btn--s×22.pages · додано на кроці 7.3: комбінація була на 5 екранах і на цій сторінці її не було. on тут це не збережене, а «ви стоїте на цій сторінці», тому квадрат заливається, а не позначка
лічильники шапкичисло потребує коробки
БонусиОтриматиbtn--outline btn--s.wfh-act.numbtn · бонусів ще немає
Бонуси124 ₴btn--outline btn--s.wfh-act.numbtn · є баланс
Кошикbtn--outline btn--s.wfh-act.numbtn · кошик порожній
3Кошик1 520 ₴btn--outline btn--s.wfh-act.numbtn · 3 товари, сума
Це весь набір, який продукт справді вживає: 34 зразки, зняті обходом 39 кольорових екранів, кожен з реальним підписом і числом входжень. Разом вони покривають усі 22 комбінації класів, які браузер бачить на сайті - зразків більше, бо одна комбінація має різні форми вмісту. Звірено на кроці 7.3: усі 22 комбінації, які браузер бачить на сайті, є на цій сторінці; 23-тя є тут і не вживається продуктом - 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, коли приходить число.
Перепис до кроку 6.7: 89 форм у 38 файлах

Це знімок ДО перепису класів, і він лишається на сторінці, бо саме він і був підставою переписати компонент. Ліва колонка - імена, яких більше не існує як вигляду: сьогодні кожен із цих рядків це 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,610px,8pxauto/fixed/full:hover :active :focus-visible :disabled 1143 з 1154
408текстова.dr-catcart-drawer500pxfullнемає
350текстова.foptfilter-group22,450pxfixed:hover
306текстова.dr-linkcart-drawer470pxfixedнемає
188іконка · акцент.cartbtnbutton40,448pxfixed:hover :active :focus-visible :disabled
184текстова.nmaccount-shell+gallery+product-card36,440pxfixed:hover
170текстова.wf-tabmega-menu+tabbar590pxfixedнемає
166іконка · гола.favfavourite+product-card440pxfixed:hover :focus-visible :disabled
140текстова.fhfilter-group220pxfixed:hover
116текстова.wff-msgfooter300pxfull:hover
86іконка · голабез класупоза системою320pxfixed:hover :disabled
68текстова.wfh-logoheader+section-head210pxfixedнемає
68контур.wfh-act.numbtnbutton+header468pxfixed:hover :active :focus-visible :disabled
59контур.btn16 файлів41,53,648px,12pxfixed/full:hover :active :focus-visible :disabled
58акцентбез класу«Підписатись»button418pxfixed:hover :active :focus-visible :disabled
58текстова.wff-phonefooter340pxfull:hover
58текстова.seolinklink-row15,340pxfixed/full:hover
56текстова.allsection-head308pxfixed:hover
56підкладка.acc-linkaccount-shell40,470px,100pxfixed:hover
55текстова.wfh-act.stackheader468pxfixed:hover :disabled
48підкладка + контур.acc-linkaccount-shell40,470px,100pxfixed:hover
45акцент.btn.dark16 файлів41,53,648px,12pxfixed/full:hover :active :focus-visible :disabled
34текстова.wfh-burgerheader300pxfixedнемає
34текстова.dr-citycart-drawer470pxfixedнемає
34текстова.dr-link.strongcart-drawer470pxfixedнемає
34акцент.navbtnheader418pxfull:hover
34текстова.navlinkheader418pxfixed:hover
34акцент.goheader+status-pill+system-page388pxfixed:hover
32підкладка + контурбез класу«За ціллю»поза системою41100pxfixed:hover
24контурбез класу«2»поза системою348pxfixed:hover :active :focus-visible
22текстова.ci-lnkbutton+cart-row22,45,670pxfixed:hover :focus-visible :disabled
16підкладкабез класу«Склад ▾»поза системою620pxfull:hover
14підкладка + контур.btn.dark16 файлів41,53,648px,12pxfixed/full:hover :active :focus-visible :disabled
14контур.mcbutton+toolbar538pxfixed:hover :active :focus-visible :disabled
14контур.loadmorebutton+pagination538pxfixed:hover :active :focus-visible :disabled
14текстова.lnmproduct-card20,450pxfixedнемає
14іконка · гола.lfavproduct-card200pxfixed:hover :disabled
13текстова.wfh-act.stack.wfh-cabbtnheader468pxfull:hover :disabled
12текстова.lnkaccount-shell20,22,450pxfixed:hover
12іконка · гола.wlrmfavourite440pxfixed:hover :focus-visible :disabled
10іконка · підкладка.cartbtn.notifybutton40,448pxfixed:hover :active :focus-visible :disabled
10контур.auth-xauth-dialog388pxfixed/full:hover
10акцент.auth-ctaauth-dialog52,56,6112pxfixed:hover
10текстова.co-logocheckout-form210pxfixedнемає
10акцент.on22 файлів34,35,380px,8pxfixed:hover :focus-visible 14 з 18
10іконка · контурбез класупоза системою348pxfixed:hover :active :focus-visible
8акцент.acc-linkaccount-shell40,470px,100pxfixed:hover
8підкладка + контур.acc-link.logoutaccount-shell40,460px,100pxfixed:hover
8підкладка.acc-link.logoutaccount-shell40,460px,100pxfixed:hover
7текстова.x5 файлів19,320pxfixedнемає
7підкладка + контур.ctrl.uiv-sortstepper418pxfixed:hover
7іконка · акцент.on22 файлів34,35,380px,8pxfixed:hover :focus-visible 14 з 18
7іконка · підкладкабез класупоза системою350pxfixed:hover
6текстова.pf-act.pf-actbtnbutton+checkout-form220pxfixed:hover :focus-visible :disabled
6іконка · гола.fav.onfavourite+product-card440pxfixed:hover :focus-visible :disabled
6підкладка + контур.sbtnbutton538pxfull:hover :active :focus-visible :disabled
6контур.cd-xcart-drawer368pxfixed:hover
6текстова.co-togglebutton+checkout-form220pxfixed:hover :focus-visible :disabled
6акцент.co-confirmcheckout-form6112pxfixed:hover
6підкладка + контур.co-socbutton+checkout-form41,648pxfixed:hover :active :focus-visible :disabled
6іконка · контур.wishbutton+buy-box5412pxfixed:hover :active :focus-visible :disabled
4акцент.btn.dark.rk-add16 файлів418pxfixed:hover :active :focus-visible :disabled
4контур.btn.cd-cont16 файлів6412pxfixed:hover :active :focus-visible :disabled
4підкладка + контур.co-editbutton+checkout-form418pxfixed:hover :active :focus-visible :disabled
4контур.co-citybutton+checkout-form53,788pxfixed/full:hover :active :focus-visible :disabled
4текстова.on22 файлів34,35,380px,8pxfixed:hover :focus-visible 14 з 18
4акцент.addcartbuy-box6112pxfixed:hover
4підкладка + контур.dpcitybuy-box408pxfixed:hover :active :focus-visible :disabled
4підкладка.ord-horder-row70,153,2130pxfixedнемає
4текстова.leadfilter-rail380pxfixed:hover
3акцент.mbabuy-bar6112pxfixed:hover
2акцент.btn.dark.addr-add16 файлів418pxfixed:hover :active :focus-visible :disabled
2текстова.ob-receiptaccount-shell220pxfixed:hover
2акцент.btn.dark.ob-repeat16 файлів418pxfull:hover :active :focus-visible :disabled
2акцент.btn.dark.pf-save16 файлів418pxfixed:hover :active :focus-visible :disabled
2текстова.pf-dangerbtnbutton+checkout-form220pxfixed:hover :focus-visible :disabled
2контур.auth-altauth-dialog+button6412pxfixed:hover :active :focus-visible :disabled
2текстова.optincheckbox450pxfixedнемає
2контур.btn.gh16 файлів418pxfixed:hover :active :focus-visible :disabled
2текстова.ci-lnk.strongbutton+cart-row45,670pxfixed:hover :focus-visible :disabled
2акцент.btn.dark.cd-fix16 файлів64,9312pxfixed:hover :active :focus-visible :disabled
2підкладка + контур.cd-blockedbutton+cart-drawer538pxfixedнемає
2акцент.btn.dark.cd-cta16 файлів6412pxfixed:hover :active :focus-visible :disabled
2акцент.co-proc-gocheckout-form61,9012pxfixed:hover
2текстова.co-proc-cancelcheckout-form220pxfixedнемає
2заливка чорнилом.co-getcodecheckout-form44,478pxfixed:hover
2контур.btn.oosback16 файлів538pxfixed:hover :active :focus-visible :disabled
2контур.pmbackgallery350pxfixed:hover
1підкладка + контур.ob-collapseaccount-shell+button418pxfixed: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

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

ВісьБулоСталоЧому
Радіус10 · 11 · 8 · 12 · 08 · 12 · 0Шкала 4/8/12/16: 10 і 11 сіли на 8, бо нічия йде вниз - менше округлення читається як інструмент. Кнопка тепер бере 8, а 12 лишається там, де кнопка сама є панеллю.
Колір рамки--line-strong + --line-hair--line-strongЗведено на кроці 6.3, і питання було не про значення. Див. рядок «Контурна кнопка» нижче: край контрола проти волосіні всередині поверхні.
Тінь наведення0 2px 10px літералом--elevation-controlКрок 6.0: підйом контрола під курсором - рівень драбини, а не окреме значення в кожному файлі.
Кегль1111Не чіпали: у кнопки кегль - це вісь розміру, а не дрейф.
Кнопка футера 6.2r4 · 12px · 1px · без станівакцент · S · r8 · 1.5px · 3 станиЄдина акцентна кнопка продукту, написана з нуля поза button.css: власний радіус 4 - єдина четвірка на контролі в усьому продукті - власний кегль 12 і рамка 1px там, де в кожної іншої 1.5. Тепер це набір, обробка «акцент», розмір S, а footer.css не оголошує про неї нічого: 58 екземплярів, обидва в'юпорти. Поле поруч підтягнуло радіус за нею - зварена пара не може округлятись по-різному.
Іконкова кнопка 6.27 боксів · 18×20 … 54 · файл cart-button.cssціль ≥ 44 · один фініш у button.cssВиміряно: 15 іконкових форм, 506 екземплярів, сім різних боксів - а анатомія вище обіцяє 44px зону дотику. Обидва твердження разом хибні. Тепер чорнило лишається яким було, а ціль ніде не менша за 44: серце на картці виросло з 26 до 44 і не зрушило ні на піксель (12 - (44-26)/2 = 3), решта отримала ::after, який нічого не коштує в макеті. cart-button.css видалено: він двічі казав те саме - окремо для .pcard і для .pcard-l - і казав це в контексті картки, хоча в цій кнопці немає нічого картчиного.
Контурна кнопка 6.31px і 1.5px · дві мітки тексту · 6 редакцій ховера1.5px · line-strong · чорнило · один ховерІ тут же відповідь на питання, яке крок 5.5 лишив відкритим. Контурна кнопка читала і --line-strong, і --line-hair, і 5.5 відмовився це зводити, бо це не дрейф значення, а нерозв'язане питання ролі. Відповідь: лінія кнопки - це край контрола. Волосінь розділяє те, що лежить на одній плиті; кнопку натискають, і її край має триматись проти плити, а не зливатись із нею. Далі: рамка скрізь 1.5 (було 1 у сторінкуванні та .ob-collapse), підпис скрізь чорнилом (було вторинним у п'ятьох формах без жодної ознаки, що вони тихіші), ховер один - край і підпис ідуть в акцент. Він теж не вигаданий: продукт уже писав саме такий ховер у чотирьох місцях окремо. Локальні редакції знято з дев'яти файлів.
Текстова кнопка 6.44 кольори · 4 ваги · підкреслення навманнячорнило · ховер акцент · підкреслення за правиломСпершу поділ, і він вирішує майже все: 2 850 елементів на кольорових екранах не мають ні ґрунту, ні рамки, і за власною розміткою - <button>, onclick, role чи справжній href - 542 з них дії, а 2 308 посилання. Посилання не кнопка, це справа компонента «рядок посилань». Тому фініш накрив сім імен, а не три тисячі. Перевірено і визнано посиланнями: «Усі 6 →», «Читати більше ↓» (стрілка чесна - вона веде вниз тією ж сторінкою), «Залишити відгук», «Очистити все», «Завантажити квитанцію», «Скасувати та повернутись». Далі один колір (чорнило), один ховер (акцент), кільце фокусу - і підкреслення як правило, а не смак: воно є там, де кнопка стоїть усередині речення, і його немає в ряду контролів, де на кнопку вказує саме місце. :active у текстової немає навмисно: тиснути нічого, а рухати сам текст під пальцем гірше, ніж не відповідати зовсім.
Вимкнено 6.5клас .cd-blocked + локальне правило лічильника[disabled] і [aria-disabled] на всьому наборіШість вимкнених контролів на екранах, і два різні вигляди - які виявились правильними й ненаписаними. У лічильника немає плити, тому блідне лише знак (--mark-disabled); у кнопки кошика плита є, тому вона й гасне: --bg-sunken, волосінь, приглушений підпис. Продукт уже був згоден сам із собою - він просто ніколи цього не сказав, і сказав це класом. Клас - це варіант, а тут стан: та сама кнопка, зараз недоступна. Тепер вона тримається на атрибуті - [disabled] там, де тег дозволяє, і [aria-disabled="true"] там, де в розмітці <a> чи <span>; це заодно єдина версія, яку чує читач екрана. Правила стоять останніми у файлі навмисно: кожна обробка вище оголошує ховер, натиск і фокус на тій самій вазі, і саме позиція в кінці дозволяє вимкненій кнопці не відповідати ні на що - без жодного !important.
Драбина розмірів 6.625 висот · 13 падінгів · 5 кеглів · 4 радіуси · 75 правил у 23 файлах3 сходинки · 1 файлНайбільше зведення цієї серії, і воно було найпотрібнішим. П'ять обробок поверх такого дрейфу не дають набору - вони дають п'ять способів бути неузгодженим. Розмір тепер вирішується один раз, за іменем, а компонентний файл не оголошує для кнопки ні падінга, ні кегля, ні радіуса: 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, заголовок рядка замовлення, який його розкриває.

Правило натиску, і воно живе тут крок 7.33

Цей файл був єдиним у системі, хто мав стан натиску. Перепис у браузері по 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 уже дає ту саму землю.

Перевірено на дотику, а не припущено: 390 x 844, справжній тап по .btn--accent вводить елемент у :active, земля читається #E85200 проти #FF5A00 у спокої. Чи потрібен iOS Safari порожній слухач touchstart - [?]: пристрою iOS у цій сесії немає, тож це записано, а не вгадано
Дія, яку не відкотити крок 7.61

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

КонтролБулоСтало
«Видалити клієнта» · діалог тренераbtn--accent btn darkbtn--outline btn--danger
«Видалити» · діалог адресиbtn--accent btn darkbtn--outline btn--danger
«Видалити акаунт» · діалог профілюbtn--accent btn dark, віддається disabledbtn--outline btn--danger, так само disabled
«Видалити» · картка адреси, 3 штbtn--outline btn--s, тобто те саме, що «Редагувати» поручплюс btn--danger
«🗑 Видалити адресу» · діалог редагуванняbtn--outline btn--sплюс btn--danger
«Видалити акаунт» · відкривач у профіліbtn--text btn--danger, червоний лише на ховерічервоний у спокої
«Видалити недоступний товар» · cart-oosbtn--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, так і лишилось
Не полагоджено й не замовчано: той самий перепис каже, що 17 контролів зі словом-вилученням не носять із цього файлу жодного класу - вилучення рядка в .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
Розмітка
<button class="btn--accent btn--l btn--full">Оплатити карткою</button> <a class="btn--outline">Деталі та ТТН</a> <a class="btn--ghost btn--s">Квіз</a> <button class="btn--accent btn--icon" aria-label="У кошик"> <span class="uiv-ic" data-glyph="cart"></span></button> Номер підтверджено. <button class="btn--text btn--inline">Змінити</button> у будь-який момент. <!-- старе ім'я лишається гачком компонента: воно каже, ДЕ кнопка стоїть --> <a class="btn--accent btn--l btn--full co-confirm">Підтвердити замовлення</a>
Де вживається

Якорі: .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 ...

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

Чого бракує

  • .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.