Toolbar (Tailwind)

PreviousNext

A toolbar component for grouping action buttons and controls.

Docs
roiuiitem

Preview

Loading preview…
registry/brook/tailwind/ui/toolbar.tsx
"use client";

import { Toolbar } from "@base-ui/react/toolbar";
import { cn } from "@/lib/utils";

function ToolbarRoot({ className, orientation = "horizontal", ...props }: Toolbar.Root.Props) {
  return (
    <Toolbar.Root
      className={cn(
        "flex items-center gap-1 rounded-[var(--radius)] bg-[var(--mix-card-33-bg)]",
        "border-[0.5px] border-[oklch(from_var(--border)_l_c_h_/_0.9)]",
        orientation === "vertical" && "flex-col items-stretch",
        className
      )}
      data-slot="toolbar-root"
      orientation={orientation}
      {...props}
    />
  );
}

function ToolbarButton({ className, ...props }: Toolbar.Button.Props) {
  return (
    <Toolbar.Button
      className={cn(
        "inline-flex items-center justify-center gap-2 px-3 py-1.5",
        "rounded-[calc(var(--radius)-2px)] border-none bg-transparent",
        "cursor-pointer font-medium text-foreground text-sm",
        "min-h-8 min-w-8 transition-all duration-200",
        "hover:bg-accent hover:text-accent-foreground",
        "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2",
        "disabled:cursor-not-allowed disabled:opacity-50",
        "data-[state=pressed]:bg-accent data-[state=pressed]:text-accent-foreground",
        "max-sm:min-h-10 max-sm:min-w-10 max-sm:px-4 max-sm:py-2 max-sm:text-[0.9375rem]",
        className
      )}
      data-slot="toolbar-button"
      {...props}
    />
  );
}

function ToolbarLink({ className, ...props }: Toolbar.Link.Props) {
  return (
    <Toolbar.Link
      className={cn(
        "inline-flex items-center justify-center gap-2 px-3 py-1.5",
        "rounded-[calc(var(--radius)-2px)] text-foreground no-underline",
        "h-8 min-w-8 font-medium text-sm leading-none transition-all duration-200",
        "hover:bg-accent hover:text-accent-foreground",
        "focus-visible:outline-2 focus-visible:outline-ring focus-visible:outline-offset-2",
        "max-sm:h-10 max-sm:min-w-10 max-sm:px-4 max-sm:py-2 max-sm:text-[0.9375rem]",
        className
      )}
      data-slot="toolbar-link"
      {...props}
    />
  );
}

function ToolbarInput({ className, ...props }: Toolbar.Input.Props) {
  return (
    <Toolbar.Input
      className={cn(
        "flex-1 rounded-[calc(var(--radius)-2px)] px-3 py-1.5",
        "min-h-8 border border-border bg-input text-foreground text-sm",
        "transition-all duration-200",
        "focus:border-transparent focus:outline-2 focus:outline-ring focus:outline-offset-2",
        "placeholder:text-muted-foreground",
        "max-sm:min-h-10 max-sm:px-4 max-sm:py-2 max-sm:text-[0.9375rem]",
        className
      )}
      data-slot="toolbar-input"
      {...props}
    />
  );
}

function ToolbarGroup({ className, ...props }: Toolbar.Group.Props) {
  return (
    <Toolbar.Group
      className={cn(
        "flex items-center gap-0.5 p-0.5",
        "rounded-[calc(var(--radius)-2px)] bg-muted",
        "max-sm:gap-0.75 max-sm:p-0.75",
        className
      )}
      data-slot="toolbar-group"
      {...props}
    />
  );
}

function ToolbarSeparator({ className, ...props }: Toolbar.Separator.Props) {
  return (
    <Toolbar.Separator
      className={cn("mx-1 h-6 w-px flex-shrink-0 bg-border", "max-sm:h-7", className)}
      data-slot="toolbar-separator"
      {...props}
    />
  );
}

export { ToolbarRoot as Toolbar, ToolbarButton, ToolbarGroup, ToolbarInput, ToolbarLink, ToolbarSeparator };

Installation

npx shadcn@latest add @roiui/toolbar-tailwind

Usage

import { ToolbarTailwind } from "@/components/toolbar-tailwind"
<ToolbarTailwind />