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

Мітка наявності

Рядок про наявність. Каже словом, а не тільки кольором: «в наявності», «мало», «під замовлення», «немає». Принцип 1 в одному рядку - це чесність, а не продаж.

рівень 1design/system/components/availability.css141 рядок106 екземплярів36 екранів
Анатомія
В наявності
Залишилось мало
Під замовлення
Немає в наявності
1Крапка - форма, а не символ: 6px, currentColor, намальована через ::before. Тому вона завжди того самого кольору, що й слово, і її не читає вголос скрінрідер
2Слово - несе весь зміст, його достатньо без кольору
3Колір - підсилює, але не замінює слово
Атом не був атомом крок 7.35

Кожне правило цього файлу було прив'язане до .pcard - тобто компонент існував тільки всередині картки товару. Ця сторінка доводила це раніше, ніж хтось узявся б сперечатись: демо вище пише <div class="pavail low"> без картки навколо, і рендерилось чорним, 16px, без жодного стилю. Холостий контроль репортував це кілька кроків поспіль («2 з 5 класів немає взагалі: in out»), і це читалось як проблема стенда. Це була проблема області дії.

Чотири імені для одного рядка, у чотирьох файлах, три з них однакові до значення. Зміряно в браузері по 39 кольорових екранах:

Ім'яБуло деРівеньРозмірСкільки
.pavailavailability.css, у .pcard112/70092 на 16 екранах
.lavailproduct-card.css212/7007
.hd-avbanner.css212/7004
.bbavailbuy-box.css314/7003
В наявності - .pavail, картка в сітці
В наявності - .lavail, картка-рядок
В наявності - .hd-av, пропозиція дня В наявності - .bbavail, блок покупки, 14px
Чотири імені, одне правило. Перші три невідрізненні - і були невідрізненні й до зведення, просто трьома окремими блоками в трьох файлах

Перші три збігаються в кожному зміряному значенні й різняться лише тим, у якій коробці стоять. .bbavail на сходинку більший, бо PDP - екран, де ухвалюють рішення, і рядок там читають, а не проглядають. Це єдина справжня різниця в наборі, тому вона єдина лишається варіантом.

І в product-card.css лежало мертве оголошення

.lavail.pre, .lavail.out { color: --text-secondary } у рядку 30 і .lavail.pre { color: --text-info } у рядку 90. Перше не рендерилось ніколи. Та сама форма, яку крок 7.4 вимів 1 038 разів.

Імена не перейменовані

Усі чотири пише розмітка, яку поділяє заморожений сірий шар. Атом сьогодні відгукується на чотири імені, а перейменування - пункт Кроку 6: та сама лінія, яку stepper.css веде для .ci-qty / .co-qty, а stack-action.css - для .wf-tab / .wfh-act.
Крапку було надруковано 107 разів крок 7.35

Кожен такий рядок починався з символу ●, який лежав у розмітці:

<div class="pavail in">● В наявності</div>

107 штук на 17 кольорових екранах - і 108-ма, написана як CSS у status-pill.css (content: "● "). Тобто одна крапка мала три редакції: надрукована, згенерована і .hdots i, єдина, яка коли-небудь була формою.

Що не так із надрукованим знакомЗміряно
його читають вголосскрінрідер каже «чорне коло В наявності»
він не має власного розміру● в Inter - 5.16px чорнила на сходинці 12px і 6.02px на 14px: одне значення двома розмірами, яких ніхто не обирав
його не відрізнити від словані стилем, ні селектором - тому прибрати його з тексту і є вся правка

6px, одне значення, і воно виведене, а не вибране: 5.16 і 6.02 - те, що дав шрифт на двох сходинках, а 6 - ціле число між ними. Сходинка 12px додає 0.84px крапки, сходинка 14px віддає 0.02. currentColor - щоб крапка йшла за станом без другого правила на колір: чотири стани, чотири селектори, а не вісім. Проміжок --space-4 - те, що вже давав пробіл: зміряно 3.9px від чорнила до слова.

Ту саму форму взяли й статус-пілюлі замовлення - .oh-status і .aord-status, ще 5 екземплярів. Одна крапка, одне оголошення, чотири родини.

ДоставленоВ дорозіОбробляєтьсяДоставлено
Пілюлі статусу замовлення. Крапку їм малює цей файл - вона тут не декорація, а те саме твердження «де воно зараз»
Дві сходинки

Одна різниця в наборі, і вона названа: полиця проглядається, PDP читається.

В наявності - 12px, полиця й картка
В наявності - 14px, блок покупки Немає в наявності - той самий рядок, порожній склад
.bbavail також єдиний, кому доводиться оголошувати font-family: він стоїть усередині .bbmeta, а той моноширинний. Правило зняли разом із блоком - і A/B упіймав це в тому ж проході: рядок поїхав у моно й став на 8.5px ширшим
Варіанти і розміри

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

ВісьЗначенняПравило вибору
Стан.in 78 · .low 9 · .pre 9 · .out 4Стан приходить із даних складу, а не з розмітки.
Коліруспіх · попередження · сланець · нейтральний«Мало» бере попередження, «під замовлення» - сланець: це не проблема, це інший строк. «Немає» - тихий сірий, а не червоний: порожня полиця це факт, а не помилка.
Сходинка12 · 1414 тільки в блоці покупки.
Коли вживати

На картці, у сітці та в Блок покупки. Це чесність, а не продаж: принцип 1 вимагає сказати про порожній склад до того, як людина натисне.

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

Правило

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

Антиправило

Не кажи наявність самим лише кольором. Зелена крапка без слова не працює для 8% чоловіків з дальтонізмом і не працює в чорно-білому друці ТЗ. Для чисто візуального стану є Скелетон, і в нього немає що читати.
Не злито, і це сказано вголос

.ci-oostag у cart-row.css стверджує той самий факт - «Немає в наявності» - і має іншу форму: пілюля, 10px IBM Plex Mono, на запалій землі з волосяним краєм. Один екземпляр, на одному екрані.

Немає в наявності
Немає в наявності
Ліворуч - цей атом, праворуч - тег рядка кошика. Злити означало б вирішити, чи полична мітка стає пілюлею, чи рядок кошика віддає свій тег - а це рішення про вигляд, за яким стоїть один екземпляр. Коли рядок кошика отримає власний крок, це питання прийде з компанією
Стани, що є в коді

Чотири, і всі тримаються на класі: .in, .low, .pre, .out. Псевдостанів немає й не має бути - це мітка, а не контрол: її не наводять, не тиснуть і не фокусують.

Токени

Прочитані з availability.css, не переписані руками. Чотири ролі й сім примітивів, і найкоротше, що можна сказати про цю таблицю: у ній немає жодної заливки. Рядок полиці це чорнило на власному тлі сторінки, ніколи не плашка - на відміну від статусної пілюлі, з якою його весь час плутають.

Семантичні ролі (4)Примітиви (7)
--text-success - «В наявності»--font-body --fs-12 --fs-14
--text-warning - «Закінчується»--fw-bold
--text-info - «Передзамовлення»--radius-circle
--text-secondary - «Немає»--space-4 --space-8

Чотири стани полиці - чотири ролі, і жодна з них не поділена ні з ким. --text-info існує рівно для одного вживання (.pre) і більше ні для чого в системі: це та межа, де правило «дві ролі = два токени» зустрічає правило «одне-єдине вживання ще не роль», і виграє перше, бо передзамовлення це стан полиці, а не випадковий колір.

--radius-circle - це крапка, і вона намальована: символ ● прибрано зі 107 рядків розмітки, бо набраний знак читається вголос і не має власного розміру. --font-body оголошено навмисне, токеном, а не літеральним стеком, який ніс buy-box.css: рядок полиці трапляється всередині моноширинних цінових блоків, і без цього оголошення він успадкував би їхню гарнітуру.

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

Сторінка звіряє себе з файлом. Чужий контекст (.pcard) не рахується: у тому селекторі компонент не є підметом, він лише стоїть усередині когось, і min-height там відповідає на питання сітки, а не своє.

Розмітка
<div class="pavail in">В наявності</div> <div class="pavail low">Залишилось мало</div> <div class="pavail pre">Під замовлення</div> <div class="pavail out">Немає в наявності</div> <span class="bbavail">В наявності</span> <!-- блок покупки, 14px --> <div class="lavail in">В наявності</div> <!-- картка-рядок --> <span class="hd-av">В наявності</span> <!-- пропозиція дня -->
Крапки в розмітці більше немає - її малює ::before
Немає в коді -> етап 09

Чого бракує

  • Сірий шар зберігає надруковану крапку. wireframes/ заморожений після етапу 05, тож 107 символів прибрано в кольоровому шарі й лишено в прототипі. Той самий поділ, що на 7.29, 7.31, 7.32 і 7.34
  • Сім компонентів досі пишуть літерал 'Inter', sans-serif уже не пишуть - переміряно на 7.74. У компонентах не лишилось жодного; літерал живе тільки на сторінках design/concept/*, які не вантажать system/index.css, тож --font-body там не існує і літерал - єдиний спосіб це сказати. Цей рядок стояв неправдою від того кроку, який їх звів, і до 7.74
  • .ci-oostag не злито - див. розділ вище

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