1import {2 RadioGroup,3 RadioGroupItem,4 RadioGroupItemLabel,5} from "~/components/ui/radio-group";6
7export default function RadioGroupDemo() {8 return (9 <RadioGroup defaultValue="comfortable">10 <RadioGroupItem value="default" id="r1">11 <RadioGroupItemLabel>Default</RadioGroupItemLabel>12 </RadioGroupItem>13 <RadioGroupItem value="comfortable" id="r2">14 <RadioGroupItemLabel>Comfortable</RadioGroupItemLabel>15 </RadioGroupItem>16 <RadioGroupItem value="compact" id="r3">17 <RadioGroupItemLabel>Compact</RadioGroupItemLabel>18 </RadioGroupItem>19 </RadioGroup>20 );21}
npx shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/radio-group.json
yarn shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/radio-group.json
pnpm dlx shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/radio-group.json
bunx --bun shadcn@latest add https://solid-ui-neobrutalism.vercel.app/r/radio-group.json
Install the following dependencies
npm install @kobalte/core
yarn add @kobalte/core
pnpm add @kobalte/core
bun add @kobalte/core
Copy and paste the following code into your project
1import type { PolymorphicProps } from "@kobalte/core/polymorphic";2import type { JSX, ValidComponent } from "solid-js";3
4import { splitProps } from "solid-js";5import * as RadioGroupPrimitive from "@kobalte/core/radio-group";6import CircleIcon from "lucide-solid/icons/circle";7
8import { cn } from "~/lib/utils";9
10type RadioGroupRootProps<T extends ValidComponent = "div"> =11 RadioGroupPrimitive.RadioGroupRootProps<T> & { class?: string | undefined };12
13const RadioGroup = <T extends ValidComponent = "div">(14 props: PolymorphicProps<T, RadioGroupRootProps<T>>,15) => {16 const [local, others] = splitProps(props as RadioGroupRootProps, ["class"]);17 return (18 <RadioGroupPrimitive.Root19 data-slot="radio-group"20 class={cn("grid gap-2", local.class)}21 {...others}22 />23 );24};25
26type RadioGroupItemProps<T extends ValidComponent = "div"> =27 RadioGroupPrimitive.RadioGroupItemProps<T> & {28 class?: string | undefined;29 children?: JSX.Element;30 };31
32const RadioGroupItem = <T extends ValidComponent = "div">(33 props: PolymorphicProps<T, RadioGroupItemProps<T>>,34) => {35 const [local, others] = splitProps(props as RadioGroupItemProps, [36 "class",37 "children",38 ]);39 return (40 <RadioGroupPrimitive.Item41 data-slot="radio-group-item"42 class={cn("flex items-center space-x-2", local.class)}43 {...others}44 >45 <RadioGroupPrimitive.ItemInput data-slot="radio-group-input" />46 <RadioGroupPrimitive.ItemControl47 data-slot="radio-group-control"48 class="aspect-square size-4 rounded-full border ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 ui-checked:text-primary"49 >50 <RadioGroupPrimitive.ItemIndicator class="flex h-full items-center justify-center">51 <CircleIcon class="size-2.5 fill-current text-current" />52 </RadioGroupPrimitive.ItemIndicator>53 </RadioGroupPrimitive.ItemControl>54 {local.children}55 </RadioGroupPrimitive.Item>56 );57};58
59type RadioGroupLabelProps<T extends ValidComponent = "label"> =60 RadioGroupPrimitive.RadioGroupLabelProps<T> & {61 class?: string | undefined;62 };63
64const RadioGroupItemLabel = <T extends ValidComponent = "label">(65 props: PolymorphicProps<T, RadioGroupLabelProps<T>>,66) => {67 const [local, others] = splitProps(props as RadioGroupLabelProps, ["class"]);68 return (69 <RadioGroupPrimitive.ItemLabel70 data-slot="radio-group-item-label"71 class={cn(72 "text-sm leading-none font-medium peer-disabled:cursor-not-allowed peer-disabled:opacity-70",73 local.class,74 )}75 {...others}76 />77 );78};79
80export { RadioGroup, RadioGroupItem, RadioGroupItemLabel };
Update the import paths to match your project setup.
1import {2 RadioGroup,3 RadioGroupItem,4 RadioGroupItemLabel,5} from "~/components/ui/radio-group";
1<RadioGroup>2 <RadioGroupItem value="option1">3 <RadioGroupItemLabel>Option 1</RadioGroupItemLabel>4 </RadioGroupItem>5 <RadioGroupItem value="option2">6 <RadioGroupItemLabel>Option 2</RadioGroupItemLabel>7 </RadioGroupItem>8 <RadioGroupItem value="option3">9 <RadioGroupItemLabel>Option 3</RadioGroupItemLabel>10 </RadioGroupItem>11</RadioGroup>