Toolbar

Displays a toolbar for user interaction.

toolbar-demo.tsx
"use client"
 
import { GlobeIcon, LightbulbIcon, SparklesIcon } from "lucide-react"
 
import { Button } from "@/components/ui/button"
import {
	Popover,
	PopoverClose,
	PopoverContent,
	PopoverDescription,
	PopoverFooter,
	PopoverHeader,
	PopoverTitle,
	PopoverTrigger,
} from "@/components/ui/popover"
import {
	Select,
	SelectContent,
	SelectItem,
	SelectTrigger,
	SelectValue,
} from "@/components/ui/select"
import { Textarea } from "@/components/ui/textarea"
import { Toggle } from "@/components/ui/toggle"
import { ToggleGroup } from "@/components/ui/toggle-group"
import {
	Toolbar,
	ToolbarButton,
	ToolbarSeparator,
} from "@/components/ui/toolbar"
 
export function ToolbarDemo() {
	return (
		<Toolbar>
			<ToggleGroup className="border-none bg-transparent p-0" toggleMultiple>
				<ToolbarButton
					size="icon"
					render={
						<Toggle
							className="data-[pressed]:bg-green-950 data-[pressed]:text-green-200"
							aria-label="Show AI thinking"
							value="ai-thinking"
						>
							<LightbulbIcon className="size-4" />
						</Toggle>
					}
				/>
				<ToolbarButton
					size="icon"
					render={
						<Toggle
							className="data-[pressed]:bg-blue-950 data-[pressed]:text-blue-200"
							aria-label="Use web search"
							value="web-search"
						>
							<GlobeIcon className="size-4" />
						</Toggle>
					}
				/>
			</ToggleGroup>
 
			<ToolbarSeparator />
 
			<Select defaultValue="grok-3">
				<ToolbarButton
					className="w-40 justify-between border-none md:w-52"
					render={
						<SelectTrigger>
							<SelectValue
								className="max-w-24 truncate md:max-w-40"
								placeholder="Select a model"
							/>
						</SelectTrigger>
					}
				/>
				<SelectContent className="w-52">
					<SelectItem value="claude-3.7-sonnet">claude-3.7-sonnet</SelectItem>
					<SelectItem value="claude-3.5-sonnet">claude-3.5-sonnet</SelectItem>
					<SelectItem value="gpt-4o">gpt-4o</SelectItem>
					<SelectItem value="o3-mini">o3-mini</SelectItem>
					<SelectItem value="grok-3">grok-3</SelectItem>
				</SelectContent>
			</Select>
 
			<ToolbarSeparator />
 
			<Popover>
				<ToolbarButton
					size="icon"
					render={<PopoverTrigger />}
					aria-label="Edit prompt"
				>
					<SparklesIcon className="size-4 shrink-0" />
				</ToolbarButton>
				<PopoverContent className="w-80">
					<PopoverHeader>
						<PopoverTitle>Edit Prompt Template</PopoverTitle>
						<PopoverDescription>
							Customize the system prompt used for AI generation
						</PopoverDescription>
					</PopoverHeader>
					<div className="my-2">
						<Textarea
							className="min-h-32 resize-none"
							defaultValue="You are a helpful AI assistant. Your task is to help the user with their writing needs. Be concise, accurate, and helpful."
						/>
					</div>
					<PopoverFooter>
						<PopoverClose
							render={<Button variant="outline">Save Prompt</Button>}
						/>
					</PopoverFooter>
				</PopoverContent>
			</Popover>
		</Toolbar>
	)
}

Installation

npx shadcn@latest add https://9ui.dev/r/toolbar.json

Usage

Imports
import {
	Toolbar,
	ToolbarButton,
	ToolbarGroup,
	ToolbarInput,
	ToolbarLink,
	ToolbarSeparator,
} from "@/components/ui/toolbar"
Anatomy
<Toolbar>
  <ToolbarButton />
  <ToolbarLink />
  <ToolbarSeparator />
  <ToolbarGroup>
    <ToolbarButton />
    <ToolbarButton />
  <ToolbarGroup />
  <ToolbarInput />
</Toolbar>

Examples

File Explorer

toolbar-file-explorer.tsx
"use client"
 
import {
	LayoutGridIcon,
	LayoutListIcon,
	MoreHorizontalIcon,
	SearchIcon,
	ShareIcon,
} from "lucide-react"
 
import {
	Dropdown,
	DropdownContent,
	DropdownItem,
	DropdownSeparator,
	DropdownTrigger,
} from "@/components/ui/dropdown"
import { Input, InputIcon } from "@/components/ui/input"
import { Toggle } from "@/components/ui/toggle"
import { ToggleGroup } from "@/components/ui/toggle-group"
import {
	Toolbar,
	ToolbarButton,
	ToolbarGroup,
	ToolbarInput,
	ToolbarSeparator,
} from "@/components/ui/toolbar"
 
export function ToolbarFileExplorerDemo() {
	return (
		<Toolbar>
			<ToggleGroup className="border-none bg-transparent p-0">
				<ToolbarButton
					size="icon"
					render={
						<Toggle aria-label="Grid view" value="grid-view">
							<LayoutGridIcon className="size-4" />
						</Toggle>
					}
				/>
				<ToolbarButton
					size="icon"
					render={
						<Toggle aria-label="List view" value="list-view">
							<LayoutListIcon className="size-4" />
						</Toggle>
					}
				/>
			</ToggleGroup>
 
			<ToolbarSeparator />
 
			<ToolbarGroup>
				<ToolbarButton size="icon">
					<ShareIcon className="size-4" />
				</ToolbarButton>
				<Dropdown>
					<ToolbarButton size="icon" render={<DropdownTrigger />}>
						<MoreHorizontalIcon className="size-4" />
					</ToolbarButton>
					<DropdownContent>
						<DropdownItem>New File</DropdownItem>
						<DropdownItem>New Folder</DropdownItem>
						<DropdownSeparator />
						<DropdownItem>Open in New Tab</DropdownItem>
						<DropdownItem>Get Info</DropdownItem>
					</DropdownContent>
				</Dropdown>
			</ToolbarGroup>
			<ToolbarSeparator />
 
			<ToolbarInput
				render={
					<Input placeholder="Search">
						<InputIcon side="leading">
							<SearchIcon className="size-4" />
						</InputIcon>
					</Input>
				}
			/>
		</Toolbar>
	)
}