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

Ціна

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

рівень 1design/system/components/price.css418 рядків9 поверхонь60 екранів
Анатомія
1 520 ₴
1 290 ₴ 18 ₴ / порція
1Цифра - IBM Plex Mono, tabular-nums: ширина цифри стала, тому ціни в сітці стоять колонкою
2Знак ₴ - .uiv-cur, півкегля батька: повнорозмірний поруч з 36px цифрою читається як ще одна цифра
3Стара ціна - закреслена, сірa, 400: її треба прочитати і відпустити
4Помаранчевий - і тільки тоді, коли стара ціна справді стоїть поруч. Це читає :has(), не рука
Дев'ять поверхонь, одна структура

Кожен блок нижче - розмітка з продукту, не переписана. Ліва колонка зі знижкою, права без неї: помаранчевий з'являється і зникає сам, бо правило читає наявність закресленої ціни, а не клас, який хтось не забув поставити.

Картка сітки .pnew .pold
1 520 ₴
1 290 ₴
та сама, без знижки
1 290 ₴
Картка списку .lprice .lold
1 520 ₴
1 290 ₴
18 ₴/порція
та сама, без знижки
1 290 ₴
18 ₴/порція
Пропозиція дня .hd-new .hd-old
1 520 ₴ 1 290 ₴
та сама, без знижки
1 290 ₴
Блок покупки PDP .new .old
1 520 ₴
1 290 ₴
він же в режимі коуча .retailref
1 520 ₴
1 290 ₴
Полиця PDP .tnew .told
1 520 ₴ 1 290 ₴
Смуга покупки .mbp .mold
1 520 ₴ 1 290 ₴
Рядок кошика .ci-sum .ci-old
1 520 ₴ 1 290 ₴ 1 050 ₴ / шт
Рядок замовлення .li-sum .li-old
1 520 ₴ 1 290 ₴
Рядок сесії коуча .cprice - 13 у кольорі
460 ₴549 ₴
Дев'ята поверхня

Екрани коуч-сесії існують лише в wireframes/: кольорового близнюка в них ще немає. Ім'я стоїть у файлі наперед, щоб на Кроці 6 рядок прийшов уже з атомом, а не був виведений заново з того, що казав сірий файл.

Варіанти і розміри

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

ВісьЗначенняПравило вибору
Рольактуальна · стара · за порцію«За порцію» - це не менша ціна, а інша одиниця. Вона стоїть під ціною, ніколи замість неї.
Колірчорнило · акцентАкцент бере лише ціна зі знижкою. Правило зафіксоване в DESIGN-artifacts.md 2026-07-29: помаранчевий тут означає «дешевше, ніж було». Якщо ним пофарбувати всі ціни, він перестане означати будь-що. Виняток один - коуч-режим PDP, де закреслена цифра це роздрібна ціна для довідки, а не знижка коучу.
Розмір20 · 24 · 30 · 36Розмір належить поверхні, не атому. 20 у рядку кошика і 36 у блоці покупки - два рішення про один факт, і обидва правильні. Поріг контрасту з того ж правила: #FF5A00 на білому це 3.13:1, тому акцент дозволений ціні лише від 19px жирним - усі чотири рунги його проходять.
Вага800 на 20-24 · 700 на 30 · 600 на 36На 20px вага одна: атом її і тримає. Вище 20 вагу лишено поверхні - жирне на дисплейному кеглі це не те саме оптичне рішення, що жирне на 20, і ранжувати дисплейні ваги це питання етапу 09.
Коли вживати

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

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

Правило

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

Антиправило

Не пиши це правило вдруге. Воно було написане вісім разів, по одному на файл, і сенс його в тому, що воно не може розійтися з фактом. Вісім копій правила, яке не може розійтися, - це і є розходження.
Стани, що є в коді

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

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

Сторінка звіряє себе з файлом: 22 власних класів і 0 станів оголошено в price.css. Нижче - ті, яких на цій сторінці немає ні в демо, ні в розмітці. Чужий контекст не рахується: у селекторах .pcard, .bb, .pdp-tabs, .mbuybar, .hd-price компонент не є підметом, він лише стоїть усередині когось.

Токени

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

Семантичні ролі (3)Примітиви (3)
--text-action --text-body --text-muted--font-mono --fw-black --fw-regular

--fw-regular заведено цим кроком. Система завжди вживала 400 і жодного разу його не назвала, бо 400 - це те, що виходить, коли не пишеш нічого. Стара ціна це те єдине місце, де його треба сказати вголос: .told стоїть усередині .tprice, який оголошує 600.

Токен, який атом не взяв. --text-price-was заведено саме під закреслену ціну, і атом його не читає: #AAAAAA на білому це 2.32:1, а скільки річ коштувала раніше - це факт, з яким людина звіряє знижку, а не оздоблення. Усі 40 закреслених цін у продукті і так малюються --text-muted (5.2:1). Коментар токена тепер це і каже.

Розмітка
<!-- структура однакова на всіх дев'яти поверхнях, змінюються лише імена --> <div class="poldline"><span class="pold">1 520 ₴</span></div> <span class="pnew">1 290 <span class="uiv-cur">₴</span></span> <!-- знижки немає: рядок старої ціни лишається порожнім, і цього досить --> <div class="poldline"></div> <span class="pnew">1 290 <span class="uiv-cur">₴</span></span>

Знак ₴ у розмітці не загорнутий: його загортає design/_nav.js, розрізаючи текстовий вузол. Тут він написаний руками, бо стенд показує результат, а не процес.

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

Якорі: .pnew .pold .lprice .lold .hd-new .hd-old .new .old .tnew .told .mbp .mold .ci-sum .ci-old .li-sum .li-old .cprice

Заміряно в браузері на 390 і 1280: .pnew 92 на 16 екранах · .pold 22 на 13 · .lprice 7 · .lold 2 · .hd-new / .hd-old по 4 на 4 · .new / .old по 2-3 на PDP · .tnew / .told по 2 · .mbp b / .mold по 3 · .ci-sum 6 на 2 · .li-sum 9 на 3. .cprice - 13 у кольорі з кроку 7.95: cart-coach 4, coach-session 5, coach-client 4. До 7.96 жива цифра стояла 16px, а закреслена теж 16px, тобто співвідношення 1,00 при 0,60 у кошику покупця.

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

Чого бракує

  • Шістнадцять імен на одну цифру. Перейменування - Крок 6, бо ці ж імена носить заморожений сірий шар. .new, .old і .cut у голові тієї черги: це взагалі не імена
  • 36px написано літералом - токена --fs-36 немає, і блок покупки єдиний, хто його просить
  • Знак ₴ ставить JS, а не CSS - на екрані без скрипта він лишається повнорозмірним, і design/_nav.js перезапускає його в чотирьох місцях
  • Немає стану «ціна коуча» як окремого токена - вона зараз просто ще одна ціна, а .retailref знімає з неї акцент
  • Чіп -N% не тут - це атом discount.css, у нього теж вісім імен і розкол Mono/Inter 27 проти 13. Заміряно цим кроком, полагоджено буде наступним

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