До списку уроків
11 клас · Урок 5 з 14

Принципи дизайну і айдентика в коді

виконано0%
Крок 1

Сьогодні айдентика твого продукту стає файлом

Модуль I · тема 4 · урок 1 з 2 · наскрізний проєкт STARTUP LAUNCH · 120 хвилин

У тебе вже є сервер, бриф і числа. Сьогодні ти задаси сторінці власні кольори, шрифт і знак. І запишеш їх у файл, який читає браузер.

Набір таких рішень — кольори, шрифт, знак, відступи — і зветься айдентикою продукту. Це те, за чим твою сторінку впізнають серед сотні чужих.

Робити це будемо не в графічному редакторі, а в коді. Кольори стануть файлом brand.css, логотип — файлом assets/logo.svg. Обидва лягають у ~/www/ й доживають до Demo Day.

Дизайн тут — не «зроби гарно». Це відстані в пікселях, лінії вирівнювання, розміри шрифтів і коефіцієнти контрасту.

Майже все це — числа. А числа можна порахувати й перевірити машиною. Тому айдентику здають як код, а не як картинку.

Головна думка уроку Дизайн-токен — це рішення, записане один раз. Поки колір лежить у змінній --brand-accent, ти міняєш бренд одним рядком. Щойно #3b82f6 розповзся по сімнадцяти файлах — бренду більше немає, є сімнадцять різних синіх.

Після уроку ти вмієш

Слова «контраст», «шрифтова пара» і WCAG поки нічого не означають — розберемо їх по черзі.

Хід уроку

ЕтапХвЩо робимо
Розігрів: слайд-жах10називаємо проблеми своїми словами, без термінів
Чотири принципи20близькість, вирівнювання, контраст, повторення — «до і після»
Ієрархія і типографіка20три рівні уваги, шрифтова пара, шкала, довжина рядка
Колір і контраст за WCAG20відносна яскравість, поріг 4,5:1, конструктор палітри
Ревізія макета за 60 секунд10чотири повзунки, індекс читабельності, вихід у brand.css
Практика: логотип20малюємо й чистимо SVG локально, viewBox і currentColor
Практика: brand.css15токени у :root, <link> в index.html і brief.html
Автоперевірка й підсумок5check11 4, четвертий сегмент ракети
Що робиться де Генерація й обробка картинок — на твоєму комп'ютері. Усі чернетки логотипа, растрові варіанти, скриншоти залишаються локально: учитель дивиться їх очно на твоєму екрані. На сервер по FTP їдуть лише два легкі файли — brand.css і assets/logo.svg. Наскрізний критерій no_media діє й сьогодні.
Крок 2

Чотири принципи, які пояснюють майже все

Близькість · вирівнювання · контраст · повторення

Коли макет «якийсь не такий», причина майже завжди в одному з чотирьох місць.

Ці чотири принципи описала Робін Вільямс у книжці «The Non-Designer’s Design Book». Вони працюють однаково для плаката, слайда й вебсторінки.

Чому так надовго. Принципи описують не моду, а те, як око збирає зображення докупи. Око за пів століття не змінилося.

ПринципПравилоЯк виглядає порушення
БлизькістьЩо поруч — те пов’язане. Відстань між групами більша, ніж усередині групиПідпис однаково далеко від «свого» і від чужого блоку; читач сам вирішує, що до чого
ВирівнюванняКожен елемент стоїть на спільній лінії з іншим. Ліній має бути малоДев’ять елементів — дев’ять різних відступів зліва; сторінка «плаває»
КонтрастЯкщо елементи різні — вони мають бути різними явно, а не трохиЗаголовок 17 px, текст 16 px: незрозуміло, це заголовок чи збій
ПовторенняОдин спосіб робити одне й те саме на всій сторінціТри картки — три різні рамки, три радіуси, три відтінки синього
ДО · чотири порушення в одному макеті ПІСЛЯ · ті самі елементи, чотири правила NIMBUS 1 Розумний планувальник для класу домашка, дедлайни й нагадування в одному місці 3 Дедлайни Нагадування Розклад 4 Спробувати безкоштовно для школярів 2 · вісім різних ліній зліва NIMBUS Розумний планувальник домашка, дедлайни й нагадування в одному місці Дедлайни Нагадування Розклад що і коли за день до на тиждень Спробувати безкоштовно для школярів більший розрив = нова група 1 · Близькість 2 · Вирівнювання 3 · Контраст 4 · Повторення знак і назва — одна сутність, отже стоять поруч; відстань між групами більша, ніж усередині групи усі елементи від однієї лівої лінії; рівняння «на око» — це і є вісім різних ліній замість однієї заголовок 15 px напівжирний темний проти тексту 10 px сірого: різниця має бути очевидною, а не «трошки» три картки — один радіус, одна рамка, один колір заголовка: сторінка читається як одна річ, а не як чотири шаблони
Той самий набір елементів. Ліворуч нічого не «зіпсовано навмисно погано» — просто кожне рішення ухвалене окремо від інших. Праворуч елементів рівно стільки ж; змінилися чотири речі: відстані між групами, ліва лінія, розмір і колір заголовка, стиль карток.
Близькість — це відстані, а не рамки Найчастіша спроба «згрупувати» — обвести блок рамкою. Це додає ще одну лінію й ще один колір. Той самий результат дає порожнє місце: усередині групи 8 px, між групами 24 px. Око читає розрив як межу і без рамки.
Питання

На твоєму лендингу три заголовки, під кожним по абзацу. Однокласник каже: «Незрозуміло, який опис до якого заголовка». У CSS у тебе h3{margin:14px 0} і p{margin:14px 0}. Що виправить це найшвидше?

Питання

Ти зробив три картки послуг. Перша — з рамкою й радіусом 2 px. Друга — залита сірим, без рамки. Третя — з жовтою рамкою й гострими кутами. Виглядає «різноманітно». Що насправді читає відвідувач?

Крок 3

Ієрархія: чим ти керуєш поглядом

Перше, друге, третє — і жодного «однаково важливого»

На екрані людина спершу не читає, а сканує. За першу секунду око вихоплює один-два об’єкти. Які саме — вирішуєш ти.

Керуєш ти чотирма речами. Розміром літер. Вагою — це товщина накреслення, від тонкого до жирного. Кольором. І простором навколо.

Найсильніший із чотирьох — простір. Елемент, навколо якого порожньо, читається першим. Навіть коли він менший за сусідів.

Тому в макеті спершу розганяють відстані. І тільки потім беруться за розмір шрифту.

ЩО ОКО БАЧИТЬ ПЕРШИМ 1 Плануй тиждень повітря навколо 2 Один екран замість чотирьох застосунків дедлайни, домашка й нагадування живуть в одному місці 3 безкоштовно для школярів · без реклами © 2026 NIMBUS · умови · приватність ЧИМ ЗРОБЛЕНО КОЖЕН ЩАБЕЛЬ Рівень 1 — герой Рівень 2 — пояснення Рівень 3 — службове розмір 23 px · вага 700 колір основного тексту поле навколо 24 px розмір 14 px · вага 600 колір основного тексту поле навколо 12 px розмір 10 px · вага 400 приглушений колір поле навколо 6 px
Три щаблі — це максимум, який людина утримує без зусиль. Четвертий рівень майже завжди означає, що на екран напхано дві різні сторінки. Розміри на схемі — розміри самої схеми; у твоєму макеті співвідношення важливіші за конкретні числа.
Пастка «усе важливе» Коли на сторінці три жирні великі заголовки, головного немає жодного: ієрархія існує тільки через різницю. Якщо не можеш вибрати, що головне, — це питання не до дизайну, а до брифа: ти ще не вирішив, що продаєш.
Питання

На головному екрані твого лендингу назва продукту, слоган і кнопка «Спробувати» — усі трьома різними кольорами і всі великі. Учитель питає: «Що тут головне?» Ти відповідаєш «усе». Який найдешевший спосіб виправити це, не переверстуючи сторінку?

Крок 4

Типографіка продукту: пара, шкала, рядок

Дев’яносто відсотків твого лендингу — це текст

Шрифтів у продукті потрібно два: один для заголовків, другий для тексту. Можна й один — це не помилка, а дисципліна.

Три і більше — це вже не пара, а набір. Читач бачить не характер, а безлад.

Пара має контрастувати, а не бути схожою. Два майже однакові шрифти — те саме, що заголовок 17 px над текстом 16 px. Різниця є, а сенсу в ній немає.

Чому системні шрифти — нормальний вибір

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

Перший: на один запит до сервера менше. Другий: сторінка легшає на 30–100 КБ за кожне накреслення.

Третій помітний найбільше. Веб-шрифт вантажиться не миттєво: спершу текст малюється запасним шрифтом, а потім перескакує на справжній. Літери «стрибають» просто перед очима.

З телефона по мобільному інтернету цей стрибок видно щоразу.

шрифтова пара на системних стеках
:root{
  --font-head: "Segoe UI", system-ui, -apple-system, "Noto Sans", sans-serif;
  --font-body: system-ui, -apple-system, "Segoe UI", "Noto Sans", sans-serif;
}
/* стек читається зліва направо: перший шрифт, який є в системі,
   той і бере. Останнім завжди стоїть загальна родина — sans-serif */

Якщо береш шрифт із вебу — бери два накреслення, не шість. І перевір, чи є в ньому кирилиця.

Шрифт без кирилиці браузер мовчки замінить системним. Твоя айдентика протримається до першого українського слова.

Розмірна шкала

Розміри не вигадують окремо для кожного заголовка. Береш базовий розмір 16 px і множиш на 1,25. Виходить 20. Множиш 20 — виходить 25. Далі 31, далі 39.

Такий ряд і зветься розмірною шкалою. Кожен розмір у макеті ти береш із неї, а не з голови.

Навіщо. Шкала не дає з’явитися рядку «21 px, бо 20 замалувато». У макеті лишається шість розмірів замість двадцяти.

ШКАЛА 1,25 · КОЖЕН ЩАБЕЛЬ = ПОПЕРЕДНІЙ × 1,25 13 px 16 px 20 px 25 px 31 px 39 px Аа — підпис, виноска, службове Аа — основний текст сторінки Аа — підзаголовок Аа — заголовок розділу Аа — заголовок Аа — герой × 1,25 щоразу: 16 × 1,25 = 20 · 20 × 1,25 = 25 · 25 × 1,25 = 31,25 → 31
Шість щаблів вистачає на цілий лендинг. Числа округлені до цілих пікселів: 12,8 → 13, 31,25 → 31, 39,06 → 39.

Довжина рядка й міжрядковий інтервал

Комфортний рядок — 60–75 символів разом із пробілами. Довший рядок змушує око шукати початок наступного, і читач збивається. А закороткий рве фразу на шматки.

У CSS це один рядок: max-width: 66ch. Одиниця ch — це ширина нуля в поточному шрифті. Побільшав шрифт — обмеження поїхало за ним само.

Міжрядковий інтервал для основного тексту — приблизно 1,5. Це не смак, а вимога.

Є список правил, за якими перевіряють, чи зручно читати сайт людині зі слабким зором або з телефона на сонці. Його склали ті, хто домовляється про стандарти вебу. Великі сайти на цей список рівняються, а державні зобов’язані його виконувати.

Зветься список WCAG — Web Content Accessibility Guidelines, тобто «правила доступності вебвмісту». Правила в ньому пронумеровані.

Правило 1.4.12 якраз і просить, щоб текст лишався читабельним при інтервалі 1,5. Далі на сторінці трапляться ще номери — це той самий список.

Для великих заголовків інтервал навпаки зменшують до 1,1–1,2. Інакше рядки заголовка розповзаються.

Рядок задовгий — на широкому екрані виходить понад 100 символів

Планувальник збирає дедлайни з усіх предметів в один список і нагадує про них за день. Ти не заводиш завдання руками: розклад підтягується з класного журналу, а домашка — з чату класу. Кожен дедлайн можна відкласти один раз, і планувальник запам’ятає, скільки разів ти це робив із кожного предмета.

Рядок закороткий — близько 32 символів, фраза рветься

Планувальник збирає дедлайни з усіх предметів в один список і нагадує про них за день. Ти не заводиш завдання руками: розклад підтягується з класного журналу, а домашка — з чату класу.

Так треба — max-width: 66ch, міжрядковий 1,6

Планувальник збирає дедлайни з усіх предметів в один список і нагадує про них за день. Ти не заводиш завдання руками: розклад підтягується з класного журналу, а домашка — з чату класу. Кожен дедлайн можна відкласти один раз, і планувальник запам’ятає, скільки разів ти це робив із кожного предмета.

Питання

Ти виставив body{max-width:100%}, і на моніторі 27 дюймів абзаци тягнуться через увесь екран. Учитель каже: «Читати неможливо». Що з переліченого — найкоротше правильне виправлення?

Крок 5

Колір: у кожного своя робота — і одне число

Основний, акцент, нейтралі, статусні — і коефіцієнт контрасту, який усе вирішує

Палітра продукту — це не «кольори, які мені подобаються». Це ролі. Кожен колір відповідає рівно за одну.

Яскравих кольорів у палітрі всього два: фірмовий і акцентний. Решта — сірі різної світлості: фон, поверхня картки, лінії, текст.

Візьмеш третій яскравий — і око перестане розуміти, куди дивитися першим. Тому автоперевірка рахує різні кольори в brand.css. Більше восьми вона не пропустить.

РольСкількиЗа що відповідає
Основний (brand primary)1колір, за яким продукт упізнають: знак, головна кнопка, активний стан
Акцент (accent)1рідкісний і сильний: одна дія, яку ти хочеш, щоб натиснули
Нейтралі4–5фон, поверхня картки, лінії, основний текст, приглушений текст
Статусні0–2помилка й успіх; на лендингу часто не потрібні взагалі
НЕЙТРАЛІ · 90 % ПЛОЩІ ЕКРАНА --brand-bg --brand-surface --brand-line --brand-muted --brand-text фон сторінки картка, поле вводу роздільники, рамки підписи, виноски основний текст ≥ 4,5:1 до фону ≥ 4,5:1 до фону ≥ 3:1 до фону ФІРМОВІ · РАЗОМ НЕ БІЛЬШЕ 10 % ПЛОЩІ основна кнопка акцент, одна дія решта площі — нейтральна. Акцент працює, поки його мало --brand-primary --brand-accent знак, посилання, активний стан одна головна дія на екрані
Зразки на схемі намальовані змінними самої сторінки уроку — у твоєму brand.css на цих місцях стоятимуть твої кольори. Пропорція «90 % нейтралей, 10 % фірмових» — робочий орієнтир, а не закон.

Коефіцієнт контрасту: звідки береться число

Контраст у вебі — не «на око світліше чи темніше». Це число, яке рахують за формулою. Формулу задає WCAG, і кроків у ній три.

Крок 1 — прибрати гаму. Кожен канал R, G, B ділять на 255. Далі отримане число «розпрямляють».

Робиться це так. Якщо значення ≤ 0,03928 — ділять на 12,92. Якщо більше — беруть ((c + 0,055) / 1,055) у степені 2,4.

Навіщо крок. Монітор світиться нерівномірно: подвоєне число в коді не дає вдвічі яскравішої точки. Без розпрямляння числа брехали б.

Крок 2 — відносна яскравість. L = 0,2126·R + 0,7152·G + 0,0722·B.

Коефіцієнти різні не випадково. Око бачить зелений набагато яскравіше за синій — приблизно вдесятеро. Формула просто повторює цю особливість ока.

Крок 3 — відношення. (Lсвітлішого + 0,05) / (Lтемнішого + 0,05). Мінімум — 1:1 (два однакові кольори), максимум — 21:1 (чорний на білому).

Пороги, які треба знати напам’ять 4,5:1 — звичайний текст (WCAG 2.2, рівень AA). 3:1 — великий текст: від 24 px звичайного або 18,7 px напівжирного, а також рамки полів, іконки й інші нетекстові елементи, які щось означають. 7:1 — рівень AAA, потрібен там, де текст читають довго.
ОДИН І ТОЙ САМИЙ ТЕКСТ, П’ЯТЬ ВІДТІНКІВ СІРОГО НА БІЛОМУ Дедлайни на тиждень 1,6:1 провал не видно взагалі Дедлайни на тиждень 2,8:1 провал «стильно» на ноуті Дедлайни на тиждень 4,54:1 AA мінімум для тексту Дедлайни на тиждень 7,0:1 AAA запас на проєктор Дедлайни на тиждень 15,9:1 AAA майже чорний ЧОМУ ТУТ ЗАШИТІ КОНКРЕТНІ СІРІ, А НЕ ЗМІННІ СТОРІНКИ: коефіцієнт має бути той самий у світлій і темній темі — інакше підписані числа брехали б. Це єдине місце на сторінці з жорсткими кольорами.
Коефіцієнти пораховані за формулою WCAG для сірих #CCCCCC, #9A9A9A, #767676, #595959, #222222 на білому #FFFFFF. #767676 — найсвітліший сірий, який ще проходить 4,5:1 на білому.

Чому сенс не можна кодувати самим лише кольором

Приблизно кожен дванадцятий чоловік і кожна двохсота жінка розрізняють кольори інакше, ніж ти. Найпоширеніша форма — червоно-зелена. Для такого користувача твій «зелений = вільно, червоний = зайнято» — це дві однакові плями. Те саме буває й без жодних особливостей зору: чорно-біла роздруківка, дешевий проєктор, екран на сонці.

Вимога WCAG 1.4.1 звучить просто: колір не має бути єдиним способом передати інформацію. Колір лишається — до нього додають другий сигнал: значок, підпис, форму, штрихування, підкреслення.

Тільки кольоромКолір + другий сигнал
Червоне поле формиЧервоне поле + значок і текст «вкажи пошту»
Зелена й червона точки в статусіТочки + підписи «вільно» / «зайнято»
Посилання відрізняється лише кольоромПосилання підкреслене
Дві лінії на діаграмі різного кольоруРізний колір + суцільна і пунктирна
Питання

Твій сірий текст на білому виглядає стильно на твоєму ноутбуці, а з проєктора в класі його не видно. Яке число це передбачає — і чому воно показує проблему ще до того, як ти дійшов до кабінету?

Питання

У формі відгуків на твоєму сайті незаповнене поле підсвічується червоною рамкою — і більше нічим. Тестує однокласник, який не розрізняє червоний і зелений. Що він побачить і що треба додати?

Крок 6

Конструктор палітри: формула WCAG наживо

Обери один колір — сторінка добудує решту, порахує кожну пару і згенерує brand.css

Нижче — не «підбірка гарних кольорів». Сторінка бере твій основний колір і виводить із нього решту палітри.

Далі для кожної пари вона проходить ті самі три кроки: розпрямляє гаму, рахує яскравість, ділить одне на друге.

Числа, які ти бачиш, справжні. Те саме порахує check11 4 на сервері.

Палітра продукту
Світла тема
Темна тема — ті самі ролі, інші значення
Перевірка пар за формулою WCAG
ПараДе це видноПорігКонтраст

Рядок «лінія → фон» — довідковий: суто декоративний роздільник порога не має. Але щойно ти обводиш тією самою лінією поле вводу чи кнопку, вона стає межею елемента керування — і тоді за WCAG 1.4.11 їй потрібно 3:1. У такому місці бери не --brand-line, а --brand-muted: він уже проходить 4,5:1.

brand.css

      

Скопіюй, збережи як brand.css у кодуванні UTF-8 і поклади в ~/www/. Значення можна й потрібно правити руками — конструктор дає робочу основу, а не вирок.

Конструктор не думає замість тебе Він рахує контраст і будує ряд — але не знає, що твій продукт про сон, а ти обрав кислотно-жовтий. Колір — рішення з брифа: кому продаєш і що обіцяєш. Число 4,5:1 лише каже, чи можна це прочитати.
Питання

Конструктор показує: текст на фоні — 12,4:1, а біла підпис на твоїй основній кнопці — 2,1:1. Ти кажеш: «Головне ж 12,4, перевірка пройде». Що з цим не так на практиці?

Крок 7

Ревізія макета за 60 секунд

Чотири повзунки — чотири принципи. Той самий макет, інші числа

Ліворуч — навмисно поганий екран продукту. Поганий він не тому, що «негарний».

У ньому одночасно порушені всі чотири принципи. Крути повзунки й дивись, як міняється кожен складник індексу. Мета — 90 і вище.

Дизайн-ревізія
NIMBUS

Плануй тиждень за хвилину

дедлайни, домашка й нагадування в одному місці

Дедлайнищо і коли здавати
Нагадуванняза день до строку
Розкладна весь тиждень
безкоштовно для школярів

Індекс читабельності
0
Близькість · відступ між групами6 px
Вирівнювання · спільна ліва лінія0 %
Контраст заголовка1,0:1
Повторення · один стиль карток0 %

Індекс — середнє арифметичне чотирьох складників, по 25 % кожен. Складник «контраст» рахується з реального коефіцієнта WCAG між кольором заголовка й фоном макета. Три інші складники — оцінка, придумана автором сторінки для цієї вправи: у стандартах таких чисел немає.

brand.css

      

Це той самий файл, що й у конструкторі вище: обидва інструменти працюють з однією палітрою й пишуть в один brand.css. Ревізія додає до нього ритм — --gap-group і --radius. Зміни основний колір — і макет ревізії перефарбується разом із файлом.

Питання

Ти витягнув індекс до 92, але зробив це так: відступ між групами 46 px, вирівнювання 100 %, контраст 100 %, повторення 100 %. На екрані телефона половина блоків поїхала за межу першого екрана. Що показує ця ситуація про сам індекс?

Крок 8

Палітра як CSS-змінні: одне рішення — одне місце

Дизайн-токен — це той самий майстер-слайд, тільки в коді

Уяви: ти написав color:#3b82f6 у чотирьох файлах і сімнадцяти правилах. Через тиждень вирішив, що синій занадто «банківський».

Тепер треба знайти всі сімнадцять місць. І не переплутати з #3b81f6 — його ти одного разу набрав із помилкою.

Одне місце легко пропустити. Через місяць у продукті буде три різні сині, і жоден не буде «кольором бренду».

CSS-змінна прибирає цю проблему повністю. Значення живе в одному місці, у решті коду стоїть ім’я ролі:

brand.css · так
:root{
  --brand-primary: #3b82f6;
}

.btn      { background: var(--brand-primary); }
a         { color:      var(--brand-primary); }
.logo svg { color:      var(--brand-primary); }
/* міняєш бренд — правиш один рядок, а не сімнадцять */

Ім’я токена називає роль, а не колір

Токен --blue живе до того дня, коли бренд стане зеленим. У коді залишиться рядок --blue: #16a34a. Ім’я вже бреше.

А --brand-primary переживе будь-яку зміну кольору. Воно називає призначення, а не відтінок.

Те саме з відступами: --gap-group краще за --gap-24.

Погане ім’яДобре ім’яЧому
--blue--brand-primaryколір зміниться, роль — ні
--gray-3--brand-mutedз номера не видно, де це застосовувати
--big--fs-h1«великий» відносно чого?
--px24--gap-groupзначення прив’язане до імені й не міняється

Темна тема — це перевизначення тих самих імен

Головна вигода токенів видно саме тут. Темна тема не переписує жодного правила оформлення.

Вона лише підставляє інші значення в ті самі змінні. Усе, що написане через var(--brand-…), перефарбовується саме собою.

темна тема без жодного нового правила
:root{
  --brand-bg:   #f7f8fa;
  --brand-text: #14181d;
}

/* 1) якщо в системі увімкнено темну тему */
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --brand-bg:   #0d1116;
    --brand-text: #e6ebf0;
  }
}

/* 2) якщо користувач сам натиснув перемикач */
:root[data-theme="dark"]{
  --brand-bg:   #0d1116;
  --brand-text: #e6ebf0;
}

Два блоки потрібні тому, що станів три: «як у системі», «світла примусово», «темна примусово».

Сторінка, яку ти зараз читаєш, зроблена так само. Відкрий її на телефоні з темною темою й порівняй.

Контраст треба рахувати в обох темах Темна тема — не інверсія. Чистий білий текст на чистому чорному дає 21:1 і на OLED-екрані світиться так, що літери «розпливаються». Робочий прийом видно на самій цій сторінці: її темний фон — #0d1116, а текст — #e6ebf0, і жоден із них не є ані чистим чорним, ані чистим білим. Конструктор вище рахує темну пару окремо — саме тому в таблиці є рядок «темна тема».
Питання

На уроці 6 ти зробиш deck.html на токенах бренду. Перед Demo Day ти вирішуєш змінити основний колір. У першому варіанті кольори в деку прописані літералами #3b82f6, у другому — через var(--brand-primary) з підключеного brand.css. У чому різниця за часом і чому це питання не про красу?

Крок 9

Логотип у SVG: текстовий файл, який малює знак

viewBox, currentColor і чому вектор тут не обговорюється

Відкрий logo.svg звичайним блокнотом. Ти побачиш текст: тут коло, тут прямокутник, тут лінія від точки до точки.

SVG — не картинка, а список інструкцій «що намалювати». Тому знак правиться в редакторі коду, лягає в Git і важить кілька сотень байтів.

ПитанняРастр (PNG, JPG)Вектор (SVG)
Що зберігаєтьсясітка пікселівінструкції: фігури й координати
Банер 3×2 метрирозсипається на квадратита сама чіткість
Вага знакадесятки–сотні КБчастки кілобайта
Змінити колірперемалювати й перезалитиодин рядок CSS
Темна темапотрібен другий файлcurrentColor — той самий файл
Пошук і читаннянепрозорий бінарникзвичайний текст, індексується
СИСТЕМА КООРДИНАТ МАЛЮНКА · viewBox="0 0 64 64" 0,0 64,64 клітинка сітки = 8 одиниць ТОЙ САМИЙ ЗНАК ЯК ТЕКСТ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" fill="none" stroke="currentColor" stroke-width="6" stroke-linecap="round" stroke-linejoin="round" role="img"> <title>NIMBUS — планувальник</title> <rect x="6" y="6" width="52" height="52" rx="14"/> <path d="M20 33 L29 43 L45 22"/> </svg> viewBox currentColor title своя система координат: усі числа всередині — у ній, а не в пікселях знак бере колір від CSS-властивості color — отже й від var(--brand-primary) що це за знак — для тих, хто не бачить картинки; це не підпис на екрані
Ліва половина — сітка viewBox, збільшена втричі, щоб було видно координати. Права — той самий знак у дев’яти рядках тексту. Файл із цим кодом важить близько 340 байтів.

viewBox: розмір малюнка й розмір на екрані — різні речі

viewBox="0 0 64 64" каже: усередині файлу малюнок має розмір 64 на 64. У цих одиницях і записані всі координати.

width і height кажуть інше: покажи це на екрані ось такого розміру.

Тому та сама розмітка малює і фавікон 16 px, і знак на банері. Міняється лише друге число.

Без viewBox малюнок прив’язується до пікселів і не тягнеться. Це найчастіша причина скарги «SVG чомусь не росте на всю ширину».

currentColor: логотип, який сам знає про темну тему

fill="currentColor" означає «візьми колір із CSS-властивості color того місця, куди мене вставили». Один файл — і в шапці знак фірмовий, у підвалі приглушений, у темній темі світлий:

один logo.svg — три різні стани
/* працює тільки для інлайнового SVG — вставленого прямо в HTML.
   Той самий файл через <img src="logo.svg"> кольору ззовні не бачить */
.site-head .logo { color: var(--brand-primary); }
.site-foot .logo { color: var(--brand-muted); }
.btn .logo       { color: var(--brand-bg); }

Чистка експортованого SVG

Редактор — Inkscape, Figma, Illustrator — експортує SVG зі своїм сміттям. Це його службові записи: чужі атрибути, порожні групи, номер на кожній точці.

Інколи всередину потрапляє навіть ціла растрова картинка. Ось що прибрати.

перевірка логотипа перед заливкою
$ grep -c "<image" ~/www/assets/logo.svg 0 ← нуль. Один і більше — усередині растр $ grep -o 'viewBox="[^"]*"' ~/www/assets/logo.svg viewBox="0 0 64 64" $ du -b ~/www/assets/logo.svg 341 /home/<логін>/www/assets/logo.svg $ head -c 120 ~/www/assets/logo.svg <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" ...

Числа у виводі ілюстративні: у твоєму файлі буде свій розмір і свій viewBox. Важливі тут лише два факти — нуль у першому рядку і наявність viewBox у другому.

Кодування й BOM Зберігай logo.svg і brand.css у UTF-8. У Windows PowerShell 5.1 ключ -Encoding utf8 додає на початок файлу BOM — три невидимі байти. Для XML це зайвий клопіт, тож надійніше зберігати без BOM: [IO.File]::WriteAllText($p,$t,(New-Object Text.UTF8Encoding $false)) або просто «UTF-8 without BOM» у налаштуваннях редактора. У Git Bash, macOS і Linux звичайне перенаправлення > BOM не додає.
Питання

Твій logo.svg важить 180 КБ і в редакторі коду починається з рядка <image width="512" height="512" xlink:href="data:image/png;base64,iVBORw0KGgo…. Автоперевірка його відхиляє. Що сталося і що робити?

Питання

Ти вставив логотип як <img src="assets/logo.svg"> і прописав у CSS .logo{color:var(--brand-primary)}. Знак лишається чорним у будь-якій темі. Чому і як це виправити?

Крок 10

Практика: brand.css і assets/logo.svg

Виконуй по черзі. Галочки зберігаються — сторінку можна закрити.

Що робиться локально, що їде по FTP Логотип ти малюєш і чистиш у себе на комп’ютері: у векторному редакторі, у AI-редакторі Antigravity або прямо руками в коді. Усі растрові чернетки, згенеровані варіанти й скриншоти лишаються там же — учитель дивиться їх очно на твоєму екрані. На сервер по FTP їдуть рівно два файли: brand.css~/www/ і logo.svg~/www/assets/. Обидва — легкий текст.
Правило модуля AI пише чернетку — ти перевіряєш, правиш і відповідаєш за результат. Якщо генератор видав тобі логотип із вбудованим растром чи палітру, де текст не проходить 4,5:1, це твоя помилка на здачі, а не його. Перевіряй числами, а не враженням.
Крок 11

Автоперевірка check11 4 (перша частина)

Сервер розбере твій brand.css, порахує контраст за тією самою формулою WCAG і подивиться на logo.svg як на XML. Спроби не обмежені.

Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка запускає check11 4 від імені учня і читає ~/.progress/11-4.json. Друга половина check11 4 закриється на уроці 6 разом із pitch.html, deck.html і og.png.

Про два обов’язкові критерії contrast_45 блокує оцінку, бо весь урок був саме про це число: палітра, у якій основний текст не читається, — це не «інший смак», а несправна сторінка. no_media діє наскрізно весь модуль: у ~/www/ і ~/upload/ не має бути .mp4 .mov .avi .mkv .webm .mp3 .wav .flac і файлів понад 2 МБ. На уроці 14 check11 8 прожене ці перевірки повторно.

Що вчитель дивиться на екрані

Крок 12

Шкала виконання

Це те, що бачить учитель, коли виставляє оцінку.

СкладникВагаРезультат
Виконано
0%
Рекомендований бал за 12-бальною

Домашнє завдання

  1. Підбери другу, темну, пару кольорів так, щоб контраст теж проходив 4,5:1, і додай її в brand.css окремим блоком-коментарем. Конструктор палітри вже видає цей блок — але числа звір сам і, якщо треба, поправ.
  2. Прожени свій лендинг через «сірий тест»: відкрий index.html, у DevTools постав фільтр filter: grayscale(1) на body і перевір, чи лишається зрозумілим, де що. Якщо ні — знайди місце, де сенс тримався лише на кольорі, і додай другий сигнал.
  3. Запиши у ~/notes/brand.md три речення: який колір основний і чому саме він для твого продукту, яка шрифтова пара і чому, який коефіцієнт контрасту в пари «текст — фон». Це чернетка слайда «айдентика» для Demo Day.
Анонс уроку 6 Наступного разу — сторітелінг пітчу: вісім блоків від проблеми до заклику, pitch.html з якорями й автозмістом, HTML-презентація deck.html на восьми слайдах і прев’ю посилання в месенджері. Дек будується на твоїх токенах: кольори в ньому мають бути var(--brand-…), а не літералами. Сьогоднішній brand.css — це те, з чого він буде зроблений.
Джерела

Звідки взяті правила й числа

Пороги контрасту, формула яскравості й вимоги до розмітки — зі стандартів, а не з чийогось смаку. Перевіряти дозволено й корисно.

Коефіцієнти на «драбині контрасту» пораховані автором сторінки за формулою WCAG для конкретних сірих на білому #FFFFFF — їх можна перевірити будь-яким калькулятором контрасту. «Індекс читабельності» в ревізії макета — вигадана автором сторінки навчальна оцінка: у стандартах такого показника немає, справжнє в ньому лише складник контрасту. Розмірна шкала 1,25 — загальновживана практика, а не вимога. Повний список джерел із поясненнями — у файлі urok-05-джерела.md поруч із цією сторінкою.