feat(ui): 添加工具栏溢出菜单优化响应式布局
- 新增 DropdownMenu 基础组件(基于 Radix UI) - 新增 ToolbarOverflowMenu 组件(齿轮图标设置菜单) - 将 Header 次要按钮收入溢出菜单 - 保留 Diagnostics 和 Sessions 按钮始终可见 - 溢出菜单放置在最右侧
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
/**
|
||||
* ToolbarOverflowMenu Component
|
||||
*
|
||||
* 工具栏溢出菜单,用于在空间不足时收纳次要按钮
|
||||
*/
|
||||
|
||||
import { Settings, type LucideIcon } from 'lucide-react';
|
||||
import { motion } from 'framer-motion';
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuTrigger,
|
||||
} from '../primitives/DropdownMenu';
|
||||
import { cn } from '../utils/cn';
|
||||
|
||||
export interface ToolbarMenuItem {
|
||||
/** 菜单项图标 */
|
||||
icon: LucideIcon;
|
||||
/** 菜单项标签 */
|
||||
label: string;
|
||||
/** 点击回调 */
|
||||
onClick?: () => void;
|
||||
}
|
||||
|
||||
interface ToolbarOverflowMenuProps {
|
||||
/** 菜单项列表 */
|
||||
items: ToolbarMenuItem[];
|
||||
/** 自定义类名 */
|
||||
className?: string;
|
||||
}
|
||||
|
||||
export function ToolbarOverflowMenu({ items, className }: ToolbarOverflowMenuProps) {
|
||||
// 过滤掉没有 onClick 的项
|
||||
const validItems = items.filter((item) => item.onClick);
|
||||
|
||||
if (validItems.length === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<motion.button
|
||||
whileHover={{ scale: 1.1 }}
|
||||
whileTap={{ scale: 0.9 }}
|
||||
className={cn(
|
||||
'p-1.5 rounded-lg text-fg-muted hover:text-fg-secondary hover:bg-surface-muted transition-colors',
|
||||
className
|
||||
)}
|
||||
title="Settings"
|
||||
>
|
||||
<Settings size={20} />
|
||||
</motion.button>
|
||||
</DropdownMenuTrigger>
|
||||
<DropdownMenuContent align="end">
|
||||
{validItems.map((item) => (
|
||||
<DropdownMenuItem key={item.label} onClick={item.onClick}>
|
||||
<item.icon size={16} className="text-fg-muted" />
|
||||
<span>{item.label}</span>
|
||||
</DropdownMenuItem>
|
||||
))}
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user