Empty
จาก shadcnสถานะว่างเปล่าเมื่อไม่มีข้อมูลแสดง พร้อมไอคอน คำอธิบาย และปุ่มชวนให้เริ่มการกระทำ เช่น ยังไม่มีคำขอกู้ในระบบ
ยังไม่มีคำขอกู้
เริ่มสร้างคำขอกู้ฉบับแรกของคุณ แล้วเลือกผู้อนุมัติ เช่น น้ำใจ หรือ ปี่
ติดตั้ง
Terminal
pnpm dlx shadcn@latest add @whereui/emptyต้องผูก registry และติดตั้ง @whereui/theme นำหน้าเสมอเมื่อติดตั้งครั้งแรก
การใช้งาน
import { FileQuestionIcon } from "lucide-react"import { Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle } from "@/components/ui/empty"<Empty> <EmptyHeader> <EmptyMedia variant="icon"><FileQuestionIcon /></EmptyMedia> <EmptyTitle>ยังไม่มีรายการ</EmptyTitle> <EmptyDescription>คำอธิบายสั้น ๆ</EmptyDescription> </EmptyHeader> <EmptyContent>{/* ปุ่มหรือลิงก์ */}</EmptyContent></Empty>ข้อควรรู้
- Empty ไม่มีกรอบเอง ถ้าต้องการกรอบเส้นประใส่ border border-dashed ที่ className เอง
- EmptyMedia ใส่ variant="icon" เพื่อให้ไอคอนมีพื้นหลังสี่เหลี่ยมมน
ซอร์สโค้ด
components/ui/empty.tsx
import { cva, type VariantProps } from "class-variance-authority"import { cn } from "cn"function Empty({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="empty" className={cn( "flex w-full min-w-0 flex-1 flex-col items-center justify-center gap-4 rounded-xl border-dashed p-6 text-center text-balance", className )} {...props} /> )}function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="empty-header" className={cn("flex max-w-sm flex-col items-center gap-2", className)} {...props} /> )}const emptyMediaVariants = cva( "mb-2 flex shrink-0 items-center justify-center [&_svg]:pointer-events-none [&_svg]:shrink-0", { variants: { variant: { default: "bg-transparent", icon: "flex size-8 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground [&_svg:not([class*='size-'])]:size-4", }, }, defaultVariants: { variant: "default", }, })function EmptyMedia({ className, variant = "default", ...props}: React.ComponentProps<"div"> & VariantProps<typeof emptyMediaVariants>) { return ( <div data-slot="empty-icon" data-variant={variant} className={cn(emptyMediaVariants({ variant, className }))} {...props} /> )}function EmptyTitle({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="empty-title" className={cn( "font-heading text-sm font-medium tracking-tight", className )} {...props} /> )}function EmptyDescription({ className, ...props }: React.ComponentProps<"p">) { return ( <div data-slot="empty-description" className={cn( "text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary", className )} {...props} /> )}function EmptyContent({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="empty-content" className={cn( "flex w-full max-w-sm min-w-0 flex-col items-center gap-2.5 text-sm text-balance", className )} {...props} /> )}export { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia,}