An editorial guidance panel with a clear kind label, icon, title, and optional action.
import { Callout } from "@/components/ballmac/callout"
export default function CalloutDemo() {
return (
<Callout
className="w-full max-w-md"
title="Make the first view useful"
kind="tip"
action={
<a
href="#examples"
className="text-primary rounded-sm text-sm font-semibold underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50"
>
See layout examples →
</a>
}
>
Start with the information people check every day. Save advanced controls
for the details view.
</Callout>
)
}Installation
$ pnpm dlx shadcn@latest add @ballmac/calloutInstall the dependencies.
$ pnpm add lucide-reactCopy the source into your project.
components/ballmac/callout.tsx// Ballmac UI: Callout. https://ui.ballmac.com/components/callout import * as React from "react" import { Lightbulb, BookOpen, TriangleAlert } from "lucide-react" import { cn } from "@/lib/utils" type CalloutProps = Omit<React.ComponentProps<"aside">, "title"> & { /** Headline for the guidance. */ title: string /** Guidance type, represented by both icon and text. */ kind?: "tip" | "note" | "caution" /** Optional action link or button. */ action?: React.ReactNode } function Callout({ className, title, kind = "tip", action, children, ...props }: CalloutProps) { const Icon = kind === "tip" ? Lightbulb : kind === "caution" ? TriangleAlert : BookOpen return ( <aside data-slot="callout" aria-label={title} className={cn( "bg-card relative w-full min-w-0 overflow-hidden rounded-xl border border-border p-5 shadow-sm", className, )} {...props} > <span aria-hidden="true" className={cn( "absolute inset-y-0 start-0 w-1", kind === "tip" && "bg-primary", kind === "note" && "bg-chart-2", kind === "caution" && "bg-chart-3", )} /> <div className="flex items-start gap-3"> <span aria-hidden="true" className="bg-muted text-foreground flex size-9 shrink-0 items-center justify-center rounded-lg" > <Icon className="size-4" /> </span> <div className="min-w-0 flex-1"> <p className="text-muted-foreground text-xs font-medium uppercase tracking-wide"> {kind} </p> <h3 className="text-foreground mt-0.5 text-sm font-semibold"> {title} </h3> <div data-slot="callout-content" className="text-muted-foreground mt-1.5 text-sm leading-relaxed" > {children} </div> {action && ( <div data-slot="callout-action" className="mt-3"> {action} </div> )} </div> </div> </aside> ) } export { Callout, type CalloutProps }Update the import paths to match your project setup.
Usage
import { Callout } from "@/components/ballmac/callout"The full example is in the Code tab above.
Examples
States and variants
import { Callout } from "@/components/ballmac/callout"
export default function CalloutStates() {
return (
<div className="flex w-full max-w-md flex-col gap-3">
<Callout kind="note" title="About exports">
Exports include visible filters and date ranges.
</Callout>
<Callout kind="caution" title="Before you delete">
This action removes the workspace for every member.
</Callout>
</div>
)
}API reference
| Prop | Type | Default |
|---|---|---|
title*Headline for the guidance. | string | — |
kindGuidance type, represented by both icon and text. | "tip" | "note" | "caution" | "tip" |
actionOptional action link or button. | React.ReactNode | — |
Also accepts the standard attributes of its root element.
Accessibility
| Key | Action |
|---|---|
| Tab | Focus an optional action |
Use with AI
An editorial guidance panel with a clear kind label, icon, title, and optional action. With the shadcn MCP server set up (guide), ask your agent:
Add the Ballmac UI Callout (@ballmac/callout) to this project with the shadcn MCP, then use it where it fits.
Use it for
- Add contextual guidance to docs or settings
- Explain a recommended next step
Not for
- Use alert for urgent system feedback
Registry JSON: https://ui.ballmac.com/r/callout.json
Credits
Free to use in personal and commercial projects.
- npm
- lucide-react
- Registry
- shadcn/utils
Pairs well with
Alert
A semantic callout with five theme-aware tones, clear icon placement, an action row, and opt-in urgent announcements.
Button
A button with six variants, three sizes, a pill shape and a built-in loading state. buttonVariants() styles links the same way.
Alert Dialog
Focus-managed confirmation for consequential actions, with a clear cancel path, optional media, and a token-based destructive action.
Banner
A page-wide announcement with semantic tones, optional action, and controlled or local dismissal.