Files
wehub-resource-sync c48612c494
CI / E2E Tests (push) Has been cancelled
CI / Lint, Typecheck & Unit Tests (push) Has been cancelled
Docs Build / Build docs site (push) Has been cancelled
Publish @openmaic packages / Build, validate & publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:23 +08:00

59 lines
2.1 KiB
TypeScript

'use client';
import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover';
import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip';
import type { InsertPaletteItem } from '@/lib/edit/scene-editor-surface';
/**
* Single insert-palette button. Reused by both the (legacy) CommandBar
* insert slot and the FloatingInsertToolbar that lives above the
* canvas now.
*
* When the item declares `popoverContent`, the button doubles as a
* popover trigger — and PopoverTrigger's `asChild` Slot is chained
* directly onto the real `<button>` so wrapping a `<Tooltip>`
* (provider, not DOM) doesn't drop the popover trigger handler.
*/
export function InsertButton({ item }: { readonly item: InsertPaletteItem }) {
const button = (
<button
type="button"
disabled={item.disabled}
onClick={item.popoverContent ? undefined : item.onInvoke}
className={`group flex h-9 items-center gap-1.5 rounded-xl px-3 transition-colors disabled:pointer-events-none disabled:opacity-40 ${
item.active
? 'bg-violet-100 text-violet-700 dark:bg-violet-500/20 dark:text-violet-300'
: 'text-zinc-600 hover:bg-zinc-100 hover:text-zinc-900 dark:text-zinc-400 dark:hover:bg-zinc-800 dark:hover:text-zinc-100'
}`}
>
<span className="flex h-4 w-4 items-center justify-center [&>svg]:h-4 [&>svg]:w-4">
{item.icon}
</span>
<span className="text-xs font-medium">{item.label}</span>
</button>
);
const triggerWithTooltip = (
<Tooltip>
<TooltipTrigger asChild>{button}</TooltipTrigger>
{item.tooltip && <TooltipContent>{item.tooltip}</TooltipContent>}
</Tooltip>
);
if (!item.popoverContent) return triggerWithTooltip;
return (
<Popover>
<Tooltip>
<TooltipTrigger asChild>
<PopoverTrigger asChild>{button}</PopoverTrigger>
</TooltipTrigger>
{item.tooltip && <TooltipContent>{item.tooltip}</TooltipContent>}
</Tooltip>
<PopoverContent side="bottom" align="center" className="w-80 p-3">
{item.popoverContent()}
</PopoverContent>
</Popover>
);
}