زر
خمسة أنماط عبر ست نبرات، يُعرض على الخادم بلا JavaScript. ومن خلال render يصبح رابطًا حقيقيًا بالشكل نفسه.
server - 0 KB
زر
server - 0 KBخمسة أنماط عبر ست نبرات، يُعرض على الخادم بلا JavaScript. ومن خلال render يصبح رابطًا حقيقيًا بالشكل نفسه.
جرّبه
variant
tone
size
loading
fullWidth
الشيفرة
button.tsx
import { Button } from 'topclassui/button'
<Button>Save</Button>loading يمنع النقر ويعلن عن نفسه عبر aria-busy، لكنه يحتفظ بلونه كاملًا فلا يبدو معطّلًا.
كل الحالات، بدون تمرير الفأرة
5 حالاتأمثلة
- لكل ما يفعله المستخدم في الصفحة: الإرسال، الحفظ، التأكيد، فتح نافذة حوار.
- للانتقال إلى مكان آخر أبقِ
Buttonومرّرrender={<Link href="/docs" />}: يبقى رابطًا حقيقيًا، فيعمل النقر بالزر الأوسط و«الفتح في علامة تبويب جديدة». loadingيحتفظ بلونه كاملًا ويعرض مؤشر انتظار، والزر المعطّل يخفت. كلاهما يمنع الزر، والرابطrender={<a href />}الممنوع يفقدhrefفلا يمكن اتباعه.- النص الطويل ينتهي بعلامة حذف ولا يوسّع الصفحة أبدًا، و
fullWidthيمدّ الزر بعرض حاويته. size="custom"لا يضيف أصناف حجم، فيحددclassNameالخاص بك الارتفاع والحشو.
variants
variants.tsx
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button>Save</Button>
<Button variant="soft">Draft</Button>
<Button variant="outline">Cancel</Button>
<Button variant="ghost">Skip</Button>
<Button variant="link">Learn more</Button>
</div>
)
}
tones
tones.tsx
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex flex-col gap-3">
<div className="flex flex-wrap items-center gap-3">
<Button tone="primary">Primary</Button>
<Button tone="neutral">Neutral</Button>
<Button tone="success">Success</Button>
<Button tone="warning">Warning</Button>
<Button tone="danger">Danger</Button>
<Button tone="info">Info</Button>
</div>
<div className="flex flex-wrap items-center gap-3">
<Button variant="soft" tone="primary">Primary</Button>
<Button variant="soft" tone="neutral">Neutral</Button>
<Button variant="soft" tone="success">Success</Button>
<Button variant="soft" tone="warning">Warning</Button>
<Button variant="soft" tone="danger">Danger</Button>
<Button variant="soft" tone="info">Info</Button>
</div>
<div className="flex flex-wrap items-center gap-3">
<Button variant="outline" tone="primary">Primary</Button>
<Button variant="outline" tone="success">Success</Button>
<Button variant="outline" tone="danger">Danger</Button>
<Button variant="ghost" tone="warning">Warning</Button>
<Button variant="ghost" tone="info">Info</Button>
<Button variant="link" tone="neutral">Neutral</Button>
</div>
</div>
)
}
sizes
sizes.tsx
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button size="xs">Extra small</Button>
<Button size="sm">Small</Button>
<Button size="md">Medium</Button>
<Button size="lg">Large</Button>
<Button size="xl">Extra large</Button>
</div>
)
}
with-icon
with-icon.tsx
import { arrowRight } from 'topclassui/icons/arrow-right'
import { check } from 'topclassui/icons/check'
import { Svg } from 'topclassui/svg'
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button>
<Svg icon={check} />
Approve
</Button>
<Button variant="outline">
Next
<Svg icon={arrowRight} />
</Button>
</div>
)
}
as-link
as-link.tsx
import { Button } from 'topclassui/button'
/** The render prop makes a real anchor that looks like a button and still costs 0 KB. */
export default function Demo() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button render={<a href="/docs" />}>Read the docs</Button>
<Button render={<a href="/docs" />} variant="outline">Outlined link</Button>
</div>
)
}
full-width
full-width.tsx
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex max-w-sm flex-col gap-3">
<Button fullWidth>Continue</Button>
<Button variant="outline" fullWidth>Back</Button>
</div>
)
}
long-label
long-label.tsx
import { check } from 'topclassui/icons/check'
import { Svg } from 'topclassui/svg'
import { Button } from 'topclassui/button'
const LONG = 'Save this document and continue to the next step of the wizard'
export default function Demo() {
return (
<div className="flex flex-col gap-3">
<div className="w-50 rounded-box border border-line p-2" data-narrow>
<Button>{LONG}</Button>
</div>
<div className="w-50 rounded-box border border-line p-2" data-narrow>
<Button variant="outline" tone="danger">
<Svg icon={check} />
{LONG}
</Button>
</div>
<div className="w-50 rounded-box border border-line p-2" data-narrow>
<Button fullWidth size="sm">{LONG}</Button>
</div>
</div>
)
}
custom-size
custom-size.tsx
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex flex-wrap items-center gap-3">
<Button size="md">The scale</Button>
<Button size="custom" className="h-control-xl px-pad-x-sm text-xs">Your own row</Button>
</div>
)
}
skeleton
skeleton.tsx
import { ButtonSkeleton } from 'topclassui/button'
export default function Demo() {
return (
<div className="flex flex-wrap items-center gap-3">
<ButtonSkeleton size="sm" />
<ButtonSkeleton />
<ButtonSkeleton size="lg" />
</div>
)
}
بالعربية، من اليمين إلى اليسار
rtl.tsx
import { arrowRight } from 'topclassui/icons/arrow-right'
import { Svg } from 'topclassui/svg'
import { Button } from 'topclassui/button'
export default function Demo() {
return (
<div dir="rtl" lang="ar" className="flex flex-wrap items-center gap-3">
<Button>احفظ</Button>
<Button variant="soft" tone="danger">احذف</Button>
<Button variant="outline">
التالي
<Svg icon={arrowRight} />
</Button>
</div>
)
}
الخصائص
لوحة المفاتيح وإمكانية الوصول
- افتراضيًا هو
<button type="button">أصلي، يُسمّى بنصه، والأيقونة بجانب النص مخفية عن قارئ الشاشة. - أثناء المنع يحمل الزر الأصلي السمة
disabledويخرج من ترتيب التنقل، وأي عنصر آخر يأخذaria-disabledوtabindex="-1". - لا يقل عن 24 في 24 بكسل، و44 تحت مؤشر لمس، مع حلقة تركيز ظاهرة.
من اليمين إلى اليسار
لا شيء يُضبط: الحشو والفراغ منطقيان، فتتبادل الأيقونة والنص موضعيهما معًا، وتنقلب الأيقونة الاتجاهية مثل السهم.
الخادم والمتصفح
يُعرض على الخادم ولا يرسل أي JavaScript.
الملفات: index.tsx.
على الشارة: server - 0 KB.