Toggle Group
จาก shadcnกลุ่มปุ่มสลับที่เลือกได้หลายค่าพร้อมกัน เช่น เลือกคอลัมน์ที่จะแสดงในตาราง หรือโหมดมุมมองหลายค่า
แสดง: ตาราง
ติดตั้ง
Terminal
pnpm dlx shadcn@latest add @whereui/toggle-groupต้องผูก registry และติดตั้ง @whereui/theme นำหน้าเสมอเมื่อติดตั้งครั้งแรก
การใช้งาน
import * as React from "react"import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"const [view, setView] = React.useState<string[]>(["ตาราง"])<ToggleGroup variant="outline" value={view} onValueChange={setView}> <ToggleGroupItem value="ตาราง">ตาราง</ToggleGroupItem> <ToggleGroupItem value="การ์ด">การ์ด</ToggleGroupItem></ToggleGroup>ตัวอย่างเพิ่มเติม
ปุ่มเรียงชิดกัน (spacing 0)
ข้อควรรู้
- value เป็น array เสมอ เพราะเลือกได้หลายค่า — onValueChange จะส่ง array ใหม่กลับมา
- spacing ค่าเริ่มต้นเป็นระยะห่างระหว่างปุ่ม ตั้งเป็น 0 จะได้ปุ่มติดกันเป็นแท่งเดียว
- สืบทอด variant และ size ลงไปยังทุก ToggleGroupItem ในกลุ่มอัตโนมัติ
ซอร์สโค้ด
components/ui/toggle-group.tsx
"use client"import * as React from "react"import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group"import { type VariantProps } from "class-variance-authority"import { cn } from "cn"import { toggleVariants } from "@/components/ui/toggle"const ToggleGroupContext = React.createContext< VariantProps<typeof toggleVariants> & { spacing?: number orientation?: "horizontal" | "vertical" }>({ size: "default", variant: "default", spacing: 2, orientation: "horizontal",})function ToggleGroup({ className, variant, size, spacing = 2, orientation = "horizontal", children, ...props}: ToggleGroupPrimitive.Props & VariantProps<typeof toggleVariants> & { spacing?: number orientation?: "horizontal" | "vertical" }) { return ( <ToggleGroupPrimitive data-slot="toggle-group" data-variant={variant} data-size={size} data-spacing={spacing} data-orientation={orientation} style={{ "--gap": spacing } as React.CSSProperties} className={cn( "group/toggle-group flex w-fit flex-row items-center gap-[--spacing(var(--gap))] rounded-lg data-[size=sm]:rounded-[min(var(--radius-md),10px)] data-vertical:flex-col data-vertical:items-stretch", className )} {...props} > <ToggleGroupContext.Provider value={{ variant, size, spacing, orientation }} > {children} </ToggleGroupContext.Provider> </ToggleGroupPrimitive> )}function ToggleGroupItem({ className, children, variant = "default", size = "default", ...props}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) { const context = React.useContext(ToggleGroupContext) return ( <TogglePrimitive data-slot="toggle-group-item" data-variant={context.variant || variant} data-size={context.size || size} data-spacing={context.spacing} className={cn( "shrink-0 group-data-[spacing=0]/toggle-group:rounded-none group-data-[spacing=0]/toggle-group:px-2 focus:z-10 focus-visible:z-10 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-end]:pr-1.5 group-data-[spacing=0]/toggle-group:has-data-[icon=inline-start]:pl-1.5 group-data-horizontal/toggle-group:data-[spacing=0]:first:rounded-l-lg group-data-vertical/toggle-group:data-[spacing=0]:first:rounded-t-lg group-data-horizontal/toggle-group:data-[spacing=0]:last:rounded-r-lg group-data-vertical/toggle-group:data-[spacing=0]:last:rounded-b-lg group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:border-l-0 group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:border-t-0 group-data-horizontal/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-l group-data-vertical/toggle-group:data-[spacing=0]:data-[variant=outline]:first:border-t", toggleVariants({ variant: context.variant || variant, size: context.size || size, }), className )} {...props} > {children} </TogglePrimitive> )}export { ToggleGroup, ToggleGroupItem }