مربع اختيار
مفتاح تبديل ثنائي لمربعات الموافقة، وفلاتر الاختيار المتعدد، واختيار الصفوف بشكل جماعي — مع تصميم «النيوبروتاليستي» الذي يتميز بالحدود والظلال.
"use client"
import { Checkbox } from "@/components/ui/checkbox"مربع الاختيار هو عنصر التحكم القياسي للخيارات الثنائية — محدد، غير محدد، أو غير محدد في حالة الاختيارات الجزئية. وهو مبني على العنصر الأساسي Base UI Checkbox ومصمم وفقًا لأسلوب «النيوبروتاليةي»: حدود سميكة، وظلال حادة، وخط عريض.
استخدمه عندما:
- الشروط والموافقة — مربع «أوافق» في عمليات التسجيل والدفع، والذي يتم إرساله مع النموذج.
- مرشحات التحديد المتعدد — الفئات أو العلامات أو نطاقات الأسعار في الشريط الجانبي حيث تكون أي تركيبة صالحة.
- التحديد الجماعي في الجداول — مربعات الاختيار لكل صف بالإضافة إلى خيار «تحديد الكل» غير المحدد في الرأس.
التثبيت#
pnpm dlx shadcn@latest add https://neobrutalism.com/r/base/checkbox.jsonnpx shadcn@latest add https://neobrutalism.com/r/base/checkbox.jsonyarn dlx shadcn@latest add https://neobrutalism.com/r/base/checkbox.jsonbunx --bun shadcn@latest add https://neobrutalism.com/r/base/checkbox.json
ثبّت التبعيات التالية:
pnpm add @base-ui/reactnpm install @base-ui/reactyarn add @base-ui/reactbun add @base-ui/react
انسخ الكود التالي والصقه في مشروعك.
"use client"
import * as React from "react"
import { CheckIcon } from "lucide-react"
import { Checkbox as CheckboxPrimitive } from "radix-ui"
import { cn } from "@/lib/utils"
function Checkbox({
className,
...props
}: React.ComponentProps<typeof CheckboxPrimitive.Root>) {
return (
<CheckboxPrimitive.Root
data-slot="checkbox"
className={cn(
"peer relative flex size-5 shrink-0 items-center justify-center rounded border-2 bg-input shadow-sm transition-colors outline-none group-has-disabled/field:opacity-50 after:absolute after:-inset-x-3 after:-inset-y-2 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive data-checked:border-border data-checked:bg-primary data-checked:text-primary-foreground",
className
)}
{...props}
>
<CheckboxPrimitive.Indicator
data-slot="checkbox-indicator"
className="grid place-content-center text-current transition-none [&>svg]:size-3.5"
>
<CheckIcon />
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
)
}
export { Checkbox }
حدّث مسارات الاستيراد لتطابق إعداد مشروعك.
الاستخدام#
import { Checkbox } from "@/components/ui/checkbox"<Checkbox />حالة التحديد#
استخدم defaultChecked لمربعات الاختيار غير المتحكَّم بها، أو checked
وonCheckedChange للتحكم في الحالة.
import * as React from "react"
export function Example() {
const [checked, setChecked] = React.useState(false)
return <Checkbox checked={checked} onCheckedChange={setChecked} />
}الحالة غير الصالحة#
عيّن aria-invalid على مربع الاختيار وdata-invalid على غلاف الحقل
لإظهار أنماط الحالة غير الصالحة.
import { Checkbox } from "@/components/ui/checkbox"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
أمثلة#
أساسي#
اقرن مربع الاختيار مع Field وFieldLabel للحصول على تخطيط وتسمية صحيحين.
import { Checkbox } from "@/components/ui/checkbox"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
الوصف#
استخدم FieldContent وFieldDescription للنص المساعد.
import { Checkbox } from "@/components/ui/checkbox"
import {
Field,معطّل#
استخدم الخاصية disabled لمنع التفاعل، وأضف السمة data-disabled إلى المكوّن <Field> لأنماط الحالة المعطّلة.
import { Checkbox } from "@/components/ui/checkbox"
import { Field, FieldGroup, FieldLabel } from "@/components/ui/field"
المجموعة#
استخدم عدة حقول لإنشاء قائمة مربعات اختيار.
import { Checkbox } from "@/components/ui/checkbox"
import {
Field,الجدول#
"use client"
import * as React from "react"RTL#
لتفعيل RTL في Neobrutalism، راجع دليل إعداد RTL.
"use client"
import * as React from "react"إمكانية الوصول#
يتبع مربع الاختيار نمط WAI-ARIA Checkbox: يعرض العنصر الأساسي role="checkbox" مع aria-checked (بما فيها "mixed" للحالة غير المحددة بالكامل) ويُزامن مدخلًا أصليًا مخفيًا حتى تُرسل القيمة مع النماذج.
تفاعلات لوحة المفاتيح:
| المفتاح | الإجراء |
|---|---|
Tab / Shift + Tab | نقل التركيز إلى مربع الاختيار أو بعيدًا عنه |
Space | تبديل حالة التحديد (غير محدد بالكامل → محدَّد) |
Enter لا يبدّل مربع الاختيار — ذلك وفق نمط ARIA، وليس خللًا.
مرجع API#
لمزيد من المعلومات، راجع وثائق Base UI.