Keyboard key and shortcut display built on the semantic <kbd> element, in three sizes, with KbdGroup for combinations like ⌘ ⇧ K. Adapts inside tooltips.
Press ⌘K to search
import { Kbd, KbdGroup } from "@/components/ballmac/kbd"
export default function KbdDemo() {
return (
<div className="flex flex-col items-center gap-4 text-sm text-muted-foreground">
<p>
Press{" "}
<KbdGroup aria-label="Command K">
<Kbd>⌘</Kbd>
<Kbd>K</Kbd>
</KbdGroup>{" "}
to search
</p>
<div className="flex flex-wrap items-center justify-center gap-3">
<KbdGroup aria-label="Command Shift P">
<Kbd size="lg">⌘</Kbd>
<Kbd size="lg">⇧</Kbd>
<Kbd size="lg">P</Kbd>
</KbdGroup>
<Kbd>Ctrl</Kbd>
<Kbd>Esc</Kbd>
<Kbd size="sm">↵</Kbd>
</div>
</div>
)
}Installation
$ pnpm dlx shadcn@latest add @ballmac/kbdInstall the dependencies.
$ pnpm add class-variance-authorityCopy the source into your project.
components/ballmac/kbd.tsx// Ballmac UI: Kbd. https://ui.ballmac.com/components/kbd import * as React from "react" import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const kbdVariants = cva( "pointer-events-none inline-flex w-fit shrink-0 select-none items-center justify-center gap-1 rounded-[5px] border border-border bg-muted font-sans font-medium text-muted-foreground shadow-[inset_0_-1px_0_0_var(--color-border)] [&_svg:not([class*='size-'])]:size-3 [[data-slot=tooltip-content]_&]:border-background/20 [[data-slot=tooltip-content]_&]:bg-background/15 [[data-slot=tooltip-content]_&]:text-background [[data-slot=tooltip-content]_&]:shadow-none", { variants: { size: { sm: "h-4 min-w-4 px-1 text-[10px]", default: "h-5 min-w-5 px-1 text-[11px]", lg: "h-6 min-w-6 px-1.5 text-xs", }, }, defaultVariants: { size: "default" }, } ) type KbdProps = React.ComponentProps<"kbd"> & VariantProps<typeof kbdVariants> function Kbd({ className, size = "default", ...props }: KbdProps) { return <kbd data-slot="kbd" dir="ltr" className={cn(kbdVariants({ size }), className)} {...props} /> } type KbdGroupProps = React.ComponentProps<"kbd"> /** * Groups keys that are pressed together. Renders a nested <kbd>, the HTML pattern for a key combination. */ function KbdGroup({ className, ...props }: KbdGroupProps) { return <kbd data-slot="kbd-group" dir="ltr" className={cn("inline-flex items-center gap-1 font-sans", className)} {...props} /> } export { Kbd, KbdGroup, kbdVariants, type KbdGroupProps, type KbdProps }Update the import paths to match your project setup.
Usage
import { Kbd, KbdGroup } from "@/components/ballmac/kbd"The full example is in the Code tab above.
API reference
| Prop | Type | Default |
|---|---|---|
size | "sm" | "default" | "lg" | "default" |
Also accepts the standard attributes of its root element.
Use with AI
Displays a key or shortcut. Use Kbd for each key and KbdGroup for keys pressed together; it restyles itself for the dark tooltip surface automatically. With the shadcn MCP server set up (guide), ask your agent:
Add the Ballmac UI Kbd (@ballmac/kbd) to this project with the shadcn MCP, then use it where it fits.
Use it for
- Shortcut hints in menus, tooltips and command palettes
- Documentation of keyboard controls
- Search inputs that show a ⌘ K hint
Not for
- Inline code or commands (use code)
- Buttons that trigger the shortcut (use button)
Registry JSON: https://ui.ballmac.com/r/kbd.json
Credits
Free to use in personal and commercial projects.
- Registry
- shadcn/utils
Pairs well with
Tooltip
A Radix tooltip with an arrow, side offset and fade and zoom transitions that opens on hover and keyboard focus. Works standalone or under a shared provider.
Button
A button with six variants, three sizes, a pill shape and a built-in loading state. buttonVariants() styles links the same way.
Input
A text input in three heights that match Button, plus InputGroup and InputGroupAddon for leading or trailing icons, units and domains.
Accordion
Vertically stacked disclosure sections on Radix Accordion, single or multiple open, with hairline dividers, a rotating plus and height animation.