Button

دکمه یا عنصری شبیه به دکمه برای آغاز یک عمل؛ با ده حالت بصری، پنج رنگ معنایی، شش اندازه و کنترل جداگانهٔ شعاع گوشه.

ری‌اکت ۱۹ و Next.js با پیاده‌سازی دسترس‌پذیری داخلی دیگویو ۳ با Composition API و Reka UISvelte ۵ با runes و Bits UIانگولار با signals و Angular CDK

کد، دستور نصب و مرجع API این صفحه با فریم‌ورک انتخابی عوض می‌شود.

پیش‌نمایش با نسخهٔ ری‌اکت رندر شده است؛ پورت Vue دقیقاً همین کلاس‌های Tailwind را دارد، پس خروجی بصری یکسان است.

پیش‌نمایش با نسخهٔ ری‌اکت رندر شده است؛ پورت Svelte دقیقاً همین کلاس‌های Tailwind را دارد، پس خروجی بصری یکسان است.

پیش‌نمایش با نسخهٔ ری‌اکت رندر شده است؛ پورت Angular دقیقاً همین کلاس‌های Tailwind را دارد، پس خروجی بصری یکسان است.

نصب

با CLI اختصاصی dig-ui کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگی‌ها و فایل‌ها خودکار اضافه می‌شوند.

نصب سریع با لینک سخت و دیسک مشترکپکیج‌منیجر پیش‌فرض Node.jsYarn نسخهٔ ۲ به بالا (Berry)رانتایم و پکیج‌منیجر Bun
pnpm dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/button.json
npx dig-ui@latest add https://design-system-tau-green.vercel.app/r/button.json
yarn dlx dig-ui@latest add https://design-system-tau-green.vercel.app/r/button.json
bunx --bun dig-ui@latest add https://design-system-tau-green.vercel.app/r/button.json

Vue هنوز CLI اختصاصی دیگ ندارد. فایل رجیستری برای ابزارهای خودتان در دسترس است، ولی برای نصب از تب «دستی» استفاده کنید.

curl -O https://design-system-tau-green.vercel.app/r/vue/button.json

Svelte هنوز CLI اختصاصی دیگ ندارد. فایل رجیستری برای ابزارهای خودتان در دسترس است، ولی برای نصب از تب «دستی» استفاده کنید.

curl -O https://design-system-tau-green.vercel.app/r/svelte/button.json

Angular هنوز CLI اختصاصی دیگ ندارد. فایل رجیستری برای ابزارهای خودتان در دسترس است، ولی برای نصب از تب «دستی» استفاده کنید.

curl -O https://design-system-tau-green.vercel.app/r/angular/button.json

استفاده

import { Button } from "@/components/ui/button"

<Button variant="outline" size="lg">دکمه</Button>
<script setup lang="ts">
import Button from "@/components/ui/Button.vue"
</script>

<template>
  <Button variant="outline" size="lg">دکمه</Button>
</template>
<script lang="ts">
  import Button from "$lib/components/ui/button.svelte";
</script>

<Button variant="outline" size="lg">دکمه</Button>
import { Component } from "@angular/core"
import { DigButton } from "@/components/ui/button"

@Component({
  selector: "app-demo",
  standalone: true,
  imports: [DigButton],
  template: `<button digButton variant="outline" size="lg">دکمه</button>`,
})
export class DemoComponent {}

ترکیب اجزا

در هر چهار فریم‌ورک، کلاس‌های Tailwind و توکن‌های رنگ کاملاً یکسان‌اند؛ فقط شیوهٔ اتصال فرق می‌کند.

  • ری‌اکت و ویو از یک کامپوننت با پراپ asChild/as استفاده می‌کنند.
  • اسولت با دادن href به‌جای button یک anchor می‌سازد.
  • انگولار به‌جای کامپوننت یک دایرکتیو روی تگ بومی می‌گذارد تا فرم‌ها و رویدادها دست‌نخورده بمانند.

رنگ هم با دو متغیر CSS منتقل می‌شود (--btn و --btn-foreground)، پس محور رنگ و محور حالت مستقل از هم می‌مانند و افزودن یک رنگ تازه فقط یک سطر است.

تنها تفاوت رفتاری در انگولار است: چون دایرکتیو نباید ویژگی disabled تگ میزبان را بازنویسی کند، loading آنجا به‌جای disabled از aria-disabled و متوقف‌کردن کلیک استفاده می‌کند.

دسترس‌پذیری

  • از عنصر بومی button استفاده می‌کند؛ با Enter و Space فعال می‌شود و حلقهٔ فوکوس مرئی دارد.
  • برای دکمه‌های فقط آیکونی حتماً aria-label بنویسید.
  • پراپ loading خودش aria-busy و غیرفعال‌سازی را انجام می‌دهد؛ متن دکمه را هم عوض کنید تا صفحه‌خوان بفهمد چه چیزی در حال انجام است.
  • رنگ‌های success و warning در تم روشن یک پله تیره‌اند تا هم زیر متن سفید و هم روی زمینهٔ روشن از AA رد شوند؛ در حالت‌های نرم مثل flat کنتراست حدود ۴ است، پس برای متن‌های ریز از حالت‌های توپر استفاده کنید.
  • وقتی دکمه در واقع لینک است (asChild در ری‌اکت، as-child در ویو، href در اسولت، یا سلکتور a[digButton] در انگولار) نقش واقعی link حفظ می‌شود؛ رفتار صفحه‌کلید لینک است نه دکمه.

مرجع API

Button

تمام ویژگی‌های استاندارد button نیز پشتیبانی می‌شود (onClick، type، disabled و…).

ویژگینوعپیش‌فرضتوضیح
variant"default" | "secondary" | "destructive" | "outline" | "bordered" | "ghost" | "flat" | "faded" | "shadow" | "link""default"حالت بصری دکمه.
size"default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg""default"اندازهٔ دکمه؛ سه اندازهٔ icon برای دکمهٔ مربعی فقط آیکونی.
color"default" | "primary" | "success" | "warning" | "destructive""default"رنگ معنایی، مستقل از حالت. default یعنی همان ظاهر خنثای دیگ.
radius"none" | "sm" | "md" | "lg" | "full"شعاع گوشه؛ اگر ندهید شعاع پیش‌فرض اندازه به‌کار می‌رود.
fullWidthbooleanfalseدکمه تمام عرض ظرفش را می‌گیرد.
loadingbooleanfalseاسپینر نشان می‌دهد، دکمه را غیرفعال می‌کند و aria-busy می‌گذارد.
asChildbooleanfalseبه‌جای رندر تگ button، استایل‌ها را روی فرزند مستقیم اعمال می‌کند (مناسب Link).

buttonVariants

تابع cva برای گرفتن کلاس‌های دکمه بدون رندر کامپوننت؛ مثلاً برای استایل‌دادن به یک لینک ساده.

ویژگینوعپیش‌فرضتوضیح
buttonVariants({ variant, color, size, radius, className })(options?) => stringرشتهٔ کلاس نهایی را برمی‌گرداند: className={buttonVariants({ variant: "outline" })}

Button.vue

روی Primitive از Reka UI سوار است، پس همهٔ ویژگی‌های تگ مقصد به‌صورت fallthrough منتقل می‌شوند.

ویژگینوعپیش‌فرضتوضیح
variant"default" | "secondary" | "destructive" | "outline" | "bordered" | "ghost" | "flat" | "faded" | "shadow" | "link""default"حالت بصری دکمه.
size"default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg""default"اندازهٔ دکمه؛ سه اندازهٔ icon برای دکمهٔ مربعی فقط آیکونی.
color"default" | "primary" | "success" | "warning" | "destructive""default"رنگ معنایی، مستقل از حالت. default یعنی همان ظاهر خنثای دیگ.
radius"none" | "sm" | "md" | "lg" | "full"شعاع گوشه؛ اگر ندهید شعاع پیش‌فرض اندازه به‌کار می‌رود.
full-widthbooleanfalseدکمه تمام عرض ظرفش را می‌گیرد (نام پراپ در اسکریپت fullWidth است).
loadingbooleanfalseاسپینر نشان می‌دهد، دکمه را غیرفعال می‌کند و aria-busy می‌گذارد.
asstring | Component"button"تگ یا کامپوننتی که رندر می‌شود؛ مثلاً as="a" برای لینک.
as-childbooleanfalseمعادل asChild در ری‌اکت: استایل‌ها روی فرزند اسلات می‌نشینند (مناسب RouterLink).
classHTMLAttributes['class']با cn ادغام می‌شود، پس کلاس‌های شما بر واریانت اولویت دارند.

buttonVariants

از همان فایل SFC اکسپورت می‌شود (بلوک script بدون setup).

ویژگینوعپیش‌فرضتوضیح
buttonVariants({ variant, color, size, radius, fullWidth })(options?) => stringimport { buttonVariants } from "@/components/ui/Button.vue"

button.svelte

با runes نوشته شده (Svelte 5). بقیهٔ ویژگی‌ها با restProps به تگ منتقل می‌شوند.

ویژگینوعپیش‌فرضتوضیح
variant"default" | "secondary" | "destructive" | "outline" | "bordered" | "ghost" | "flat" | "faded" | "shadow" | "link""default"حالت بصری دکمه.
size"default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg""default"اندازهٔ دکمه؛ سه اندازهٔ icon برای دکمهٔ مربعی فقط آیکونی.
color"default" | "primary" | "success" | "warning" | "destructive""default"رنگ معنایی، مستقل از حالت. default یعنی همان ظاهر خنثای دیگ.
radius"none" | "sm" | "md" | "lg" | "full"شعاع گوشه؛ اگر ندهید شعاع پیش‌فرض اندازه به‌کار می‌رود.
fullWidthbooleanfalseدکمه تمام عرض ظرفش را می‌گیرد.
loadingbooleanfalseاسپینر نشان می‌دهد، دکمه را غیرفعال می‌کند و aria-busy می‌گذارد.
hrefstring | undefinedاگر بدهید، به‌جای button یک a رندر می‌شود، جایگزین اسولتیِ asChild.
refHTMLElement | nullnullقابل bind است: bind:ref={node} برای دسترسی به عنصر واقعی.
classstringبا cn ادغام می‌شود و بر واریانت اولویت دارد.

buttonVariants

از بلوک <script module> اکسپورت می‌شود.

ویژگینوعپیش‌فرضتوضیح
buttonVariants({ variant, color, size, radius, fullWidth })(options?) => stringimport { buttonVariants } from "$lib/components/ui/button.svelte"

DigButton

دایرکتیو standalone با سلکتور button[digButton], a[digButton]. چون تگ بومی حفظ می‌شود، type، form، (click) و رفتار صفحه‌کلید همان چیزی است که مرورگر می‌دهد.

ویژگینوعپیش‌فرضتوضیح
variant"default" | "secondary" | "destructive" | "outline" | "bordered" | "ghost" | "flat" | "faded" | "shadow" | "link""default"حالت بصری دکمه (signal input).
size"default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-lg""default"اندازهٔ دکمه؛ سه اندازهٔ icon برای دکمهٔ مربعی فقط آیکونی.
color"default" | "primary" | "success" | "warning" | "destructive""default"رنگ معنایی، مستقل از حالت (signal input). default یعنی همان ظاهر خنثای دیگ.
radius"none" | "sm" | "md" | "lg" | "full"شعاع گوشه؛ اگر ندهید شعاع پیش‌فرض اندازه به‌کار می‌رود.
fullWidthbooleanfalseدکمه تمام عرض ظرفش را می‌گیرد؛ با booleanAttribute، پس fullWidth تنها هم کافی است.
loadingbooleanfalseاسپینر نشان می‌دهد، disabled و aria-busy را روی تگ بومی می‌گذارد.
classstring""کلاس‌های شما با cn به کلاس‌های واریانت اضافه و در تعارض‌ها برنده می‌شوند.

buttonVariants

برای وقتی که می‌خواهید کلاس‌ها را بدون دایرکتیو بگیرید.

ویژگینوعپیش‌فرضتوضیح
buttonVariants({ variant, color, size, radius, fullWidth })(options?) => stringimport { buttonVariants } from "@/components/ui/button"