API
مرجع Tailwind
يقبل كل عنصر فئات Tailwind CSS في الخاصية class (والفئات الشرطية في classList). يحلّلها NSH في Rust بالاستناد إلى السمة الافتراضية في Tailwind 4: لا تمرّر JS سوى السلسلة النصية، وتُحلَّل كل سلسلة مختلفة مرة واحدة وتُخزَّن مؤقتًا، وتُعاد معالجة المتغيّرات مثل dark: أو active: أصليًا عند تغيّر المظهر أو حجم النافذة أو حالة الضغط، دون تشغيل أي JS.
تضبط كل فئة بالضبط ما يولّده Tailwind CSS 4 لها، وبالمعنى نفسه كما في المتصفح. تسرد هذه الصفحة ما هو مدعوم. للمقدمة راجع Tailwind؛ ولمفاتيح الأنماط التي تضبطها الفئات راجع مرجع الأنماط.
لا تقبل مكوّنات Rust سلاسل فئات: فهي تنسّق العناصر بالدوال المضبوطة الأنواع في Styled (nsh_core::prelude)، المسمّاة على غرار هذه الفئات والتي تُحلّ إلى القيم نفسها، بما فيها مقاييس Tailwind الافتراضية (px-4 هو .px_4()، rounded-2xl .rounded_2xl()، shadow-md .shadow_md()، bg-linear-to-br .bg_linear_to_br()). الألوان قيم: ألوان السمة، أو لوحة Tailwind على هيئة nsh_core::element::palette (ZINC.shade(800) هو zinc-800). المتغيّرات دوال تأخذ closure من الأنماط: .active(|s| …)، .hover(…)، .focus(…)، .disabled_style(…)، .dark(…)، .group_active(…)، و.style_when(condition, …) لبقية المتغيّرات. يسمّي مرجع الأنماط دالة كل مفتاح نمط.
use nsh_core::{element::palette::{RED, ZINC}, prelude::*};
view()
.flex_row()
.items_center()
.gap_3()
.rounded_2xl()
.bg(white())
.p_4()
.shadow_md()
.active(|s| s.scale(0.98))
.transition()
.dark(|s| s.bg(ZINC.shade(800)))
.child(
text("Inbox")
.text_base()
.font_weight(FontWeight::SEMIBOLD)
.text_color(ZINC.shade(900))
.dark(|s| s.text_color(white())),
)
.child(
text(move || unread.get().to_string())
.text_color(move || if unread.get() > 0 { RED.shade(500) } else { ZINC.shade(400) }),
)<View class="flex-row items-center gap-3 rounded-2xl bg-white p-4 shadow-md active:scale-[0.98] transition dark:bg-zinc-800">
<Text class="text-base font-semibold text-zinc-900 dark:text-white">Inbox</Text>
<Text classList={{ "text-red-500": unread() > 0, "text-zinc-400": unread() === 0 }}>{unread()}</Text>
</View>#كيفية دمج الفئات
- الأحدث يفوز. بين الفئات ضمن مستوى المتغيّر نفسه، تفوز الفئة الأخيرة في السلسلة:
"p-4 p-2"يساويp-2. يمكن لمكوّن أن يأخذ الخاصيةclassويلحقها بفئاته الخاصة دونtailwind-merge. - تُطبَّق المتغيّرات بعد الفئات العادية، وفق ترتيب المتغيّرات في Tailwind:
group-*:(حسب حالتها، ثم حسب اسم المجموعة)،selection:،placeholder:، الموضع (first:…)،checked:،indeterminate:،selected:،focus-within:،hover:،focus:،focus-visible:،active:،enabled:،disabled:،aria-busy:،aria-checked:،aria-expanded:،aria-pressed:،aria-selected:،data-*:(حسب الاسم)، الحركة، نقاط التوقفmax-*:من الأوسع أولًا، ثم نقاط التوقف تصاعديًا، ثم اتجاه الشاشة، ثم اتجاه الكتابة، ثمdark:، ثم المنصة. يحسم أعلى متغيّر في الفئة الأمر أولًا، ثم الذي يليه، ويأتي متغيّر إضافي لاحقًا (dark:hover:بعدdark:)، كما يرتّبها Tailwind. لذا يكون"active:bg-red-500 bg-blue-500"أحمر أثناء الضغط. - يتفوّق
styleعلى الفئات. يُطبَّقstyleالمضمَّن فوق الفئات المحلولة. مفتاح النمط هو خاصية CSS التي تحمل اسمه، وهي التي تضبطها الفئات، فيستبدل تلك الخاصية دون غيرها:style={{ paddingLeft: 8 }}يتغلّب علىpl-4ويُبقيpr-4. وتتفوّق الفئة ذات الأهمية (!p-4أوp-4!) على النمط المضمَّن أيضًا. - تُورَّث أنماط النص. تنتقل فئات النص على view (
text-white،font-bold،text-center، …) إلى عناصر<Text>و<Input>داخله، كما في CSS. - يتبع display قواعد CSS. يجعل
flexوinline-flexالعنصر صفًا ما لم تنص فئة اتجاه على غير ذلك، أيًّا كان موضعها في السلسلة (flex-col flexعمود). ويكونdisplay: "flex"في النمط صفًا بالطريقة نفسها؛ أما الـ views التي لا تضبط display فتحتفظ بالافتراضي في NSH وهو العمود.
#الوحدات والسمة
الأطوال بالنقاط (1 = نقطة واحدة على iOS، وdp واحد على Android). يساوي 1rem في Tailwind 16 نقطة، فتطابق السمة الويب بالكثافة نفسها: خطوة التباعد الواحدة 4 نقاط (p-4 = 16 نقطة)، وtext-base يساوي 16 نقطة.
#قيم التباعد
الفئات التي تأخذ قيمة تباعد (padding وmargin وgap وinset وwidth وheight، basis، translate، leading) تقبل:
| القيمة | مثال | النتيجة |
|---|---|---|
| الخطوات (يُسمح بأرباع الخطوات) | p-4، gap-1.5، m-0.25 | الخطوة × 4 نقاط |
px | p-px، -mt-px | نقطة واحدة |
0 | m-0 | 0 |
كسر (inset وwidth وheight، basis، translate) | w-1/2، left-1/3 | نسبة مئوية من العنصر الأب |
full (بالمعنى نفسه) | w-full، inset-full | 100% |
auto (margin وinset وwidth وheight وbasis) | mx-auto، w-auto | "auto" |
| مخصّصة | p-[13px]، w-[42%]، mt-[1.5rem] | الطول المعطى |
تقبل margin وinset وtranslate وrotate وskew وscale وz وhue-rotate وtracking وunderline-offset وoutline-offset وخطوط الشبكة وزوايا التدرّج الرمز - في البداية للقيم السالبة: -mt-2، -translate-x-1/2، -rotate-6. ليس في Tailwind صيغة سالبة لغيرها (-p-4، -gap-2، -w-4)، وكذلك NSH.
#الألوان
لوحة Tailwind 4 كاملة مضمّنة: red، orange، amber، yellow، lime، green، emerald، teal، cyan، sky، blue، indigo، violet، purple، fuchsia، pink، rose، slate، gray، zinc، neutral، stone، mauve، olive، mist، taupe، كل منها بدرجات 50، 100–900، 950؛ إضافةً إلى black وwhite وtransparent. تأتي ألوانك الخاصة من nsh.json (راجع تخصيص السمة).
تقبل كل فئة لون:
| الصيغة | مثال |
|---|---|
| لون من السمة | bg-sky-500، text-brand |
| معدّل شفافية (نسبة مئوية) | bg-black/50، ring-black/5 |
| شفافية مخصّصة | text-black/[0.35] |
| لون مخصّص | bg-[#0ea5e9]، border-[rgb(0_0_0_/_0.1)]، text-[oklch(70%_0.2_50)] |
| لون مخصّص مع معدّل | bg-[rgb(0_0_255)]/25 |
ليست currentColor وinherit قيمًا لونية. كما في المتصفح، تُرسم الحدود (border) أو الإطار الخارجي (outline) أو الحلقة (ring) التي لا تحمل فئة لون بلون نص العنصر، سواء كان خاصًّا به أو موروثًا (<View class="text-white"><View class="border ring-2" /></View> يرسم الاثنين باللون الأبيض)، وكذلك الحدّ الذي تضبط الخاصية style عرضه دون لون.
#القيم المخصّصة
تمرّر الأقواس المربعة قيمة لا تحتويها السمة: w-[37px]، grid-cols-[200px_1fr]، bg-[linear-gradient(45deg,red,blue)].
- يمثّل
_مسافة (grid-cols-[1fr_2fr])؛ اكتب\_للحصول على شرطة سفلية حرفية. - الأطوال: رقم مجرد أو
px(نقاط)،pt(4/3 نقطة، كما في CSS)،rem(16 نقطة)، و%حيث تكون النسب المئوية ذات معنى. - الزوايا (
rotate-[...]،hue-rotate-[...]،bg-linear-[...]):deg،rad،grad،turn. - الأزمنة (
duration-[...]،delay-[...]):msأوs؛ والرقم المجرد يعني ميلي ثانية. - تحسم تلميحات النوع القيم الملتبسة:
text-[length:22px]حجم،text-[color:#333]لون؛ وكذلكborder-[length:3px].
خصائص CSS المخصّصة ([mask-type:luminance]) غير مدعومة.
#التخطيط
| الفئة | تضبط |
|---|---|
flex، inline-flex | display: "flex"، وصفًّا ما لم توجد فئة اتجاه |
grid، inline-grid | display: "grid" |
block، flow-root | تخطيط block أو سياق تنسيق block مستقل |
box-border، box-content | تشمل الأبعاد الحدود والحشو، أو المحتوى وحده |
w/h/size-min، w/h/size-max، w/h/size-fit | أحجام Taffy الجوهرية: min-content، max-content، fit-content |
inline، inline-block | display: "block": ما يحسبه المتصفح لهما داخل عنصر أب من نوع flex أو grid |
hidden | display: "none" |
relative، absolute | position |
static | position: "static": داخل التدفق، وتُتجاهل إزاحاته؛ ويستخدم الأحفاد ذوو الموضع المطلق أقرب سلف محدَّد الموضع |
sticky | position: "sticky": داخل التدفق، يلتصق بـtop (left في scroll view أفقي) ضمن scroll view المحيط به ما دام عنصره الأب ظاهرًا |
fixed | position: "fixed": عنصر يُخطَّط ضمن صندوق root view الخاص به (النافذة أو modal الخاصة به) فوق أبناء ذلك الـ root view، ويبقى في مكانه بينما يتمرّر ما حوله |
inset-<n>، inset-x-<n>، inset-y-<n> | top / right / bottom / left |
top-<n>، right-<n>، bottom-<n>، left-<n> | الإزاحة المقابلة |
start-<n>، end-<n> | start / end (يراعي الاتجاه) |
z-<n>، z-auto، z-[<n>] | zIndex (z-auto يساوي 0) |
visible | visibility: "visible" |
invisible، collapse | visibility: "hidden" (يحتفظ بمساحته) |
overflow-hidden، overflow-clip، overflow-x-hidden، overflow-y-hidden | overflow: "hidden" |
overflow-visible | overflow: "visible" |
aspect-square، aspect-video، aspect-<a>/<b>، aspect-[<a>/<b>]، aspect-auto | aspectRatio (1، 16/9، a/b، بلا) |
التمرير عنصر وليس فئة: overflow-auto وoverflow-scroll غير مدعومين؛ استخدم scroll.
#Flexbox وgrid
| الفئة | تضبط |
|---|---|
flex-row، flex-row-reverse، flex-col، flex-col-reverse | flexDirection |
flex-wrap، flex-wrap-reverse، flex-nowrap | flexWrap |
flex-1 | grow 1 وshrink 1 وbasis 0 |
flex-<n> | grow n وshrink 1 وbasis 0 |
flex-auto | grow 1 وshrink 1 وbasis auto |
flex-initial | grow 0 وshrink 1 وbasis auto |
flex-none | grow 0 وshrink 0 وbasis auto |
flex-[<grow>]، flex-[<grow>_<shrink>_<basis>] | الصيغة المختصرة في CSS: flex-[2]، flex-[3_0_50%] |
grow، grow-<n>، grow-[<n>] | flexGrow (بدون قيمة: 1) |
shrink، shrink-<n>، shrink-[<n>] | flexShrink (بدون قيمة: 1) |
basis-<n> | flexBasis (تباعد، كسر، full، auto، مخصّص) |
justify-start، justify-end، justify-center، justify-between، justify-around، justify-evenly، justify-stretch، justify-normal | justifyContent |
items-start، items-end، items-center، items-baseline، items-stretch | alignItems |
self-auto، self-start، self-end، self-center، self-stretch، self-baseline | alignSelf |
content-start، content-end، content-center، content-between، content-around، content-evenly، content-stretch، content-normal | alignContent |
justify-items-start، -end، -center، -stretch، -normal | justifyItems |
justify-self-auto، -start، -end، -center، -stretch | justifySelf |
place-content-center، -start، -end، -between، -stretch | alignContent وjustifyContent |
place-items-center، -start، -end، -stretch | alignItems وjustifyItems |
place-self-auto، -center، -start، -end، -stretch | alignSelf وjustifySelf |
gap-<n>، gap-x-<n>، gap-y-<n> | gap، columnGap، rowGap |
space-x-<n>، space-y-<n> (والسالبة) | هامش على كل ابن عدا الأخير: هامش النهاية (space-x) أو الهامش السفلي (space-y)، تحت هوامش الابن نفسه، كما في Tailwind CSS؛ ويُضاف إلى gap |
space-x-reverse، space-y-reverse | الهامش على جهة البداية / الأعلى بدلًا من ذلك (الأبناء بترتيب معكوس) |
grid-cols-<n> | gridTemplateColumns: "repeat(n, minmax(0, 1fr))" |
grid-cols-[<tracks>]، grid-cols-none | gridTemplateColumns (grid-cols-[200px_1fr]) |
grid-rows-<n>، grid-rows-[<tracks>]، grid-rows-none | gridTemplateRows |
col-span-<n>، col-span-full، col-auto، col-<n>، col-[<value>] | gridColumn |
col-start-<n>، col-end-<n> (و-auto) | gridColumnStart، gridColumnEnd |
row-span-<n>، row-span-full، row-auto، row-<n>، row-[<value>] | gridRow |
row-start-<n>، row-end-<n> (و-auto) | gridRowStart، gridRowEnd |
grid-flow-row، grid-flow-col، grid-flow-dense، grid-flow-row-dense، grid-flow-col-dense | gridAutoFlow |
auto-cols-auto، -min، -max، -fr، auto-cols-[<track>] | gridAutoColumns |
auto-rows-auto، -min، -max، -fr، auto-rows-[<track>] | gridAutoRows |
#التباعد
| الفئة | تضبط |
|---|---|
p-<n>، px-<n>، py-<n> | padding، paddingHorizontal، paddingVertical |
pt-<n>، pr-<n>، pb-<n>، pl-<n> | paddingTop / Right / Bottom / Left |
ps-<n>، pe-<n> | paddingStart، paddingEnd (يراعي الاتجاه) |
m-<n>، mx-<n>، my-<n> | margin، marginHorizontal، marginVertical |
mt-<n>، mr-<n>، mb-<n>، ml-<n> | marginTop / Right / Bottom / Left |
ms-<n>، me-<n> | marginStart، marginEnd (يراعي الاتجاه) |
#الأبعاد
| الفئة | تضبط |
|---|---|
w-<n>، h-<n> | width، height (تباعد، كسر، full، auto، مخصّص) |
size-<n> | width وheight |
min-w-<n>، max-w-<n>، min-h-<n>، max-h-<n> | الحد المقابل |
w-screen، w-dvw، w-svw، w-lvw | عرض النافذة (وعلى min-w- / max-w- أيضًا) |
h-screen، h-dvh، h-svh، h-lvh | ارتفاع النافذة (وعلى min-h- / max-h- أيضًا) |
w-auto، h-auto | auto (يُحدَّد حجمه بالمحتوى) |
max-w-none، max-h-none | بلا حد |
w-<container>، min-w-<container>، max-w-<container> | عرض حاوية (أدناه) |
عروض الحاويات (بالنقاط): 3xs 256، 2xs 288، xs 320، sm 384، md 448، lg 512، xl 576، 2xl 672، 3xl 768، 4xl 896، 5xl 1024، 6xl 1152، 7xl 1280؛ وprose يساوي 65 ضعف عرض 0 في خط العنصر (65ch في CSS)، كما في Tailwind CSS.
#الطباعة
#الخط
| الفئة | تضبط |
|---|---|
font-sans | خط النظام |
font-serif، font-mono | fontFamily: "serif" / "monospace" |
font-thin (100)، font-extralight (200)، font-light (300)، font-normal (400)، font-medium (500)، font-semibold (600)، font-bold (700)، font-extrabold (800)، font-black (900) | fontWeight |
font-[<weight>]، font-[<family>] | وزن رقمي، وإلا فعائلة خطوط: font-[650]، font-[Inter] |
italic، not-italic | fontStyle |
normal-nums، small-caps، oldstyle-nums، lining-nums، tabular-nums، proportional-nums | fontVariant (تُدمج معًا؛ normal-nums يعيد ضبط صيغ الأرقام) |
#الحجم واللون وارتفاع السطر
يضبط text-<size> حجم الخط وارتفاع السطر المطابق في Tailwind، وتستبدله فئة leading-* أيًّا كان موضعها في السلسلة وأيًّا كان متغيّرها (leading-tight md:text-lg يُبقي التباعد الضيق بين الأسطر):
| الفئة | الحجم | ارتفاع السطر |
|---|---|---|
text-xs | 12 | 16 |
text-sm | 14 | 20 |
text-base | 16 | 24 |
text-lg | 18 | 28 |
text-xl | 20 | 28 |
text-2xl | 24 | 32 |
text-3xl | 30 | 36 |
text-4xl | 36 | 40 |
text-5xl | 48 | 1× |
text-6xl | 60 | 1× |
text-7xl | 72 | 1× |
text-8xl | 96 | 1× |
text-9xl | 128 | 1× |
| الفئة | تضبط |
|---|---|
text-<size>/<leading> | الحجم وارتفاع السطر: text-sm/6 (24 نقطة)، text-lg/tight |
text-[<length>] | fontSize: text-[22px]، text-[length:22px] |
text-<color> | color |
leading-none (1)، leading-tight (1.25)، leading-snug (1.375)، leading-normal (1.5)، leading-relaxed (1.625)، leading-loose (2) | lineHeight كمضاعف لحجم الخط |
leading-<n>، leading-[<length>] | lineHeight بالنقاط (leading-6 = 24) |
leading-[<number>] | lineHeight كمضاعف لحجم الخط (leading-[1.5])، يُورَّث بوصفه ذلك المضاعف؛ أما em و% فتحسبان طولًا بحجم خط العنصر قبل التوريث |
tracking-tighter (-0.05em)، tracking-tight (-0.025em)، tracking-normal (0)، tracking-wide (0.025em)، tracking-wider (0.05em)، tracking-widest (0.1em) | letterSpacing نسبةً إلى حجم الخط |
tracking-[<value>] | letterSpacing: tracking-[0.2em]، tracking-[1px] |
#المحاذاة وحالة الأحرف والالتفاف
#الزخرفة والظل
| الصنف | يضبط |
|---|---|
underline, line-through, no-underline | textDecorationLine |
decoration-solid, decoration-double, decoration-dotted, decoration-dashed, decoration-wavy | textDecorationStyle |
decoration-<n>, decoration-[<length>] | textDecorationThickness |
decoration-auto, decoration-from-font | textDecorationThickness: "auto" |
decoration-<color> | textDecorationColor |
underline-offset-<n>, underline-offset-[<length>], underline-offset-auto | textUnderlineOffset |
text-shadow-2xs, -xs, -sm, -md, -lg; /<alpha> | ظل نص من السمة (طبقة واحدة: الأعرض بين طبقات السمة)؛ المُعدِّل هو ألفا الطبقات: text-shadow-md/20 |
text-shadow-<color>, text-shadow-current | لونه، بألفا الحجم |
text-shadow-none | يزيله |
تحتوي ظلال النص في Tailwind على عدة طبقات؛ أما في البيئة الأصلية فيُرسم ظل واحد، هو الطبقة الأعرض.
#حقول الإدخال
| الصنف | يضبط |
|---|---|
placeholder:text-<color> | placeholderColor |
selection:bg-<color> | selectionColor (إبراز التحديد في حقل الإدخال أو في النص القابل للتحديد، وفي ما بداخل العنصر منهما) |
caret-<color> | لون المؤشر |
#الخلفيات
| الصنف | يضبط |
|---|---|
bg-<color> | backgroundColor |
bg-[<gradient>] | backgroundImage: bg-[linear-gradient(45deg,red,blue)], bg-[radial-gradient(...)] |
bg-linear-to-t, -tr, -r, -br, -b, -bl, -l, -tl | تدرج خطي نحو جانب أو زاوية (bg-gradient-to-* هو الاسم في الإصدار v3) |
bg-linear-<angle>, bg-linear-[<angle>] | تدرج خطي بزاوية: bg-linear-45, -bg-linear-12, bg-linear-[0.25turn] |
bg-radial | تدرج شعاعي من المركز |
bg-conic, bg-conic-<angle> | تدرج مخروطي، يبدأ اختياريًا من زاوية |
from-<color>, via-<color>, to-<color> | نقاط توقف التدرج (الافتراضي شفاف عند الطرفين) |
from-<p>%, via-<p>%, to-<p>% | مواضع نقاط التوقف: via-40%, from-[15%] |
bg-none | يزيل التدرج |
تمزج أدوات التدرج ألوانها في Oklab كما يكتبها Tailwind CSS (in oklab)؛ وعند موضع عشوائي (bg-linear-[25deg], bg-conic-[0.25turn]) تتبع الإعداد الافتراضي في CSS: Oklab مع ألوان اللوحة، وsRGB عندما تكون كل نقطة توقف لونًا سداسيًا (hex) أو rgb() أو hsl() أو لونًا مسمًّى.
view()
.h_32()
.rounded_2xl()
.bg_linear_to_br()
.gradient_from(INDIGO.shade(500))
.gradient_via(PURPLE.shade(500))
.gradient_via_position(percentage(0.4))
.gradient_to(PINK.shade(500))<View class="h-32 rounded-2xl bg-linear-to-br from-indigo-500 via-purple-500 via-40% to-pink-500" />#الحدود
| الصنف | يضبط |
|---|---|
border, border-<n>, border-[<length>] | borderWidth (بدون قيمة: 1) |
border-x, border-y, border-t, border-r, border-b, border-l, border-s, border-e (مع -<n> أو بدونها) | عرض الجوانب المطابقة |
border-<color>, border-t-<color>, … | borderColor وألوان الجوانب كلٌّ على حدة |
border-solid, border-dashed, border-dotted | borderStyle |
border-none, border-hidden | borderStyle: "none" / "hidden": لا حدود مهما كانت أصناف العرض، وبأي ترتيب (md:border-solid تُظهرها من جديد) |
rounded, rounded-<size>, rounded-none, rounded-full, rounded-[<length>] | borderRadius (بدون قيمة: sm) |
rounded-t-, -r-, -b-, -l-, -tl-, -tr-, -br-, -bl- | الزوايا المطابقة |
rounded-s-, -e-, -ss-, -se-, -es-, -ee- | زوايا البداية / النهاية (تراعي الاتجاه): borderTopStartRadius, borderTopEndRadius, borderBottomStartRadius, borderBottomEndRadius |
outline, outline-<n>, outline-[<length>] | outlineWidth (بدون قيمة: 1)، متصل ما لم يوجد صنف نمط في أي موضع من السلسلة (outline-dashed outline-2 متقطع، outline-none outline-2 لا يرسم شيئًا) |
outline-<color> | outlineColor |
outline-solid, outline-dashed, outline-dotted, outline-none, outline-hidden | outlineStyle؛ النمط وحده يعني العرض المتوسط (medium) في CSS، أي 3 نقاط |
outline-offset-<n>, outline-offset-[<length>] | outlineOffset |
أحجام نصف القطر (بالنقاط): xs 2، sm 4، md 6، lg 8، xl 12، 2xl 16، 3xl 24، 4xl 32، full 9999.
#الحلقات
الحلقات هي ظلال صندوقية ذات انتشار، تُرسم خارج الحد دون أن تشغل حيزًا.
| الصنف | يضبط |
|---|---|
ring, ring-<n>, ring-[<length>] | حلقة بذلك العرض (بدون قيمة: 1) |
ring-<color> | لونها (الافتراضي لون نص العنصر) |
ring-inset | يرسم الحلقة من الداخل |
ring-offset-<n>, ring-offset-<color> | فجوة بين العنصر والحلقة (الافتراضي أبيض) |
inset-ring, inset-ring-<n>, inset-ring-<color> | حلقة داخلية |
#التأثيرات
| الصنف | يضبط |
|---|---|
shadow-2xs, shadow-xs, shadow-sm, shadow, shadow-md, shadow-lg, shadow-xl, shadow-2xl; /<alpha> | boxShadow من السمة؛ المُعدِّل هو ألفا الطبقات: shadow-xl/20 |
shadow-[<box-shadow>] | ظل عشوائي: shadow-[0_8px_24px_rgb(0_0_0_/_0.12)] |
shadow-<color>, shadow-current | يعيد تلوين طبقات الظل، بألفا الحجم: shadow-indigo-500/40 |
shadow-none | بلا ظل |
inset-shadow-2xs, -xs, -sm, inset-shadow, inset-shadow-[...], inset-shadow-<color>, inset-shadow-none | ظل داخلي |
opacity-<n>, opacity-[<value>] | opacity: opacity-50 = 0.5 |
mix-blend-<mode> | mixBlendMode: normal, multiply, screen, overlay, darken, lighten, color-dodge, color-burn, hard-light, soft-light, difference, exclusion, hue, saturation, color, luminosity, plus-darker, plus-lighter |
تُدمج الظلال والحلقات والظلال الداخلية في قائمة boxShadow واحدة، كما في CSS. يستبدل لون الظل لون كل طبقة، بما في ذلك ألفا، مثل --tw-shadow-color في Tailwind: shadow-md shadow-red-500 ظل أحمر معتم، وshadow-md/20 shadow-red-500 ظل أحمر بنسبة 20%.
#المرشحات
| الصنف | يضبط |
|---|---|
blur, blur-xs (4), -sm (8), -md (12), -lg (16), -xl (24), -2xl (40), -3xl (64), blur-none, blur-[<length>] | blur() |
brightness-<n>, contrast-<n>, saturate-<n> | عوامل نسبة مئوية: brightness-125 = 1.25 |
grayscale, grayscale-<n>, invert, invert-<n>, sepia, sepia-<n> | بدون قيمة: 100% |
hue-rotate-<deg>, -hue-rotate-<deg> | hue-rotate() |
drop-shadow, drop-shadow-xs, -sm, -md, -lg, -xl, -2xl, drop-shadow-[...], drop-shadow-none; drop-shadow-<color>, drop-shadow-current; /<alpha> على أي منهما | drop-shadow() لكل طبقة، بعد المرشحات الأخرى؛ اللون يستبدل ألوان الطبقات، بألفا الحجم؛ ترسم الويب وLinux وWindows وGPUI كل الطبقات، أما iOS وmacOS وAndroid فترسم الطبقة الأعرض |
drop-shadow-none | يزيله |
filter-none | يزيل كل المرشحات |
backdrop-blur, backdrop-blur-<size>, backdrop-blur-[<length>] | يطمس ما خلف العنصر |
backdrop-brightness-<n>, backdrop-contrast-<n>, backdrop-grayscale, backdrop-hue-rotate-<deg>, backdrop-invert, backdrop-opacity-<n>, backdrop-saturate-<n>, backdrop-sepia | مرشحات الخلفية |
backdrop-filter-none | يزيلها |
#التحويلات
| الصنف | يضبط |
|---|---|
translate-x-<n>, translate-y-<n>, translate-<n> | translate (المسافات، full، وكسور من حجم العنصر نفسه: -translate-x-1/2، وقيم عشوائية) |
rotate-<deg>, rotate-[<angle>] | rotate |
rotate-x-<deg>, rotate-y-<deg>, rotate-z-<deg> | تدوير ثلاثي الأبعاد (في transform، بعد الإزاحة والتدوير والتحجيم) |
scale-<pct>, scale-x-<pct>, scale-y-<pct>, scale-[<factor>] | scale: scale-95 = 0.95، و-scale-x-100 تعكس |
skew-<deg>, skew-x-<deg>, skew-y-<deg> | الإمالة (skew)، في transform (غير متاحة على Android) |
perspective-dramatic (100), -near (300), -normal (500), -midrange (800), -distant (1200), perspective-[<length>], perspective-none | العمق للتدويرات ثلاثية الأبعاد لأبناء العنصر، منظورًا إليها من مركزه (perspective في CSS: <View class="perspective-near"><View class="rotate-y-45" /></View>) |
origin-center, -top, -top-right, -right, -bottom-right, -bottom, -bottom-left, -left, -top-left, origin-[<value>] | transformOrigin |
backface-hidden, backface-visible | backfaceVisibility |
transform-none | يمسح التدويرات ثلاثية الأبعاد والإمالات (transform: none في CSS) |
translate-none, rotate-none, scale-none | يمسح الإزاحة والتدوير والتحجيم |
تتركب أدوات التحويل كما في CSS: translate-* وrotate-* وscale-* تضبط الخصائص translate وrotate وscale وتجتمع بصرف النظر عن الترتيب، ثم يُطبَّق transform (rotate-x-*, skew-*). أما مفاتيح الخاصية style التي تحمل الأسماء نفسها فتستبدل خاصيتها وحدها: style={{ scale: 1.1 }} تستبدل scale-95 وتُبقي rotate-3. تُقبل transform وtransform-gpu وtransform-cpu وtransform-flat ولا تفعل شيئًا: يركّب NSH كل التحويلات بالطريقة نفسها، مسطّحة. تُحسب الإزاحات بكسر من الحجم بالنسبة إلى إطار العنصر، وتتبعه عند تغيير حجمه.
#الانتقالات والحركة
| الصنف | يضبط |
|---|---|
transition | الألوان والعتامة والظل والتحويل؛ 150 مللي ثانية، cubic-bezier(0.4, 0, 0.2, 1) |
transition-all, transition-colors, transition-opacity, transition-shadow, transition-transform | الخصائص المتحركة |
transition-none | بلا انتقال |
duration-<ms>, duration-[<time>] | transitionDuration: duration-300, duration-[0.4s] |
delay-<ms>, delay-[<time>] | transitionDelay |
ease-linear, ease-in, ease-out, ease-in-out, ease-initial, ease-[cubic-bezier(...)] | transitionTimingFunction |
animate-spin, animate-ping, animate-pulse, animate-bounce | حركة أصلية بإطارات مفتاحية، تتكرر إلى الأبد |
animate-none | توقفها |
تعمل الانتقالات على خيط واجهة المستخدم عند تغير قيمة، بما في ذلك عندما يبدأ تطابق متغيّر (variant) أو ينتهي، لذا يحرّك transition active:scale-95 الضغط دون JS. غلّف الحركات في motion-safe: لاحترام إعداد تقليل الحركة.
#التفاعل
| الصنف | يضبط |
|---|---|
pointer-events-none, pointer-events-auto | pointerEvents: "none" / "auto": هل العنصر هدف للمس والمؤشر، وتُورَّث كما في CSS: داخل عنصر pointer-events-none يعود عنصر pointer-events-auto هدفًا من جديد |
cursor-<name>, cursor-[<name>] | cursor: cursor-pointer, cursor-grab, cursor-not-allowed, … (كل كلمات المؤشر المفتاحية في CSS) |
select-none, select-text, select-auto | تحديد النص (انظر الطباعة) |
#SVG
| الصنف | يضبط |
|---|---|
fill-<color>, fill-none, fill-current, fill-inherit | fill (fill-current هو currentColor) |
stroke-<color>, stroke-none, stroke-current, stroke-inherit | stroke |
stroke-<number>, stroke-[<length>] | strokeWidth |
#الصور
| الصنف | يضبط |
|---|---|
object-cover, object-contain, object-fill, object-none, object-scale-down | objectFit (fill تمدّد، none تُبقي الحجم الطبيعي، موضوعة عند objectPosition، وscale-down مثلها، لكن تُصغَّر لتلائم المساحة حيث تكون أكبر)؛ للصور ومقاطع الفيديو |
object-top, object-bottom, object-left, object-right, object-center, object-top-left, object-top-right, object-bottom-left, object-bottom-right, object-[<position>] | objectPosition (object-left-top, … مثل object-top-left, …) |
tint-<color> | tintColor (يعيد تلوين الصور القالبية) |
#مقبولة دون تأثير
هذه الأدوات إما تلميحات للعرض أو تصف ما هو عليه كل عنصر أصلي أصلًا؛ تُحلَّل دون تحذير ولا تغيّر شيئًا: antialiased, subpixel-antialiased, isolation-auto, box-border, appearance-none, appearance-auto, will-change-auto, will-change-scroll, will-change-contents, will-change-transform, will-change-[<value>], transform, transform-gpu, transform-cpu, transform-flat. التمرير والالتقاط والتمرير الزائد هي خصائص لـ scroll.
#غير مدعومة
متغيّرات peer-*، والعناصر الزائفة (before:, after:)، والخصائص العشوائية ([prop:value])، وoverflow-auto / overflow-scroll، وdivide-*، وcolumns-*، وfloat-*، وcontainer، واستعلامات الحاويات، وorder-*، وtransform-3d، وselect-all، وborder-double / outline-double، وقيود الحد الأدنى/الأقصى الجوهرية (مثل max-w-max)، وsnap-*، وscroll-*، وoverscroll-*، وtouch-*، وisolate كلها أصناف غير معروفة. ينبّه nsh build وnsh dev إلى الأصناف غير المعروفة التي يجدانها في شيفرتك المصدرية (file:line:col: unknown class '...')، ويسجّل وقت التشغيل كل صنف غير معروف مرة واحدة.
#المتغيّرات (Variants)
تجعل المتغيّرات الأداة مشروطة: dark:bg-zinc-900, md:flex-row, active:opacity-70. يمكن تكديسها (dark:active:bg-zinc-700) وتُقيَّم أصليًا كلما تغيّر ما تعتمد عليه.
#المظهر والبيئة
| المتغيّر | يُطبَّق عندما | Rust |
|---|---|---|
dark: | يكون المظهر داكنًا | .dark(|s| …) |
ios: | يعمل التطبيق على iOS أو Mac Catalyst | .when(os() == Os::Ios, …) |
android: | يعمل التطبيق على Android | .when(os() == Os::Android, …) |
portrait:, landscape: | تكون النافذة أطول من عرضها / أعرض من طولها | .style_when(move || window().height > window().width, …) |
ltr:, rtl: | اتجاه التخطيط | .style_when(rtl, …) |
motion-safe:, motion-reduce: | لم يطلب المستخدم / طلب تقليل الحركة | .style_when(reduce_motion, …) |
#نقاط التوقف (Breakpoints)
تقارن نقاط التوقف عرض النافذة بالنقاط.
| المتغيّر | الحد الأدنى للعرض |
|---|---|
sm: | 640 |
md: | 768 |
lg: | 1024 |
xl: | 1280 |
2xl: | 1536 |
| الصيغة | مثال | يُطبَّق عندما |
|---|---|---|
<bp>: | md:p-8 | العرض ≥ نقطة التوقف |
max-<bp>: | max-md:p-1 | العرض < نقطة التوقف |
min-[<length>]: | min-[600px]:grid-cols-3 | العرض ≥ الطول المحدد |
max-[<length>]: | max-[400px]:text-sm | العرض < الطول المحدد |
لا يطابق الهاتف في الوضع الرأسي (بعرض 390 نقطة) أيًّا من نقاط التوقف الافتراضية؛ أما الجهاز اللوحي أو الهاتف في الوضع الأفقي فيطابق عدة نقاط. في Rust، نقطة التوقف شرط على النافذة: .style_when(move || window().width >= px(768.0), |s| s.p_8()) هو md:p-8.
#حالات التفاعل
لا تتتبع المنصة الحالات إلا للعناصر التي تستخدمها أصنافها، وتُطبَّق التغييرات أصليًا دون ذهاب وإياب عبر JS.
| المتغيّر | يُطبَّق عندما | Rust |
|---|---|---|
active: | يكون العنصر مضغوطًا | .active(|s| …) |
hover: | يكون المؤشر فوقه (مؤشر iPad، وMac Catalyst، وفأرة Android) | .hover(|s| …) |
focus:, focus-visible: | يكون التركيز على حقل الإدخال | .focus(|s| …) |
focus-within: | يكون التركيز على العنصر أو على أحد أحفاده (محتوى Overlay هو من أحفاد العنصر الذي يوجد فيه) | .focus_within(…) |
disabled: | يملك العنصر الخاصية disabled | .disabled_style(|s| …) |
enabled: | لا يملك العنصر الخاصية disabled | |
selected: | يكون العنصر محددًا: selected الخاصة بـ Button، أو accessibilityState.selected | |
checked: | يكون العنصر مفعّلًا (checked): accessibilityState.checked هو true ("mixed" غير مفعّل) | |
indeterminate: | يكون العنصر في حالة غير محسومة (indeterminate): accessibilityState.checked هو "mixed" | |
aria-expanded: | يكون العنصر موسّعًا: accessibilityState.expanded هو true (زر التشغيل الخاص بـ Popover أو Menu ما دامت نافذته المنبثقة مفتوحة) | |
aria-pressed: | يكون العنصر زر تبديل في وضع التشغيل: accessibilityState.pressed هو true ("mixed" غير مضغوط؛ وليس active:، أي ضغطة جارية) | .aria_pressed(|s| …) |
aria-busy: | يكون العنصر مشغولًا: accessibilityState.busy هو true | |
aria-checked: | يكون العنصر مفعّلًا: accessibilityState.checked هو true، مثل checked: | |
aria-selected: | يكون العنصر محددًا: accessibilityState.selected هو true، مثل selected: | |
data-<name>: | يملك العنصر السمة المنطقية data-* name (&[data-<name>] في Tailwind؛ أسماؤها من أحرف صغيرة وأرقام و-): ما يعرضه جزء من مكوّن زيادةً على حالاته، مثل يوم في تقويم عند بداية نطاق data-range-start | Interactive::project_data(name, …) يضبط واحدة |
الحالات نفسها على هيئة كائنات أنماط هي الخصائص activeStyle وhoverStyle وfocusStyle وdisabledStyle وcheckedStyle وindeterminateStyle وexpandedStyle وpressedStyle لكل عنصر (ولـ selectedStyle الخاصة بـ Button)؛ وتتغلب على نمط العنصر وأصنافه.
يعمل disabled على أي عنصر: فهو يطبّق disabled: ويزيل معالجات الضغط من العنصر، فلا يظهر عليه أي تجاوب مع الضغط أيضًا.
view()
.on_press(save)
.disabled(saving)
.rounded_lg()
.bg(BLUE.shade(600))
.px_4()
.py_2()
.transition()
.active(|s| s.scale(0.95).bg(BLUE.shade(700)))
.disabled_style(|s| s.opacity(0.4))
.child(text("Save").font_weight(FontWeight::MEDIUM).text_color(white()))<View
onPress={save}
disabled={saving()}
class="rounded-lg bg-blue-600 px-4 py-2 transition active:scale-95 active:bg-blue-700 disabled:opacity-40"
>
<Text class="font-medium text-white">Save</Text>
</View>#المجموعات
علّم عنصرًا سلفًا باستخدام group ونسّق العناصر التابعة له بحسب حالته باستخدام group-<state>:. سمِّ المجموعات لتداخلها: group/card وgroup-hover/card:.
| المتغير | ينطبق عندما تكون المجموعة | Rust |
|---|---|---|
group-active: | مضغوطة | .group_active(…)، .group_active_named(name, …) |
group-hover: | تحت المؤشر | .group_hover(…)، .group_hover_named(name, …) |
group-focus:، group-focus-visible: | عليها التركيز | |
group-focus-within: | عليها التركيز أو تحتوي على عنصر عليه التركيز | .group_focus_within(…)، .group_focus_within_named(name, …) |
group-disabled: | معطّلة | |
group-selected: | محددة | |
group-checked: | مفعّلة (checked) | |
group-indeterminate: | في حالة غير محسومة | |
group-aria-expanded: | موسّعة | |
group-aria-pressed: | زر تبديل في وضع التشغيل | |
group-aria-busy:، group-aria-checked:، group-aria-selected: | مشغولة، مفعّلة، محددة | |
group-data-<name>: | تعرض السمة data-* بالقيمة name |
view()
.on_press(open)
.group_named("row")
.flex_row()
.items_center()
.gap_3()
.p_3()
.active(|s| s.bg(ZINC.shade(100)))
.child(
text("Settings")
.flex_1()
.text_color(ZINC.shade(900))
.group_active_named("row", |s| s.text_color(BLUE.shade(600))),
)
.child(
text("›")
.text_color(ZINC.shade(400))
.group_active_named("row", |s| s.translate_x(px(4.0)))
.transition_transform(),
)<View onPress={open} class="group/row flex-row items-center gap-3 p-3 active:bg-zinc-100">
<Text class="flex-1 text-zinc-900 group-active/row:text-blue-600">Settings</Text>
<Text class="text-zinc-400 group-active/row:translate-x-1 transition-transform">›</Text>
</View>#الموضع بين العناصر الشقيقة
| المتغير | ينطبق على |
|---|---|
first: | العنصر الابن الأول |
last: | العنصر الابن الأخير |
only: | العنصر الابن الوحيد |
odd: | العنصر الابن الأول والثالث … |
even: | العنصر الابن الثاني والرابع … |
each(items, |item: &Item| item.id, move |item, index| {
text(move || item.with(|i| i.name.clone()))
.border_b(px(1.0))
.border_color(ZINC.shade(200))
.py_3()
.style_when(move || index.get() + 1 == items.with(Vec::len), |s| s.border_b(px(0.0)))
})<Each of={items()}>{(item) => <Text class="border-b border-zinc-200 py-3 last:border-b-0">{item().name}</Text>}</Each>#النص البديل والتحديد
يُطبَّق placeholder: على النص البديل (placeholder) الخاص بـ <Input> ويقبل لون النص فقط: placeholder:text-zinc-400 (مفتاح النمط placeholderColor). ويُطبَّق selection: على التحديد داخل <Input> أو <Text> قابل للتحديد، وعلى أي عنصر بالنسبة إلى العناصر داخله (مكافئ & *::selection في Tailwind؛ وتكون الغلبة لأقرب عنصر)، ويقبل لون الخلفية، أي التمييز: selection:bg-violet-200 (مفتاح النمط selectionColor، الذي يلوّن أيضًا مؤشر الإدخال في حقل الإدخال على المنصات التي ترسمه بلون واحد).
#مهم
وضع ! قبل الأداة المساعدة أو بعدها (!p-4، p-4!) يجعلها تتغلب على كل الفئات الأخرى وعلى style المضمّن.
#تخصيص السمة
وسّع السمة في الكائن "tailwind" داخل nsh.json الخاص بتطبيقك. تُضاف العناصر ذات الأسماء الجديدة، أما العناصر ذات الأسماء الموجودة فتحل محل القيم الافتراضية. الأطوال بالنقاط. يُتحقَّق من السمة عند تجميع التطبيق: المفتاح غير المعروف أو القيمة غير الصالحة يسبب خطأ في البناء.
{
"name": "My App",
"id": "com.example.myapp",
"tailwind": {
"colors": {
"brand": { "50": "#f5f3ff", "500": "#7c3aed", "600": "#6d28d9", "DEFAULT": "#7c3aed" },
"accent": "#f59e0b"
},
"spacing": 4,
"breakpoints": { "tablet": 600 },
"fontFamily": { "display": "Inter" },
"fontSize": { "huge": [48, 1.1] },
"fontWeight": { "heavy": 850 },
"radius": { "card": 14 },
"shadow": { "card": "0 2px 8px rgb(0 0 0 / 0.12)" },
"insetShadow": { "well": "inset 0 2px 6px rgb(0 0 0 / 0.1)" },
"dropShadow": { "icon": "0 2px 4px rgb(0 0 0 / 0.2)" },
"tracking": { "label": 0.08 },
"leading": { "dense": 1.15 },
"blur": { "glass": 20 },
"perspective": { "card": 700 },
"aspect": { "photo": 1.5 },
"ease": { "snappy": [0.2, 0, 0, 1] },
"container": { "content": 680 }
}
}
مع هذه السمة، تعمل جميعها: bg-brand-500، bg-brand (درجة DEFAULT)، text-accent، tablet:flex-row، font-display، text-huge، font-heavy، rounded-card، shadow-card، inset-shadow-well، drop-shadow-icon، tracking-label، leading-dense، blur-glass، perspective-card، aspect-photo، ease-snappy وmax-w-content.
| المفتاح | القيمة | يستخدمه |
|---|---|---|
colors | { name: color } أو { name: { shade: color } }؛ ويسمّي DEFAULT اللون المجرد. أي صيغة لون في CSS. | كل أداة مساعدة للألوان |
spacing | نقاط لكل خطوة (الافتراضي 4) | p-*، m-*، gap-*، w-*، … |
rem | نقاط لكل rem (الافتراضي 16) | |
breakpoints | { name: width } | متغيرات نقاط التوقف (مرتبة بحسب العرض) |
container | { name: width } | w-*، min-w-*، max-w-* |
fontFamily | { name: family } (عائلة خطوط للنظام أو اسم خط مضمَّن) | font-* |
fontSize | { name: size } أو { name: [size, lineHeightMultiple] } | text-* |
fontWeight | { name: 1–1000 } | font-* |
tracking | { name: em } | tracking-* |
leading | { name: multiple } | leading-* |
radius | { name: points } | rounded-* |
shadow، insetShadow، dropShadow | { name: "CSS box-shadow" } | shadow-*، inset-shadow-*، drop-shadow-* |
blur | { name: points } | blur-*، backdrop-blur-* |
perspective | { name: points } | perspective-* |
aspect | { name: ratio } | aspect-* |
ease | { name: [x1, y1, x2, y2] } | ease-* |
#ذو صلة
- Tailwind: الدليل.
- التنسيق:
classوclassListوstyleوكيفية اجتماعها. - مرجع الأنماط: مفاتيح الأنماط التي تضبطها الأدوات المساعدة.