Skip to content
GitHub

Wheel List

Wheel List Selection menu

  • POKÉDEX
  • POKÉMON
  • ITEM
  • TRAINER
  • SAVE
  • OPTION
  • EXIT

Selected ITEM

import Emojis from "@/components/icons/pxl/dotto-emoji";
import { WheelList, WheelOption } from "@/components/ui/pxl/wheel-list";
export default function WheelListPreview() {
return (
<div className="h-48 w-full max-w-md">
<WheelList
defaultValue="ITEM"
onChange={(evt) =>
console.log(evt.settled ? `selected ${evt.value}` : "coasting")
}
onSelect={(value) => console.log(value)}
>
<WheelOption key="POKÉDEX" value="POKÉDEX">
<Emojis.Robot shapeRendering="crisp-edges" className="size-4 mr-1" />
POKÉDEX
</WheelOption>
<WheelOption key="POKÉMON" value="POKÉMON">
<Emojis.GrinningCat shapeRendering="crisp-edges" className="size-4 mr-1" />
POKÉMON
</WheelOption>
<WheelOption key="ITEM" value="ITEM">
<Emojis.PileOfPoo shapeRendering="crisp-edges" className="size-4 mr-1" />
ITEM
</WheelOption>
<WheelOption key="TRAINER" value="TRAINER">
<Emojis.CowboyHatFace shapeRendering="crisp-edges" className="size-4 mr-1" />
TRAINER
</WheelOption>
<WheelOption key="SAVE" value="SAVE">
<Emojis.ThoughtBalloon shapeRendering="crisp-edges" className="size-4 mr-1" />
SAVE
</WheelOption>
<WheelOption key="OPTION" value="OPTION">
<Emojis.AngerSymbol shapeRendering="crisp-edges" className="size-4 mr-1" />
OPTION
</WheelOption>
<WheelOption key="EXIT" value="EXIT">
<Emojis.DashingAway shapeRendering="crisp-edges" className="size-4 mr-1" />
EXIT
</WheelOption>
</WheelList>
</div>
);
}
pnpm dlx shadcn@latest add pxl-ui/registry/wheel-list
import {
WheelList,
WheelOption,
} from "@/components/ui/pxl/wheel-list"
const items = [
{ label: "Light", value: "light" },
{ label: "Dark", value: "dark" },
{ label: "System", value: "system" },
];
<WheelList>
{items.map((item) => (
<WheelOption key={item.value} value={item.value}>
{item.label}
</WheelOption>
))}
</WheelList>

Use the following composition to build a WheelList:

WheelList
└── WheelOption

Wrap the component inside a Card to display framed menus.

Menu
Ash Ketchum
  • POKÉDEX
  • POKÉMON
  • ITEM
  • TRAINER
  • SAVE
  • OPTION
  • EXIT

Selected ITEM

import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from "@/components/ui/pxl/card";
import { WheelList, WheelOption } from "@/components/ui/pxl/wheel-list";
import { WidgetArea } from "@/components/ui/pxl/widget-area";
const ITEMS: string[] = [
"POKÉDEX",
"POKÉMON",
"ITEM",
"TRAINER",
"SAVE",
"OPTION",
"EXIT",
];
export default function InCardPreview() {
return (
<WidgetArea size="sm">
<Card size="lg" className="size-full">
<CardHeader>
<CardTitle>Menu</CardTitle>
<CardDescription>Ash Ketchum</CardDescription>
</CardHeader>
<CardContent>
<WheelList
align="start"
visibleCount={3}
defaultValue="ITEM"
onChange={(evt) =>
console.log(evt.settled ? `selected ${evt.value}` : "coasting")
}
onSelect={(value) => console.log(value)}
>
{ITEMS.map((i) => (
<WheelOption key={i} value={i}>
{i}
</WheelOption>
))}
</WheelList>
</CardContent>
</Card>
</WidgetArea>
);
}

Use the CountryFlag component for visual language selection.

  • SpainEspañol
  • PortugalPortuguês
  • FranceFrançais
  • ItalyItaliano
  • GermanyDeutsch
  • United KingdomEnglish
  • RussiaРусский
  • Indiaहिन्दी
  • Bangladeshবাংলা
  • Saudi Arabiaالعربية
  • Japan日本語
  • South Korea한국어

Selected

import { CountryFlag } from "@/components/ui/pxl/country-flag";
import { WheelList, WheelOption } from "@/components/ui/pxl/wheel-list";
import { WidgetArea } from "@/components/ui/pxl/widget-area";
const items = [
{ label: "Español", iso31661: "ES", value: "es" },
{ label: "Português", iso31661: "PT", value: "pt" },
{ label: "Français", iso31661: "FR", value: "fr" },
{ label: "Italiano", iso31661: "IT", value: "it" },
{ label: "Deutsch", iso31661: "DE", value: "de" },
{ label: "English", iso31661: "GB", value: "gb" },
{ label: "Русский", iso31661: "RU", value: "ru" },
{ label: "हिन्दी", iso31661: "IN", value: "hi" },
{ label: "বাংলা", iso31661: "BD", value: "bn" },
{ label: "العربية", iso31661: "SA", value: "ar" },
{ label: "日本語", iso31661: "JP", value: "jp" },
{ label: "한국어", iso31661: "KR", value: "kr" },
];
export default function LanguageSelect() {
return (
<WidgetArea size="sm">
<WheelList align="start" visibleCount={5} defaultValue="ES">
{items.map((item) => (
<WheelOption key={item.value} value={item.value}>
<CountryFlag code={item.iso31661} />
{item.label}
</WheelOption>
))}
</WheelList>
</WidgetArea>
);
}