YaVendio Registry
Components

YA Tooltip Actions Menu

A floating actions menu component for compact toolbars with icons and labels

The YaTooltipActionsMenu component provides a floating toolbar for quick actions. It supports two display modes: icons-only for compact interfaces, and icons with labels for clearer actions.

Quick Start

pnpm dlx shadcn@latest add @yavendio/ya-tooltip-actions-menu
npx shadcn@latest add @yavendio/ya-tooltip-actions-menu
yarn dlx shadcn@latest add @yavendio/ya-tooltip-actions-menu
import { 
  YaTooltipActionsMenu, 
  YaTooltipActionItem 
} from '@/components/ui/ya-tooltip-actions-menu'
import { Check, Share2 } from 'lucide-react'

export default function Example() {
  return (
    <YaTooltipActionsMenu type="icons">
      <YaTooltipActionItem icon={<Check />} onClick={() => {}} />
      <YaTooltipActionItem icon={<Share2 />} onClick={() => {}} />
    </YaTooltipActionsMenu>
  )
}

Basic Usage

Display Types

YaTooltipActionsMenu supports two display modes:

Icons Only
Icons with Labels

Icons Only

Compact mode showing only icons. Best for space-constrained UIs.

CharacteristicValue
Action size24x24px
Gap between items4px
Hover stateOpacity transition
<YaTooltipActionsMenu type="icons">
  <YaTooltipActionItem icon={<Check />} active onClick={() => {}} />
  <YaTooltipActionItem icon={<Share2 />} onClick={() => {}} />
  <YaTooltipActionItem icon={<Copy />} onClick={() => {}} />
  <YaTooltipActionItem icon={<Bookmark />} onClick={() => {}} />
</YaTooltipActionsMenu>

Icons with Labels

Expanded mode showing icons with text labels.

CharacteristicValue
WidthAuto based on label
Gap between items8px
Label showsIcon purpose
<YaTooltipActionsMenu type="labels">
  <YaTooltipActionItem icon={<Check />} label="Verify" active onClick={() => {}} />
  <YaTooltipActionItem icon={<Share2 />} label="Share" onClick={() => {}} />
  <YaTooltipActionItem icon={<Copy />} label="Copy" onClick={() => {}} />
  <YaTooltipActionItem icon={<Bookmark />} label="Save" onClick={() => {}} />
</YaTooltipActionsMenu>

Active State

Highlight the currently active action:

Active Item (Icons)
Active Item (Labels)
StateBackgroundIcon/Label Color
active={true}bg-secondarytext-primary
active={false}Transparent--ya-stone-500 / --ya-stone-800
<YaTooltipActionsMenu type="icons">
  <YaTooltipActionItem 
    icon={<Check />} 
    active={true}  // Shows with secondary background
    onClick={() => {}} 
  />
  <YaTooltipActionItem 
    icon={<Share2 />} 
    active={false}  // Default transparent background
    onClick={() => {}} 
  />
</YaTooltipActionsMenu>

Examples

Text Editor Toolbar

import { Bold, Italic, Underline, Link } from 'lucide-react'

const [activeFormat, setActiveFormat] = useState<string | null>('bold')

<YaTooltipActionsMenu type="icons">
  <YaTooltipActionItem 
    icon={<Bold />} 
    active={activeFormat === 'bold'} 
    onClick={() => setActiveFormat('bold')} 
  />
  <YaTooltipActionItem 
    icon={<Italic />} 
    active={activeFormat === 'italic'} 
    onClick={() => setActiveFormat('italic')} 
  />
  <YaTooltipActionItem 
    icon={<Underline />} 
    active={activeFormat === 'underline'} 
    onClick={() => setActiveFormat('underline')} 
  />
  <YaTooltipActionItem 
    icon={<Link />} 
    active={activeFormat === 'link'} 
    onClick={() => setActiveFormat('link')} 
  />
</YaTooltipActionsMenu>

Content Actions

import { Check, Share2, Copy, Bookmark } from 'lucide-react'

<YaTooltipActionsMenu type="labels">
  <YaTooltipActionItem icon={<Check />} label="Verify" active onClick={() => {}} />
  <YaTooltipActionItem icon={<Share2 />} label="Share" onClick={() => {}} />
  <YaTooltipActionItem icon={<Copy />} label="Copy" onClick={() => {}} />
  <YaTooltipActionItem icon={<Bookmark />} label="Save" onClick={() => {}} />
</YaTooltipActionsMenu>

Feedback Menu with State

import { useState } from 'react'
import { ThumbsUp, ThumbsDown, Flag } from 'lucide-react'

function FeedbackMenu() {
  const [activeAction, setActiveAction] = useState<string | null>(null)

  return (
    <YaTooltipActionsMenu type="labels">
      <YaTooltipActionItem 
        icon={<ThumbsUp />} 
        label="Good"
        active={activeAction === 'good'}
        onClick={() => setActiveAction('good')} 
      />
      <YaTooltipActionItem 
        icon={<ThumbsDown />} 
        label="Bad"
        active={activeAction === 'bad'}
        onClick={() => setActiveAction('bad')} 
      />
      <YaTooltipActionItem 
        icon={<Flag />} 
        label="Report"
        active={activeAction === 'report'}
        onClick={() => setActiveAction('report')} 
      />
    </YaTooltipActionsMenu>
  )
}

With Tooltip Integration

import { YaTooltip, YaTooltipProvider } from '@/components/ui/ya-tooltip'
import { MessageSquare } from 'lucide-react'

<YaTooltipProvider>
  <YaTooltipActionsMenu type="icons">
    <YaTooltip content="Verify content" arrow="top-center">
      <YaTooltipActionItem icon={<Check />} active onClick={() => {}} />
    </YaTooltip>
    <YaTooltip content="Share content" arrow="top-center">
      <YaTooltipActionItem icon={<Share2 />} onClick={() => {}} />
    </YaTooltip>
    <YaTooltip content="Send feedback" arrow="top-center">
      <YaTooltipActionItem icon={<MessageSquare />} onClick={() => {}} />
    </YaTooltip>
  </YaTooltipActionsMenu>
</YaTooltipProvider>

Quick Actions

import { Edit, Copy, Trash2, MoreHorizontal } from 'lucide-react'

<YaTooltipActionsMenu type="icons">
  <YaTooltipActionItem icon={<Edit />} onClick={() => {}} aria-label="Edit" />
  <YaTooltipActionItem icon={<Copy />} onClick={() => {}} aria-label="Copy" />
  <YaTooltipActionItem icon={<Trash2 />} onClick={() => {}} aria-label="Delete" />
  <YaTooltipActionItem icon={<MoreHorizontal />} onClick={() => {}} aria-label="More options" />
</YaTooltipActionsMenu>

Toolbar with Multiple Selection

const [selected, setSelected] = useState<string[]>(['verify'])

const toggleAction = (action: string) => {
  setSelected((prev) =>
    prev.includes(action) 
      ? prev.filter((a) => a !== action) 
      : [...prev, action]
  )
}

<YaTooltipActionsMenu type="icons" role="toolbar" aria-label="Text actions">
  <YaTooltipActionItem
    icon={<Check />}
    active={selected.includes('verify')}
    onClick={() => toggleAction('verify')}
    aria-label="Verify content"
  />
  <YaTooltipActionItem
    icon={<Share2 />}
    active={selected.includes('share')}
    onClick={() => toggleAction('share')}
    aria-label="Share content"
  />
</YaTooltipActionsMenu>

Dark Mode

The component automatically adapts to dark mode:

ModeBackgroundBorder
LightWhite--ya-stone-50
Dark--ya-stone-900--ya-stone-700

Props

YaTooltipActionsMenu Props

PropTypeDefaultDescription
type'icons' | 'labels''icons'Display mode for action items
classNamestring-Additional CSS classes

Extends all standard HTML div attributes.

YaTooltipActionItem Props

PropTypeDefaultDescription
iconReactNode-Required. Icon to display
labelstring-Text label (visible in "labels" mode)
activebooleanfalseWhether this action is active/selected
onClick() => void-Callback when action is clicked
classNamestring-Additional CSS classes

Extends all standard HTML button attributes (disabled, aria-label, etc.).

Accessibility

Best Practices

DoDon't
Use icons-only when actions are recognizableObscure icons without tooltips
Use labels when clarity is importantToo many actions (keep to 2-5)
Add aria-label for icons-only modeSkip accessibility attributes
Position above selected text or near interactive elementsObscure important content
Use consistent icon library (Lucide)Mix icon sizes or styles

TypeScript

import { type VariantProps } from 'class-variance-authority'
import { 
  yaTooltipActionsMenuVariants,
  yaTooltipActionItemVariants 
} from '@/components/ui/ya-tooltip-actions-menu'

// Extract variant types
type MenuType = VariantProps<typeof yaTooltipActionsMenuVariants>['type']

// Use in your components
interface ToolbarProps {
  displayType?: MenuType
}

On this page