Tailwind

Типографіка та система кольорів у Tailwind v4

Академічний розбір типографічної та кольорової систем Tailwind CSS v4: OKLCH-палітра, opacity modifiers, font-size шкала, line-height, font-weight, text-balance/pretty, prose плагін та практичні патерни. З живими прикладами та завданнями.

Типографіка та система кольорів у Tailwind v4

Чому типографіка та кольори — це архітектурне рішення

Коли розробники починають роботу з UI, типографіку і кольори часто розглядають як декоративні деталі, що можна «налаштувати пізніше». Це фундаментальна помилка. Кольорова система і типографічна ієрархія — це архітектура комунікації: вони визначають, що користувач побачить першим, що прочитає другим, і як зрозуміє ієрархію інформації на сторінці.

У контексті Tailwind ці системи мають ще один вимір: вони є дизайн-токенами, що пов'язують CSS-утиліти з семантичними значеннями. Правильно побудована кольорова система дозволяє перемикати теми єдиною змінною; грамотна типографічна шкала — описати будь-яку ієрархію контенту за допомогою кількох передбачуваних класів.

Tailwind v4 суттєво еволюціонував обидві системи: перехід на OKLCH-кольори вирішив давні проблеми перцептивної рівномірності, а нові утиліти text-balance та text-pretty вперше дозволили контролювати переноси рядків без JavaScript.

Ця стаття передбачає знайомство з матеріалом попередніх статей, зокрема з @theme (стаття 05) та системою варіантів (стаття 06). Рекомендуємо прочитати їх перед тим, як продовжувати.

Кольорова система Tailwind v4: від палітри до токенів

Стандартна палітра: 22 шкали, 11 відтінків

Tailwind поставляється з повною кольоровою палітрою, що охоплює 22 колірних сімейства. Кожна шкала містить 11 ступенів — від 50 (майже білий) до 950 (майже чорний). Це дає 242 готових кольорових значення без будь-якої конфігурації:

ГрупаКольори
Нейтральніslate, gray, zinc, neutral, stone
Тепліred, orange, amber, yellow
Природніlime, green, emerald, teal
Холодніcyan, sky, blue, indigo
Фіолетові/Рожевіviolet, purple, fuchsia, pink, rose

Числова шкала відтінків побудована за принципом семантичного призначення: 50–200 — фони і підкладки, 300–400 — рамки і розділювачі, 500–600 — основний акцентний колір, 700–900 — темні текстові варіанти, 950 — майже чорний для темних тем.

<!-- Семантичне використання шкали slate -->
<div class="bg-slate-50">        <!-- Фон сторінки або секції -->
    <div class="bg-white border border-slate-200 rounded-xl p-6">
        <span class="text-xs font-bold uppercase tracking-widest text-slate-400">
            Мітка категорії — slate-400
        </span>
        <h2 class="text-xl font-bold text-slate-900 mt-1">
            Заголовок картки — slate-900
        </h2>
        <p class="text-sm text-slate-600 mt-2 leading-relaxed">
            Основний текст — slate-600, добре читається на білому.
        </p>
        <div class="border-t border-slate-100 mt-4 pt-3">
            <span class="text-xs text-slate-400">slate-100 як лінія розділення</span>
        </div>
    </div>
</div>
🔒localhost:3000

OKLCH: революція у кольоровому просторі

У Tailwind v4 вся стандартна палітра переведена на колірний простір OKLCH. Щоб зрозуміти практичне значення цього, розглянемо фундаментальну відмінність між sRGB і OKLCH.

У традиційному sRGB кольорах (#4f46e5, rgb(79, 70, 229)) числа описують фізичну інтенсивність R, G, B каналів. Ці числа не корелюють із тим, як людський мозок сприймає яскравість. Наслідком є те, що кольори з однаковим числовим значенням яскравості (blue-500 і yellow-500) виглядають принципово різними за перцептивним контрастом.

OKLCH (Oklab Lightness, Chroma, Hue) будує кольоровий простір навколо людського сприйняття:

oklch(L C H / α)
       │ │ │   └── Прозорість (0–1)
       │ │ └────── Відтінок (0–360°, кут на колірному колі)
       │ └──────── Насиченість (0–0.37+, 0 = сірий)
       └────────── Яскравість (0–1, де 0 = чорний, 1 = білий)

Ключова властивість OKLCH: значення L (Lightness) є перцептивно рівномірним. Тобто indigo-500 і emerald-500 мають однакове значення L і справді виглядають однаково яскраво — текст на них матиме однаковий рівень читабельності. Це усуває клас проблем, де дизайнер підбирав кольори на oko, бо цифрова система їм не допомагала.

::field{name="Перцептивна рівномірність" type="Lightness} blue-500 та indigo-500 мають однаковий L — однаковий зоровий контраст із білим текстом. У sRGB вони відрізнялись і доводилось підбирати вручну. ::

P3 колірний охват
Display
На сучасних дисплеях Apple (MacBook, iPhone) та Samsung AMOLED OKLCH дозволяє використовувати кольори ширшого охвату Display P3 — яскравіші, насиченіші. Браузери застосовують це автоматично.
Точні маніпуляції
CSS relative colors
oklch(from var(--color-brand) calc(l * 0.85) c h) — точно затемнений варіант бренд-кольору без зсуву відтінку. У sRGB це потребувало ручного підбору або JS.

Opacity modifier /: прозорість у назві класу

До Tailwind v3 для напівпрозорого фону потрібно було або окремий клас bg-opacity-50, або CSS-змінна. Tailwind ввів елегантніше рішення — opacity modifier у форматі {utility}/{opacity}:

<!-- Фон із різною прозорістю -->
<div class="bg-indigo-500/100">Непрозорий</div>
<div class="bg-indigo-500/75">75% непрозорий</div>
<div class="bg-indigo-500/50">50% — напівпрозорий</div>
<div class="bg-indigo-500/25">25%</div>
<div class="bg-indigo-500/10">10% — ледве помітний тінт</div>
<div class="bg-indigo-500/0">Повністю прозорий</div>

<!-- Текст -->
<p class="text-slate-900/80">Трохи приглушений текст</p>
<p class="text-slate-900/50">Напівпрозорий текст (уникайте для основного!)</p>

<!-- Рамка -->
<div class="border border-white/20">Напівпрозора рамка на темному фоні</div>

<!-- Focus ring -->
<input class="focus:ring-2 focus:ring-indigo-500/30 focus:outline-none" />

<!-- Довільне значення -->
<div class="bg-indigo-500/[0.35]">35%</div>

Opacity modifier підтримується для bg-, text-, border-, ring-, shadow-, outline-, divide-, placeholder-, caret- та accent-. Технічно він реалізований через CSS color-mix() або змінну --tw-bg-opacity, що дозволяє плавно змінювати прозорість без зміни базового кольору.

Glassmorphism — один із найефективніших застосувань opacity modifier:

<!-- Скляна картка поверх градієнтного фону -->
<div class="relative bg-gradient-to-br from-indigo-500 to-purple-600 p-8 rounded-2xl">
    <div class="bg-white/10 backdrop-blur-sm border border-white/20
                rounded-xl p-6 text-white">
        <!-- bg-white/10 = білий із 10% прозорістю -->
        <!-- border-white/20 = рамка з 20% прозорістю -->
        <!-- backdrop-blur-sm = розмиття фону за карткою -->
        <h3 class="font-bold text-lg">Glassmorphism картка</h3>
        <p class="text-white/70 mt-2 text-sm">Текст із 70% прозорістю</p>
    </div>
</div>
🔒localhost:3000

🧪 Практика: кольорова система

Визначте у @theme повну кольорову систему для SaaS-продукту: (1) основний бренд-колір через --color-brand-{50..900} в OKLCH, (2) семантичні токени --color-bg, --color-surface, --color-text, --color-muted, --color-border, --color-accent, (3) реалізуйте 3 компоненти (кнопка, картка, badge), що використовують семантичні токени — не конкретні кольори.


Типографічна система: від font-size до text-wrap

Шкала font-size та вбудований line-height

Найважливіша деталь, яку розробники часто не помічають: кожен text-{size} клас у Tailwind задає два значення одночасноfont-size та line-height. Це не випадково: команда Tailwind розрахувала оптимальний міжрядковий інтервал для кожного розміру тексту, щоб розробникам не потрібно було думати про це окремо.

Класfont-sizeline-heightПризначення
text-xs12px (0.75rem)16pxCaption, labels, badges, metadata
text-sm14px (0.875rem)20pxSecondary text, descriptions, UI
text-base16px (1rem)24pxBody text (стандарт)
text-lg18px (1.125rem)28pxLead paragraph, intro
text-xl20px (1.25rem)28pxSub-heading, card title
text-2xl24px (1.5rem)32pxSection heading
text-3xl30px (1.875rem)36pxPage section title
text-4xl36px (2.25rem)40pxHero subtitle
text-5xl48px (3rem)1 (= font-size)Hero title
text-6xl60px (3.75rem)1Display
text-7xl72px (4.5rem)1Large display
text-8xl96px (6rem)1XL display
text-9xl128px (8rem)1XXL display

Зверніть увагу на перехід при text-5xl: від line-height: 28px до line-height: 1. Для великих декоративних заголовків рівний числовий line-height небажаний — він додає зайвий простір між рядками. Значення 1 означає «line-height дорівнює font-size», що є стандартом для дисплейної типографіки.

<!-- Коректна типографічна ієрархія сторінки -->
<header>
    <!-- Eyebrow: UPPERCASE + widest tracking — маленький але помітний -->
    <p class="text-xs font-bold uppercase tracking-widest text-indigo-500">
        Продукт · Версія 4.0
    </p>
    <!-- H1: великий, щільний, читабельний -->
    <h1 class="text-4xl md:text-5xl font-black tracking-tight text-slate-900 mt-2">
        Головний заголовок сторінки
    </h1>
    <!-- Lead: більший body text для вступного абзацу -->
    <p class="text-lg md:text-xl text-slate-600 leading-relaxed mt-4 max-w-2xl">
        Вступний абзац. Трохи більший за основний текст,
        із relaxed line-height для кращої читабельності.
    </p>
</header>

<main>
    <!-- H2: секція -->
    <h2 class="text-2xl font-bold text-slate-900 mt-12 mb-4">
        Підзаголовок секції
    </h2>
    <!-- Body text -->
    <p class="text-base text-slate-700 leading-relaxed">
        Основний текст сторінки. text-base + leading-relaxed —
        золотий стандарт читабельності для довгого контенту.
    </p>
    <!-- Caption / metadata -->
    <p class="text-xs text-slate-400 font-medium mt-6">
        Оновлено: 3 червня 2025 · 5 хв читання
    </p>
</main>

Перевизначення line-height: точне налаштування

Незважаючи на вбудований line-height, його часто потрібно явно перевизначити. Tailwind надає іменовані та числові варіанти:

<!-- Іменовані значення -->
<p class="text-base leading-none">    line-height: 1 — для заголовків, кнопок</p>
<p class="text-base leading-tight">   line-height: 1.25 — компактний текст</p>
<p class="text-base leading-snug">    line-height: 1.375</p>
<p class="text-base leading-normal">  line-height: 1.5 — базовий стандарт</p>
<p class="text-base leading-relaxed"> line-height: 1.625 — довгий читабельний текст</p>
<p class="text-base leading-loose">   line-height: 2 — дуже розріджений</p>

<!-- Числові (в rem, на основі spacing-шкали) -->
<p class="leading-4">  /* 1rem = 16px */</p>
<p class="leading-5">  /* 1.25rem = 20px */</p>
<p class="leading-6">  /* 1.5rem = 24px */</p>
<p class="leading-7">  /* 1.75rem = 28px */</p>
<p class="leading-8">  /* 2rem = 32px */</p>
<p class="leading-9">  /* 2.25rem = 36px */</p>
<p class="leading-10"> /* 2.5rem = 40px */</p>
Для основного текстового контенту (статті, документація, описи) використовуйте text-base leading-relaxed або text-lg leading-relaxed. Це золотий стандарт читабельності. leading-relaxed (1.625) дає оптимальний повітряний простір між рядками при читанні довгих блоків тексту.

Font Weight: від thin до black

Жирність шрифту є одним із головних інструментів типографічної ієрархії. Tailwind надає дев'ять ступенів жирності, що відповідають стандартній CSS-шкалі ваг:

<p class="font-thin">       100 — Ultra Thin: декоративні великі заголовки</p>
<p class="font-extralight"> 200 — Extra Light: елегантна легкість</p>
<p class="font-light">      300 — Light: довгі тексти з великим шрифтом</p>
<p class="font-normal">     400 — Normal (Regular): стандартний body text</p>
<p class="font-medium">     500 — Medium: secondary UI, підписи до label</p>
<p class="font-semibold">   600 — Semi Bold: label, badge, caption заголовок</p>
<p class="font-bold">       700 — Bold: стандартний заголовок</p>
<p class="font-extrabold">  800 — Extra Bold: акцентні заголовки</p>
<p class="font-black">      900 — Black: hero title, display typography</p>
Не всі шрифти мають усі дев'ять ступенів. Системні шрифти (system-ui, Georgia) зазвичай підтримують 400 та 700. При підключенні Google Fonts явно вказуйте потрібні ваги у параметрах запиту, щоб не завантажувати весь шрифтовий файл: family=Inter:wght@400;500;600;700;800;900.

Letter Spacing та Text Transform

Letter spacing та трансформація тексту — два інструменти, що разом утворюють характерний дизайнерський патерн. tracking-widest uppercase із малим розміром і font-semibold — це класичний label-стиль, що зустрічається у більшості premium продуктів:

<!-- Tracking (letter-spacing) -->
<h1 class="tracking-tighter">  -0.05em — дуже компактний, для великих display</h1>
<h1 class="tracking-tight">    -0.025em — щільний заголовок (часто для text-4xl+)</h1>
<p  class="tracking-normal">   0 — стандарт (default)</p>
<p  class="tracking-wide">     0.025em — легко розширений</p>
<span class="tracking-wider">  0.05em</span>
<span class="text-xs uppercase tracking-widest font-semibold text-slate-400">
    0.1em — LABEL СТИЛЬ (категорія, метадані, eyebrow text)
</span>

<!-- Text Transform -->
<p class="uppercase">   ВЕЛИКІ ЛІТЕРИ — для labels та акцентів</p>
<p class="lowercase">   малі літери — для спеціальних ефектів</p>
<p class="capitalize">  Перша Велика В Кожному Слові</p>
<p class="normal-case"> Скидання трансформації</p>

Text Decoration: підкреслення та strike-through

<!-- Базові варіанти підкреслення -->
<a class="underline">Стандартне підкреслення</a>
<a class="underline underline-offset-2">Зміщення 2px від базової лінії</a>
<a class="underline underline-offset-4">Зміщення 4px — популярний сучасний стиль</a>

<!-- Колір та товщина -->
<a class="underline decoration-indigo-500 underline-offset-4">Кольорове підкреслення</a>
<a class="underline decoration-2 underline-offset-4">Товщина 2px</a>

<!-- Стиль лінії -->
<a class="underline decoration-dotted underline-offset-4">Крапкове</a>
<a class="underline decoration-dashed underline-offset-4">Пунктирне</a>
<a class="underline decoration-wavy underline-offset-4 decoration-red-500">Хвилясте (помилка)</a>

<!-- Інші декорації -->
<p class="line-through text-slate-400">Викреслений текст (ціна зі знижкою)</p>
<p class="no-underline">Скасувати підкреслення</p>

<!-- Font Style -->
<p class="italic">Курсив — для цитат, визначень, іноземних слів</p>
<p class="not-italic">Скасувати курсив</p>
🔒localhost:3000

🧪 Практика: типографічна шкала

Реалізуйте сторінку з повною демонстрацією типографічної ієрархії: від text-9xl до text-xs. Для кожного рівня покажіть: розмір класу, реальне значення у пікселях, рекомендоване призначення. Додайте кожному відповідний font-weight і tracking. Мета — мати живу «шпаргалку» за типографікою.


text-balance та text-pretty: контроль переносів рядків

Проблема «сирітського рядка» та нерівних переносів

Одна з найпоширеніших типографічних проблем у вебі — нерівний розподіл слів між рядками заголовку або «orphan» (одиноке слово на останньому рядку параграфу). До недавнього часу вирішення цих проблем вимагало або JavaScript (бібліотека Balancer.js), або ручного підбору max-width. Tailwind v4 вирішує це нативно через два CSS-значення text-wrap.

text-balance застосовує алгоритм рівномірного розподілу слів між рядками. Браузер намагається зробити всі рядки однакової ширини. Це критично важливо для заголовків: коли одна велика назва розбивається на рядки, природніше, якщо вони мають приблизно однакову довжину, а не перший — довгий, другий — із одним словом.

text-pretty спрямований на запобігання «orphan»: одинокого слова на останньому рядку параграфу. Браузер перебирає варіанти переносу, щоб уникнути такої ситуації.

<!-- Без text-balance: нерівні рядки заголовку -->
<h2 class="text-2xl font-bold max-w-xs text-slate-900">
    Довгий заголовок, що нерівномірно розбивається
    між рядками і виглядає погано
</h2>
<!-- Результат: перший рядок повний, другий — 2 слова -->

<!-- З text-balance: рівномірні рядки -->
<h2 class="text-balance text-2xl font-bold max-w-xs text-slate-900">
    Довгий заголовок, що нерівномірно розбивається
    між рядками і виглядає погано
</h2>
<!-- Результат: обидва рядки приблизно однакові -->

<!-- text-pretty: без orphan у параграфах -->
<p class="text-pretty text-slate-600 leading-relaxed max-w-md">
    Це довгий параграф, який без text-pretty міг би закінчуватися
    одним-єдиним словом на останньому рядку, що виглядає некрасиво
    і порушує читабельність тексту.
</p>
text-balance має невеликий вплив на продуктивність при великій кількості елементів, бо алгоритм є обчислювально дорогим. Рекомендується застосовувати лише до заголовків (h1, h2, h3), а не до довгого body text. Для параграфів — text-pretty.

Truncate та Line Clamp: обрізання тексту

Обрізання тексту — неодмінна вимога при роботі з динамічним контентом. Довжина назви продукту, опису або заголовку новини непередбачувана. Tailwind надає два механізми:

<!-- Truncate: один рядок із "..." -->
<h3 class="truncate text-slate-900 font-semibold">
    Дуже довга назва товару, яка не має влазити в картку
</h3>
<!-- Вимагає: parent з фіксованою або обмеженою шириною -->

<!-- Line Clamp: обрізання після N рядків -->
<p class="line-clamp-1 text-slate-600">Один рядок максимум</p>
<p class="line-clamp-2 text-slate-600">
    Два рядки максимум. Весь контент після другого рядка обрізається
    і замінюється трьома крапками незалежно від кількості слів.
</p>
<p class="line-clamp-3 text-slate-600">
    Три рядки максимум. Особливо корисно для карток із описом товару
    або анотацією статті, де дизайн передбачає фіксовану висоту картки.
</p>
<p class="line-clamp-none">Скасувати line-clamp (напр. при розгортанні)</p>

line-clamp-{n} реалізований через комбінацію -webkit-line-clamp, display: -webkit-box та overflow: hidden. Незважаючи на webkit-префікс, він підтримується всіма сучасними браузерами.

🔒localhost:3000

🧪 Практика: картки з динамічним текстом

Реалізуйте 4 картки статей у сітці 2×2. Заголовок кожної — line-clamp-2, опис — line-clamp-3. Навмисно задайте різну довжину тексту (від 5 слів до 50 слів). Переконайтеся, що всі картки мають однакову висоту через h-full і flexbox. Заголовок картки — text-balance. Категорія — text-xs uppercase tracking-widest font-bold.


Font Family: підключення кастомних шрифтів

Системні шрифти: font-sans, font-serif, font-mono

Tailwind надає три базові сімейства шрифтів, що використовують системні стеки:

<!-- system-ui, -apple-system, BlinkMacSystemFont, Segoe UI... -->
<body class="font-sans">Основний шрифт додатку (sans-serif)</body>

<!-- Georgia, Cambria, Times New Roman... -->
<blockquote class="font-serif">Цитата у серифному шрифті</blockquote>

<!-- ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas... -->
<code class="font-mono bg-slate-100 px-1 rounded">const x = 1</code>

Підключення Google Fonts

У Tailwind v4 кастомні шрифти підключаються через @theme:

Метод 1: <link> у HTML + @theme у CSS (рекомендований)

<!-- index.html: preconnect для швидшого завантаження -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
    href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&display=swap"
    rel="stylesheet"
>
/* main.css */
@import 'tailwindcss';

@theme {
    --font-sans: 'Inter', system-ui, sans-serif;
}

Метод 2: @import у CSS

/* УВАГА: @import url() має бути ПЕРШИМ у файлі — до @import 'tailwindcss' */
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700;900&family=Playfair+Display:ital,wght@0,700;1,700&display=swap');

@import 'tailwindcss';

@theme {
    --font-sans:    'Inter', system-ui, sans-serif;
    --font-display: 'Playfair Display', Georgia, serif;
}

Метод 3: Локальні шрифти через @font-face

@import 'tailwindcss';

/* Оголошення локального шрифту (variable font) */
@font-face {
    font-family: 'BrandFont';
    src: url('/fonts/brand-variable.woff2') format('woff2-variations');
    font-weight: 100 900;    /* Весь діапазон ваг для variable font */
    font-style: normal;
    font-display: swap;      /* Показати системний шрифт під час завантаження */
}

@font-face {
    font-family: 'BrandFont';
    src: url('/fonts/brand-variable-italic.woff2') format('woff2-variations');
    font-weight: 100 900;
    font-style: italic;
    font-display: swap;
}

@theme {
    --font-sans:  'BrandFont', system-ui, sans-serif;
    --font-brand: 'BrandFont', sans-serif;
}
МетодКоли використовуватиПеревагиНедоліки
<link> у HTMLNext.js, Nuxt, статичні сайтиНайшвидше завантаження (preconnect, preload)Потрібна зміна HTML-шаблону
@import у CSSПрості проекти, швидкий стартВсе в CSSМоже блокувати рендер якщо першим
@font-faceКорпоративні та брендові шрифтиПовний контроль, офлайн-підтримкаПотрібно хостити файли

Після реєстрації у @theme шрифт використовується через стандартні класи font-{name}:

<h1 class="font-display font-black tracking-tight">
    Заголовок на display-шрифті (Playfair Display)
</h1>
<p class="font-sans">
    Основний текст на Inter
</p>
<code class="font-mono text-sm">
    Код на mono шрифті
</code>
🔒localhost:3000

🧪 Практика: підключення Google Fonts

Підключіть два шрифти: Inter (sans, ваги 400;600;700;900) та Playfair Display (serif, ваги 700 normal і 700 italic). Визначте --font-sans: Inter і --font-display: Playfair Display у @theme. Реалізуйте hero-секцію: заголовок на font-display font-bold italic, підзаголовок та тіло — на font-sans. Перевірте у DevTools вкладку Network, що шрифти справді завантажились.


@tailwindcss/typography: плагін prose

Проблема стилізації довільного HTML-контенту

Tailwind за замовчуванням скидає всі браузерні стилі через Preflight (@layer base). Це зручно при створенні власного UI, але стає проблемою, коли потрібно відобразити довільний HTML-контент — наприклад, результат рендерингу Markdown або відповідь з CMS. Елементи <h1>, <p>, <ul>, <blockquote> виглядатимуть однаково без стилів.

Рішення — плагін @tailwindcss/typography з класом prose, що надає повний набір типографічних стилів для семантичного HTML-контенту.

Встановлення

npm install @tailwindcss/typography
/* main.css */
@import 'tailwindcss';
@import '@tailwindcss/typography';

Базове використання

<!-- Один клас prose — весь контент всередині стилізується автоматично -->
<article class="prose">
    <h1>Заголовок статті</h1>
    <p>Перший параграф із <strong>жирним</strong> текстом і <a href="#">посиланням</a>.</p>
    <h2>Підзаголовок секції</h2>
    <ul>
        <li>Пункт зі стилізованим маркером</li>
        <li>Другий пункт</li>
    </ul>
    <ol>
        <li>Нумерований список</li>
        <li>Автоматична нумерація</li>
    </ol>
    <pre><code>const x = 1; // Стилізований code-block</code></pre>
    <blockquote>
        Цитата з автоматичним лівим бордером і курсивом.
    </blockquote>
    <hr />
    <table>
        <thead><tr><th>Колонка 1</th><th>Колонка 2</th></tr></thead>
        <tbody><tr><td>Дані 1</td><td>Дані 2</td></tr></tbody>
    </table>
</article>

prose стилізує автоматично: h1–h6, p, a, ul/ol/li, blockquote, code, pre, hr, table, img, figure, figcaption, strong, em.

Розміри prose

<article class="prose prose-sm">   <!-- Компактний: text-sm як основа --></article>
<article class="prose">            <!-- Стандартний: text-base --></article>
<article class="prose prose-lg">   <!-- Великий: text-lg --></article>
<article class="prose prose-xl">   <!-- Дуже великий: text-xl --></article>
<article class="prose prose-2xl">  <!-- Максимальний: text-2xl --></article>

Dark Mode та кастомізація кольору посилань

<!-- prose-invert: автоматична адаптація до темної теми -->
<article class="prose dark:prose-invert">
    <!-- Колір тексту, посилань, заголовків адаптується автоматично -->
</article>

<!-- prose-{color}: колір акцентних елементів (посилання, маркери) -->
<article class="prose prose-indigo">      <!-- Індиго посилання --></article>
<article class="prose prose-violet">      <!-- Фіолетові посилання --></article>
<article class="prose prose-slate">       <!-- Нейтральні --></article>

<!-- Повна комбінація для реального проєкту -->
<article class="prose prose-lg prose-indigo dark:prose-invert max-w-2xl mx-auto">
    <!-- Великий, індиго акценти, темний режим, обмежена ширина -->
</article>

Кастомізація prose через CSS

Для глибшої кастомізації prose-стилів — CSS-змінні або @layer:

@layer base {
    .prose {
        /* Перевизначення кольору заголовків */
        --tw-prose-headings: oklch(0.2 0.05 264);
        /* Перевизначення кольору посилань */
        --tw-prose-links: oklch(0.58 0.22 277);
        /* Перевизначення кольору code */
        --tw-prose-code: oklch(0.55 0.2 330);
    }
}
🔒localhost:3000

🧪 Практика: повна сторінка статті

Реалізуйте сторінку блог-статті зі структурою: (1) навбар із назвою сайту, (2) hero-секція: eyebrow, h1 із text-balance, lead-paragraph, метадані (автор, дата, час читання), (3) <article class="prose prose-lg prose-indigo dark:prose-invert"> із повним markdown-контентом (h2, h3, p, ul, ol, blockquote, code, pre), (4) footer з навігацією «попередня/наступна стаття». Додайте dark:prose-invert і кнопку перемикання теми.


Практичні патерни: типографіка в реальному UI

Label-стиль: UPPERCASE + tracking-widest

Найпоширеніший типографічний патерн у premium-дизайні — мітки категорій, розділів, підписів. Формула: text-xs font-bold uppercase tracking-widest + колір:

<!-- Мітка категорії над заголовком (eyebrow text) -->
<p class="text-xs font-bold uppercase tracking-widest text-indigo-500">
    Технології
</p>

<!-- Підпис до секції -->
<span class="text-xs font-semibold uppercase tracking-widest text-slate-400">
    Останні новини
</span>

<!-- Badge із фоном -->
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full
             text-xs font-bold uppercase tracking-wider
             bg-green-100 text-green-800">
    Активний
</span>

<!-- Metadata рядок -->
<div class="flex items-center gap-2 text-xs text-slate-400 font-medium">
    <span>3 червня 2025</span>
    <span>·</span>
    <span>5 хв читання</span>
    <span>·</span>
    <time>Оновлено сьогодні</time>
</div>

Hero типографіка: масштаб та баланс

<section class="text-center px-4 py-24">
    <!-- Eyebrow: маленький, але помітний -->
    <p class="text-sm font-bold uppercase tracking-widest text-indigo-500 mb-4">
        Нові можливості v4.0
    </p>

    <!-- H1: великий, щільний, збалансований -->
    <h1 class="text-5xl md:text-6xl lg:text-7xl font-black tracking-tight
               text-slate-900 text-balance mx-auto max-w-4xl leading-[0.95]">
        Tailwind CSS v4 —<br class="hidden md:block" />
        <span class="text-transparent bg-clip-text bg-gradient-to-r from-indigo-500 to-violet-500">
            майбутнє вже тут
        </span>
    </h1>

    <!-- Lead paragraph: більший, читабельний, обмежена ширина -->
    <p class="text-lg md:text-xl text-slate-600 leading-relaxed text-pretty
              max-w-2xl mx-auto mt-6">
        CSS-first конфігурація, OKLCH кольори та Lightning CSS engine.
        Менше конфігурації, більше можливостей — для команд будь-якого розміру.
    </p>

    <!-- CTA кнопки -->
    <div class="flex flex-col sm:flex-row gap-4 justify-center mt-10">
        <a href="#" class="px-8 py-4 bg-indigo-600 hover:bg-indigo-700
                           text-white font-semibold rounded-xl text-base
                           transition-colors shadow-lg shadow-indigo-500/25">
            Почати безкоштовно
        </a>
        <a href="#" class="px-8 py-4 border-2 border-slate-200 hover:border-slate-300
                           text-slate-700 font-semibold rounded-xl text-base
                           transition-colors">
            Документація →
        </a>
    </div>
</section>
🔒localhost:3000

Завдання для самоперевірки


Попередня стаття: Варіанти: hover, focus та нові v4Наступна стаття: Компоненти: @apply, @utility та патерни

Copyright © 2026