Tarkibga o'tish

20 β€” Direktiva va funksiyalar

⬅️ Oldingi: 19 β€” Custom utility va variant yaratish Β· 🏠 README Β· Keyingi: 21 β€” Plaginlar ekotizimi ➑️

Bu bobda: Tailwind v4 ning butun CSS asboblar to'plamini bir joyga yig'amiz. Avvalgi boblarda @import, @theme, @utility, @custom-variant bilan tanishdingiz β€” endi qolgan direktivalarni (@apply, @reference, @layer base/components, @source, @plugin, @config) va funksiyalarni (--spacing(), --alpha(), eski theme()) bir sayohat sifatida ko'rib chiqamiz. Bu bobning yuragi β€” @reference (Vue/Svelte <style> blokida @apply jim ishlamasligining sababi va yechimi) va @apply ni qachon ishlatish to'g'ri, qachon esa tuzoq ekani. Oxirida hammasini bitta kanonik app.css faylda birlashtiramiz.


20.1 Avval nega? β€” v4 da hammasi CSS'da

Bir lahza orqaga qayting. v3 da Tailwind'ni sozlash uchun ikkita "olam" bor edi: HTML/CSS olami va alohida tailwind.config.js (JavaScript) olami. Tokenlar JS'da, utility'lar CSS'da, ikkalasi orasida ko'rinmas ko'prik turardi.

v4 bu devorni buzdi. Endi tokenlar (@theme), yangi utility'lar (@utility), variantlar (@custom-variant), global stillar (@layer), qayta-ishlatish (@apply) β€” hammasi bitta CSS faylda yashaydi. JavaScript config kerak emas.

Demak, bu direktivalar β€” sizning asboblar qutingiz. Har biri aniq bir vazifa uchun: biri Tailwind'ni ulaydi, biri token e'lon qiladi, biri utility yaratadi, biri klasslarni qoidaga soladi. Bu bobni shu asboblarni maqsadi bo'yicha tartiblab ko'rib chiqamiz β€” qaysi biri qachon ishlatilishini bilib olasiz.

Tailwind v4 direktivalarining maqsadi bo'yicha xaritasi: SETUP (@import), TEMA (@theme), KENGAYTIRISH (@utility, @custom-variant, @layer), QAYTA-ISHLATISH (@apply, @reference), KONTENT (@source), ESKI (@plugin, @config) va funksiyalar

πŸ“Œ Atamalar. Direktiva β€” CSS'dagi @ bilan boshlanadigan "at-rule" (masalan @import, @apply). U Tailwind'ga nima qilishni aytadi. Funksiya β€” qavs ichida qiymat olib, qiymat qaytaradigan ifoda (--spacing(4), --alpha(...)). Direktiva β€” buyruq, funksiya β€” hisoblagich.


20.2 @import "tailwindcss" β€” hamma narsaning boshlanishi

Har bir Tailwind v4 loyihasi shu bitta qatordan boshlanadi:

@import "tailwindcss";

Bu bitta import ortida aslida uchta qism keladi:

Qism Nima qiladi
theme standart dizayn tokenlari (ranglar, spacing, shrift, breakpoint...) β€” @theme ning poydevori
preflight brauzerlararo "reset" β€” margin, border larni nolga keltiradi, izchil asos beradi
utilities siz ishlatadigan barcha utility klasslar generatsiya qilinadigan qatlam

Ba'zan bularning faqat bir qismini xohlaysiz β€” masalan, preflight saytdagi mavjud stillarni buzayotgani uchun uni o'chirib qo'ymoqchisiz. v4 buni qismlab import qilishga ruxsat beradi:

/* Preflight'siz: faqat tema + utility'lar */
@import "tailwindcss/theme";
@import "tailwindcss/utilities";
/* preflight'ni ataylab qoldirib ketdik */

Tailwind native CSS cascade layer'laridan foydalanadi. To'liq import aslida shu tartibni o'rnatadi:

@layer theme, base, components, utilities;

Bu tartib muhim: utilities eng oxirida turgani uchun utility klasslar base (preflight) va components ustidan g'olib chiqadi. Aynan shuning uchun HTML'da p-0 yozsangiz, u komponent stilini bemalol bekor qiladi β€” qatlam tartibi shuni kafolatlaydi.

πŸ’‘ Qatlamlar haqida o'rnatish bobida ham gaplashganmiz (02-bob). Bu yerda muhim xulosa: import tartibni o'rnatadi, shuning uchun @import "tailwindcss"; odatda faylning eng tepasida turadi.


20.3 @apply β€” utility'larni CSS qoidasiga solish

@apply β€” mavjud utility klasslarni o'z CSS qoidangiz ichiga "yopishtirish" imkonini beradi:

.btn {
  @apply rounded-lg bg-indigo-600 px-4 py-2 text-white hover:bg-indigo-700;
}

Endi HTML'da uzun klass qatori o'rniga shunchaki <button class="btn"> yozasiz. Vasvasa katta: "har bir tugmaga 6 ta klass yozish o'rniga, bitta .btn yasayman!"

To'xtang. @apply β€” Tailwind'dagi eng ko'p suiiste'mol qilinadigan direktiva. U ba'zan to'g'ri, ko'pincha esa tuzoq.

@apply qachon haqiqatan foydali

  • Chinakam global primitivlar β€” butun sayt bo'ylab aynan bir xil ko'rinadigan, juda kichik takrorlanuvchi naqsh (masalan, bir xil fokus halqasi).
  • O'zgartira olmaydigan uchinchi-tomon HTML β€” masalan, markdown'dan generatsiya qilingan yoki CMS chiqargan HTML'ga klass qo'sha olmaysiz; o'sha tegga CSS orqali stil bermoqchisiz.
  • Markup'ni boshqarmaydigan joylar β€” masalan, prose ichidagi <a> teglariga umumiy stil.

@apply qachon tuzoq

  • HTML'dagi har bir komponent uchun .card, .btn, .badge yasab, utility'larni shularga ko'chirib tashlash. Bu β€” Tailwind'ni qaytadan oddiy CSS'ga aylantirish. Utility-first'ning butun foydasi (HTML'ga qarab darrov nima bo'layotganini ko'rish, nom o'ylab topmaslik) yo'qoladi.

Mashhur maslahat sodda: takrorlanishni @apply bilan emas, komponent (React/Vue/Svelte komponenti yoki shablon partial'i) bilan boshqaring. Komponent ham markup'ni, ham mantiqni bir joyga yig'adi; @apply esa faqat stilni ajratib, qolganini sochilgan qoldiradi.

<!-- βœ… Tavsiya: komponent β€” markup + stil bir joyda, qayta ishlatiladi -->
<Button variant="primary">Saqlash</Button>
/* ⚠️ Ehtiyot bo'ling: har bir element uchun @apply komponenti yasash */
.btn  { @apply rounded-lg bg-indigo-600 px-4 py-2 text-white; }
.card { @apply rounded-xl bg-white p-6 shadow; }
.badge{ @apply rounded-full bg-slate-100 px-3 py-1 text-sm; }
/* ...bu yo'ldan ketsangiz, oxir-oqibat oddiy CSS faylga qaytasiz */

πŸ’¬ Bu bahsni to'liq 22-bobda ochamiz β€” u yerda "komponent vs @apply" ni jiddiy taqqoslab, clsx + tailwind-merge va cva kabi zamonaviy yondashuvlarni ko'rasiz. Hozircha shuni eslab qoling: @apply β€” kuchli, lekin uni kam ishlating.

πŸ“ @apply ichida nimani ishlatish mumkin? Faqat mavjud utility klasslar (standart yoki siz @utility bilan yaratganlar) va variantlar (hover:, md:). Oddiy CSS xossalarini (@apply background: red;) yoza olmaysiz β€” buning uchun shunchaki oddiy CSS qatorini yozing.


20.4 @reference β€” v4 ning eng ko'p o'tkazib yuboriladigan qadami

Mana bu bo'limni diqqat bilan o'qing β€” bu har bir v4 boshlovchisi duch keladigan tuzoq.

Vue, Svelte yoki CSS modullarida stilni alohida <style> blokida yozasiz. Tabiiy ravishda @apply ishlatmoqchi bo'lasiz:

<!-- Card.vue -->
<template>
  <div class="card">...</div>
</template>

<style>
.card {
  @apply rounded-xl bg-primary p-6 text-white;
}
</style>

Loyihani ishga tushirasiz va... hech narsa bo'lmaydi. Stil qo'llanmaydi. Xatolik ham chiqmaydi. Karta bo'yalmagan holda qoladi. "Nega ishlamayapti?!" β€” bu v4 dagi eng keng tarqalgan chalkashlik.

Nega bunday bo'ladi?

Sabab: har bir <style> blok / CSS modul / alohida fayl mustaqil kompilyatsiya qilinadi. Vue'dagi <style> bloki sizning asosiy app.css faylingizdan xabarsiz β€” u --color-primary tokeni borligini, rounded-xl qanday qiymat ekanini bilmaydi. Tailwind o'sha blokni alohida ko'radi, tema kontekstisiz, shuning uchun @apply qaysi klasslar haqida gapirayotganingizni tushunmaydi va jimgina o'tkazib yuboradi.

Yechim: @reference

Blokning tepasiga @reference qo'shasiz β€” bu Tailwind'ga "mening tema kontekstim ana o'sha faylda" deb aytadi:

<style>
@reference "../app.css";

.card {
  @apply rounded-xl bg-primary p-6 text-white;  /* endi ishlaydi βœ“ */
}
</style>

Vue SFC style blokida @apply jim ishlamasligi: alohida kompilyatsiya tufayli tema noma'lum; tepaga @reference "../app.css" qo'shilgach, blok temani biladi va @apply ishlaydi β€” qizil X va yashil belgi bilan oldin/keyin

Agar maxsus tema sozlamalaringiz bo'lmasa (yoki tokenlarga murojaat qilmaydigan oddiy holat bo'lsa), to'g'ridan-to'g'ri Tailwind'ni ham ko'rsatishingiz mumkin:

@reference "tailwindcss";

Eng muhim nozik nuqta

@reference temani import qiladi, lekin CSS chiqishini TAKRORLAMAYDI. Ya'ni u faqat Tailwind'ga "qanday tokenlar va klasslar bor" deb kontekst beradi β€” :root o'zgaruvchilarini yoki utility'larni qaytadan o'sha faylga nusxalamaydi. Agar @reference o'rniga yana bir marta @import "tailwindcss"; yozsangiz, butun Tailwind chiqishini takrorlab, build hajmini bir necha barobar shishirib yuborasiz. @reference β€” aynan shu takrorlanishning oldini olish uchun bor.

⚠️ Qachon @reference kerak? @apply yoki theme() ni asosiy CSS faylingizdan tashqarida β€” Vue/Svelte <style>, CSS modul (.module.css), yoki alohida kompilyatsiya qilinadigan har qanday faylda β€” ishlatsangiz. Asosiy app.css ichida (@import "tailwindcss"; bor joyda) @reference shart emas, chunki kontekst allaqachon mavjud.


20.5 @layer base va @layer components

Ba'zan utility'lar yetmaydi β€” saytga global asos stillari kerak: har bir <h1> ning standart o'lchami, <body> ning fon rangi, barcha <a> linklarining rangi. Bularni qayerga yozish kerak? @layer ga.

Tailwind ikkita asosiy maxsus qatlamni taklif qiladi:

@layer base β€” element darajasidagi standart stillar (selektor sifatida teg nomi). Bular utility'lardan pastroq turadi, shuning uchun HTML'da utility yozib ularni bemalol bekor qila olasiz.

@layer base {
  body {
    @apply bg-surface text-ink;     /* sayt fonining standarti */
  }
  h1 {
    @apply text-2xl font-bold;      /* sarlavhalarning standart o'lchami */
  }
  a {
    @apply text-primary underline;
  }
}

@layer components β€” qayta ishlatiladigan komponent klasslari (.btn, .card). Bular ham utilities qatlamidan past turadi:

@layer components {
  .card {
    @apply rounded-xl bg-white p-6 shadow;
  }
}

Nega aynan @layer?

Sababi β€” kaskad tartibi. @layer base ichidagi h1 { text-2xl } standart o'lcham beradi, lekin biror sarlavhaga <h1 class="text-4xl"> yozsangiz, utilities qatlami base'dan yuqori bo'lgani uchun text-4xl g'olib chiqadi. Agar bu stillarni qatlamsiz, oddiy CSS sifatida yozsangiz, specificity janglariga tushib qolardingiz. @layer shu janglarni butunlay yo'qotadi.

<h1>Standart sarlavha</h1>                 <!-- base: text-2xl -->
<h1 class="text-4xl">Kattaroq sarlavha</h1> <!-- utility g'olib: text-4xl βœ“ -->

πŸ’‘ Qoida. Teg darajasidagi standartlar β†’ @layer base. Qayta ishlatiladigan klass naqshlar β†’ @layer components. Bir martalik, o'ziga xos stillar β†’ to'g'ridan-to'g'ri HTML'da utility. Eng oxirgisi β€” eng ko'p ishlatadiganingiz.


20.6 @source β€” Tailwind klasslarni qayerdan qidiradi

Tailwind ishlash uchun qaysi klasslar ishlatilganini bilishi kerak β€” keraksizlarini generatsiya qilmaslik uchun. U buni loyihangizdagi fayllarni skanerlash orqali aniqlaydi. Odatda bu avtomatik, lekin ba'zan qo'lga olish kerak.

Qo'shimcha manba ro'yxatga olish β€” masalan, node_modules ichidagi UI kutubxonasi Tailwind klasslarini ishlatadi, lekin standart skanerlash uni o'tkazib yuboradi:

@source "../node_modules/sezgir-ui";

Manbani chiqarib tashlash β€” katta avtomatik-generatsiya papkasini skanerlashni xohlamasangiz:

@source not "../public/legacy";

Dinamik klass nomi muammosi (va @source inline)

Mana klassik tuzoq. Tailwind manba faylni matn sifatida o'qiydi β€” u JavaScript'ni bajarmaydi. Demak, klass nomini ish vaqtida birlashtirsangiz, skaner uni topa olmaydi:

// ❌ Tailwind buni KO'RMAYDI β€” "bg-red-500" hech qayerda yaxlit yozilmagan
function Badge({ color }) {
  return <span className={`bg-${color}-500`}>...</span>;
}

Skaner faqat bg- qismini ko'radi, bg-red-500 ni emas β€” chunki red o'zgaruvchidan keladi. Natijada o'sha klass generatsiya qilinmaydi va badge bo'yalmaydi.

To'g'ri yechim β€” klassning to'liq nomini statik yozish (masalan, color ga qarab tayyor map'dan to'liq klass tanlash). Ammo iloji bo'lmasa, @source inline(...) bilan o'sha klasslarni majburan generatsiya qildirish (safelist) mumkin:

@source inline("bg-red-500 bg-green-500 bg-blue-500");
/* Brace kengaytirishi bilan ko'p variant: */
@source inline("{bg,text,border}-red-500");

πŸ”­ To'liq 24-bobda. Content scanning, build hajmini optimallashtirish va @source ning barcha shakllarini production bobida batafsil ko'ramiz. Hozircha eng muhim saboq: dinamik klass nomlaridan qoching; iloji bo'lmasa @source inline bilan safelist qiling.


20.7 @plugin va @config β€” eski dunyo bilan ko'prik

Ikkita direktiva v3 ning JavaScript dunyosiga ko'prik tashlaydi β€” qisqacha eslatib o'tamiz:

@plugin β€” eski JS plaginini yuklaydi (masalan, rasmiy @tailwindcss/forms yoki @tailwindcss/typography kabilar):

@plugin "@tailwindcss/typography";

@config β€” eski v3 tailwind.config.js faylini ulaydi (asosan migratsiya paytida, eski sozlamalarni darrov CSS'ga ko'chira olmasangiz):

@config "../tailwind.config.js";

πŸ”­ @plugin β€” to'liq 21-bobda (plaginlar ekotizimi: typography, forms, daisyUI...). @config β€” to'liq 25-bobda (v3 β†’ v4 migratsiyasi). Hozir faqat ular borligini va nima uchun ekanini bilsangiz kifoya.


20.8 Funksiyalar β€” custom CSS'da qiymat hisoblash

Direktivalar buyruq berardi; funksiyalar esa qiymat qaytaradi. Ularni o'z CSS qoidalaringiz ichida, token tizimidan foydalanib qiymat hisoblash uchun ishlatasiz.

--spacing() β€” spacing shkalasidan qiymat

--spacing(n) β€” --spacing asosining n karralisini qaytaradi (calc(var(--spacing) * n)). Ya'ni p-6 qanday qiymat ishlatsa, --spacing(6) ham aynan o'shani beradi:

.maxsus-blok {
  margin-block: --spacing(6);   /* p-6/m-6 bilan bir xil masofa */
  scroll-padding-top: --spacing(20);
}

Foydasi: o'z CSS'ingizda ham "sehrli son" (1.5rem) yozmaysiz β€” shu bitta spacing tizimiga sodiq qolasiz (04-bob).

--alpha() β€” rangning shaffofligini sozlash

--alpha(rang / foiz) β€” berilgan rangning shaffofligini o'zgartiradi. Bu, ayniqsa, token rangidan yarim-shaffof variant yasashda qulay:

.overlay {
  background: --alpha(var(--color-indigo-500) / 30%);  /* indigo, 30% shaffoflik */
}
.glow {
  box-shadow: 0 0 24px --alpha(var(--color-sky-400) / 45%);
}

πŸ’‘ HTML'da utility orqali shaffoflikni bg-indigo-500/30 deb yozasiz (11-bobdagi opacity modifikatori). --alpha() β€” xuddi shuning custom CSS'dagi ko'rinishi.

theme() β€” eski funksiya (lekin endi kerak emas)

v3 da token qiymatlarini olish uchun theme() funksiyasi ishlatilardi: theme(colors.red.500). v4 da u moslik uchun hali ishlaydi, lekin endi yaxshiroq yo'l bor β€” tokenlar oddiy CSS o'zgaruvchilari bo'lgani uchun ularni to'g'ridan-to'g'ri var() bilan olasiz:

/* ⚠️ Eski (ishlaydi, lekin tavsiya etilmaydi) */
.eski { color: theme(colors.red.500); }

/* βœ… v4 yo'li β€” to'g'ridan-to'g'ri o'zgaruvchi */
.yangi { color: var(--color-red-500); }

πŸ“ Qoida sodda: yangi kodda var(--color-*) ishlating. theme() ni faqat eski kodda uchratsangiz tanib oling β€” uni var() ga ko'chirish mumkin.


20.9 Hammasini birlashtirish β€” kanonik app.css

Endi o'rgangan asboblarni bitta tipik loyiha faylida birlashtiramiz. Mana professional v4 loyihasining app.css faylining "skeleti" β€” tartib ataylab shunday:

/* 1. SETUP β€” Tailwind'ni olib kelish (eng tepada) */
@import "tailwindcss";

/* 2. TOKENLAR β€” dizayn tizimi (18-bob) */
@theme {
  --color-primary:       oklch(0.55 0.20 265);
  --color-primary-hover: oklch(0.48 0.20 265);
  --font-display: "Satoshi", "Segoe UI", sans-serif;
  --radius-card: 1rem;
}

/* 3. VARIANT β€” dark rejimi (16-bob) */
@custom-variant dark (&:where(.dark, .dark *));

/* 4. SEMANTIK / KONTEKSTGA BOG'LIQ TOKENLAR */
:root      { --surface: oklch(0.99 0 0);     --ink: oklch(0.20 0 0); }
.dark      { --surface: oklch(0.21 0.01 260); --ink: oklch(0.95 0 0); }
@theme inline {
  --color-surface: var(--surface);
  --color-ink:     var(--ink);
}

/* 5. BASE β€” global element standartlari */
@layer base {
  body { @apply bg-surface text-ink font-display; }
  h1   { @apply text-3xl font-bold; }
}

/* 6. KENGAYTIRISH β€” yangi utility (19-bob) */
@utility tab-4 {
  tab-size: 4;
}

/* 7. KOMPONENT β€” @apply'ni juda kam, faqat chinakam primitiv uchun */
@layer components {
  .focus-halqa {
    box-shadow: 0 0 0 3px --alpha(var(--color-primary) / 40%);
  }
}

Kanonik app.css anatomiyasi: yuqoridan pastga @import "tailwindcss", @theme, @custom-variant dark, @layer base, @utility va @layer components ichidagi @apply komponenti β€” har bir blok tartib bilan izohlangan

Tartib nega muhim? Tokenlar (@theme) utility'lar generatsiya qilinishidan oldin e'lon qilinishi kerak β€” aks holda Tailwind ulardan klass yasay olmaydi. @layer base esa components'dan oldin turishi mantiqan to'g'ri (asos avval, komponent keyin). Import esa har doim tepada, chunki u qatlam tartibini o'rnatadi.

πŸ’‘ Bu fayl β€” kelajakdagi har bir loyihangiz uchun "shablon". Uni yodda saqlang: import β†’ tokenlar β†’ variant β†’ semantik tokenlar β†’ base β†’ utility β†’ komponent.


20.10 Tez-tez uchraydigan xatolar

  • @reference ni unutish (eng katta #1 chalkashlik). Vue/Svelte <style> yoki CSS modulda @apply/theme() jim ishlamaydi. Blok tepasiga @reference "../app.css"; qo'shing.
  • @reference o'rniga @import "tailwindcss" ni takrorlash. Bu butun Tailwind chiqishini nusxalab, build'ni shishiradi. Alohida fayllarda β€” @reference, bir marta @import emas.
  • @apply ni haddan tashqari ishlatish. Har bir komponent uchun .btn/.card/.badge yasash β€” Tailwind'ni qaytadan oddiy CSS'ga aylantirish. Takrorlanishni shablon/komponent bilan boshqaring (22-bob).
  • @theme ga oddiy CSS yozish. @theme faqat token e'lonlari uchun; selektorlar va qoidalar @layer/oddiy CSS'da (18-bob).
  • Dinamik klass nomlari. `bg-${color}-500` skaner tomonidan topilmaydi. To'liq statik klass yozing yoki @source inline(...) bilan safelist qiling (24-bob).
  • Yangi kodda theme() ishlatish. U eski (v3) funksiya β€” moslik uchun ishlaydi, lekin var(--color-*) ni afzal ko'ring.
  • @apply ichiga oddiy CSS xossasi yozish. @apply faqat utility klasslarni qabul qiladi (@apply bg-red-500), @apply background: red; emas.

πŸ”­ Oldinga qarash. Endi v4 ning butun CSS asboblar qutisini bilasiz: ulash (@import), tokenlar (@theme), kengaytirish (@utility/@custom-variant/@layer), qayta-ishlatish (@apply/@reference) va funksiyalar. Keyingi bob shu asboblarning ustiga tayyor ekotizimni qo'shadi β€” rasmiy plaginlar (typography, forms) va @plugin orqali butun komponent kutubxonalarini ulashni o'rganasiz.


Mashqlar

1-mashq. Hamkasbingiz Modal.vue faylida <style> blok ichida shunday yozdi va modal umuman bo'yalmayapti, xatolik ham yo'q. Sababini toping va tuzating.

<style>
.modal {
  @apply rounded-2xl bg-white p-8 shadow-xl;
}
</style>
Yechim

<style> bloki asosiy app.css dan alohida kompilyatsiya qilinadi, shuning uchun u tema kontekstini bilmaydi β€” @apply qaysi klasslar haqida gapirayotganini tushunmaydi va jimgina o'tkazib yuboradi. Yechim β€” blok tepasiga @reference qo'shish:

<style>
@reference "../app.css";

.modal {
  @apply rounded-2xl bg-white p-8 shadow-xl;   /* endi ishlaydi */
}
</style>

(Maxsus tema kerak bo'lmasa, @reference "tailwindcss"; ham bo'ladi.) Eslatma: bu CSS chiqishini takrorlamaydi β€” faqat kontekst beradi.

2-mashq. Saytdagi har bir <h2> standart ravishda text-xl va font-semibold bo'lsin, lekin kerak bo'lganda HTML'da <h2 class="text-3xl"> yozib uni bemalol kattalashtira olaylik. Buni qaysi direktiva bilan, qayerga yozasiz va nega u bekor qilinadigan bo'ladi?

Yechim

@layer base ga yozamiz:

@layer base {
  h2 { @apply text-xl font-semibold; }
}

Bu base qatlamida turadi, utilities qatlami esa undan yuqori. Shuning uchun HTML'da text-3xl yozsangiz, utility g'olib chiqadi:

<h2>Standart sarlavha</h2>             <!-- text-xl -->
<h2 class="text-3xl">Katta sarlavha</h2> <!-- text-3xl g'olib -->

Agar bu stilni qatlamsiz oddiy CSS sifatida yozganingizda, specificity tufayli utility uni bekor qila olmasligi mumkin edi.

3-mashq. React komponentingiz rangni prop'dan oladi va shunday yozadi: className={`text-${tone}-600`}. Production build'da matn rangi qo'llanmayapti. Sababi nima? Ikkita yechim ayting (biri to'g'riroq).

Yechim

Sabab: Tailwind manba fayllarni matn sifatida skanerlaydi, JS'ni bajarmaydi. `text-${tone}-600` da text-...-600 hech qayerda yaxlit yozilmagani uchun skaner text-blue-600 ni topa olmaydi va o'sha klassni generatsiya qilmaydi.

To'g'riroq yechim β€” to'liq klass nomlarini statik yozish, masalan map orqali:

const toneClass = { blue: "text-blue-600", green: "text-green-600" };
<span className={toneClass[tone]} />   // to'liq klasslar manbada ko'rinadi

Muqobil yechim β€” agar dinamiklik shart bo'lsa, @source inline(...) bilan safelist qilish:

@source inline("text-blue-600 text-green-600 text-red-600");

Birinchisi afzal, chunki u keraksiz klasslarni generatsiya qilmaydi va kod tushunarliroq.

4-mashq. Custom CSS qoidasida overlay foni β€” indigo-500 rangining 25% shaffof varianti bo'lsin, va uning padding'i p-8 bilan bir xil masofada bo'lsin. Funksiyalardan foydalanib yozing.

Yechim
.overlay {
  background: --alpha(var(--color-indigo-500) / 25%);
  padding: --spacing(8);   /* p-8 bilan bir xil */
}

--alpha(rang / foiz) rangning shaffofligini sozlaydi; --spacing(8) esa calc(var(--spacing) * 8) ni qaytaradi β€” ya'ni p-8/m-8 bilan aynan bir xil masofa. Ikkalasi ham "sehrli son" yozmasdan, token tizimiga sodiq qoladi.

5-mashq. Bir loyihada saytdagi mavjud (eski) stillar Tailwind'ning preflight reset'i bilan to'qnashayapti. Tema va utility'lar kerak, lekin preflight'ni o'chirmoqchisiz. v4 da buni qanday qilasiz?

Yechim

To'liq @import "tailwindcss"; o'rniga faqat kerakli qismlarni import qilamiz va preflight'ni ataylab qoldirib ketamiz:

@import "tailwindcss/theme";
@import "tailwindcss/utilities";
/* preflight import qilinmadi β€” reset yo'q */

Endi tema (tokenlar) va utility'lar ishlaydi, lekin Tailwind brauzer standart stillarini nolga keltirmaydi, shuning uchun eski stillaringiz buzilmaydi.

6-mashq (debugging). Quyidagi app.css xato beradi β€” bg-primary klassi HTML'da umuman ishlamayapti. Sababini toping va to'g'rilang.

@theme {
  --color-primary: oklch(0.55 0.20 265);
}
@import "tailwindcss";
Yechim

Tartib xato. @theme @import "tailwindcss"; dan oldin turibdi. Tailwind importi tema poydevorini va utility generatsiyasini o'rnatadi, shuning uchun u eng tepada bo'lishi kerak β€” aks holda @theme tokenlari "joyini topmaydi" va ulardan utility yasalmaydi. To'g'risi:

@import "tailwindcss";

@theme {
  --color-primary: oklch(0.55 0.20 265);   /* endi bg-primary ishlaydi */
}

Qoida: @import "tailwindcss"; β€” har doim faylning eng tepasida.


⬅️ Oldingi: 19 β€” Custom utility va variant yaratish Β· 🏠 README Β· Keyingi: 21 β€” Plaginlar ekotizimi ➑️