تُرجمت هذه الصفحة آليًا وقد تحتوي على أخطاء. اقرأ الأصل الإنجليزي

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) }),
    )

#كيفية دمج الفئات

  • الأحدث يفوز. بين الفئات ضمن مستوى المتغيّر نفسه، تفوز الفئة الأخيرة في السلسلة: "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 نقاط
pxp-px، -mt-pxنقطة واحدة
0m-00
كسر (inset وwidth وheight، basis، translate)w-1/2، left-1/3نسبة مئوية من العنصر الأب
full (بالمعنى نفسه)w-full، inset-full100%
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-flexdisplay: "flex"، وصفًّا ما لم توجد فئة اتجاه
grid، inline-griddisplay: "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-blockdisplay: "block": ما يحسبه المتصفح لهما داخل عنصر أب من نوع flex أو grid
hiddendisplay: "none"
relative، absoluteposition
staticposition: "static": داخل التدفق، وتُتجاهل إزاحاته؛ ويستخدم الأحفاد ذوو الموضع المطلق أقرب سلف محدَّد الموضع
stickyposition: "sticky": داخل التدفق، يلتصق بـtop (left في scroll view أفقي) ضمن scroll view المحيط به ما دام عنصره الأب ظاهرًا
fixedposition: "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)
visiblevisibility: "visible"
invisible، collapsevisibility: "hidden" (يحتفظ بمساحته)
overflow-hidden، overflow-clip، overflow-x-hidden، overflow-y-hiddenoverflow: "hidden"
overflow-visibleoverflow: "visible"
aspect-square، aspect-video، aspect-<a>/<b>، aspect-[<a>/<b>]، aspect-autoaspectRatio (1، 16/9، a/b، بلا)

التمرير عنصر وليس فئة: overflow-auto وoverflow-scroll غير مدعومين؛ استخدم scroll.

#Flexbox وgrid

الفئةتضبط
flex-row، flex-row-reverse، flex-col، flex-col-reverseflexDirection
flex-wrap، flex-wrap-reverse، flex-nowrapflexWrap
flex-1grow 1 وshrink 1 وbasis 0
flex-<n>grow n وshrink 1 وbasis 0
flex-autogrow 1 وshrink 1 وbasis auto
flex-initialgrow 0 وshrink 1 وbasis auto
flex-nonegrow 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-normaljustifyContent
items-start، items-end، items-center، items-baseline، items-stretchalignItems
self-auto، self-start، self-end، self-center، self-stretch، self-baselinealignSelf
content-start، content-end، content-center، content-between، content-around، content-evenly، content-stretch، content-normalalignContent
justify-items-start، -end، -center، -stretch، -normaljustifyItems
justify-self-auto، -start، -end، -center، -stretchjustifySelf
place-content-center، -start، -end، -between، -stretchalignContent وjustifyContent
place-items-center، -start، -end، -stretchalignItems وjustifyItems
place-self-auto، -center، -start، -end، -stretchalignSelf و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-nonegridTemplateColumns (grid-cols-[200px_1fr])
grid-rows-<n>، grid-rows-[<tracks>]، grid-rows-nonegridTemplateRows
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-densegridAutoFlow
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-autoauto (يُحدَّد حجمه بالمحتوى)
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-monofontFamily: "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-italicfontStyle
normal-nums، small-caps، oldstyle-nums، lining-nums، tabular-nums، proportional-numsfontVariant (تُدمج معًا؛ normal-nums يعيد ضبط صيغ الأرقام)

#الحجم واللون وارتفاع السطر

يضبط text-<size> حجم الخط وارتفاع السطر المطابق في Tailwind، وتستبدله فئة leading-* أيًّا كان موضعها في السلسلة وأيًّا كان متغيّرها (leading-tight md:text-lg يُبقي التباعد الضيق بين الأسطر):

الفئةالحجمارتفاع السطر
text-xs1216
text-sm1420
text-base1624
text-lg1828
text-xl2028
text-2xl2432
text-3xl3036
text-4xl3640
text-5xl481×
text-6xl601×
text-7xl721×
text-8xl961×
text-9xl1281×
الفئةتضبط
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]

#المحاذاة وحالة الأحرف والالتفاف

الفئةتضبط
text-left، text-center، text-right، text-justifytextAlign
text-start، text-endtextAlign: "start" / "end": بداية السطر أو نهايته في اتجاه التخطيط
align-baseline، align-text-top، align-text-bottom، align-middleverticalAlign (الـ views والصور داخل النص)
uppercase، lowercase، capitalize، normal-casetextTransform
truncateسطر واحد، وحذف في النهاية بنقاط الحذف، دون التفاف، overflow: hidden (على view: لا تلتف نصوصه)
line-clamp-<n>، line-clamp-nonenumberOfLines (none يعرض كل الأسطر)
text-ellipsis، text-cliptextOverflow: "ellipsis" / "clip"
whitespace-nowrap، text-nowrapلا تلتف الأسطر أبدًا؛ وعلى view تنطبق على أسطر النصوص داخله (موروثة، كما في white-space في CSS)
whitespace-normal، text-wrap، text-balance، text-prettyتلتف الأسطر (لا تُوازَن)
select-text، select-noneuserSelect: "text" / "none"؛ وعلى view تنطبق على النصوص داخله التي لا تضبط شيئًا
select-autouserSelect: "auto": يقرّر الـ view المحيط به، كما في user-select: auto في CSS (select-none md:select-auto)

#الزخرفة والظل

الصنفيضبط
underline, line-through, no-underlinetextDecorationLine
decoration-solid, decoration-double, decoration-dotted, decoration-dashed, decoration-wavytextDecorationStyle
decoration-<n>, decoration-[<length>]textDecorationThickness
decoration-auto, decoration-from-fonttextDecorationThickness: "auto"
decoration-<color>textDecorationColor
underline-offset-<n>, underline-offset-[<length>], underline-offset-autotextUnderlineOffset
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))

#الحدود

الصنفيضبط
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-dottedborderStyle
border-none, border-hiddenborderStyle: "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-hiddenoutlineStyle؛ النمط وحده يعني العرض المتوسط (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-visiblebackfaceVisibility
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-autopointerEvents: "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-inheritfill (fill-current هو currentColor)
stroke-<color>, stroke-none, stroke-current, stroke-inheritstroke
stroke-<number>, stroke-[<length>]strokeWidth

#الصور

الصنفيضبط
object-cover, object-contain, object-fill, object-none, object-scale-downobjectFit (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-startInteractive::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()))

#المجموعات

علّم عنصرًا سلفًا باستخدام 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(),
    )

#الموضع بين العناصر الشقيقة

المتغيرينطبق على
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)))
})

#النص البديل والتحديد

يُطبَّق 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-*

#ذو صلة