import React, { useRef } from 'react'; import Box from '@mui/material/Box'; import IconButton from '@mui/material/IconButton'; import Tooltip from '@mui/material/Tooltip'; import Button from '@mui/material/Button'; import Divider from '@mui/material/Divider'; import InputBase from '@mui/material/InputBase'; import { useTheme } from '@mui/material/styles'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import ArrowForwardIcon from '@mui/icons-material/ArrowForward'; import RefreshIcon from '@mui/icons-material/Refresh'; import SearchIcon from '@mui/icons-material/Search'; import OpenInNewIcon from '@mui/icons-material/OpenInNew'; import HomeIcon from '@mui/icons-material/Home'; import MenuBar from './MenuBar.jsx'; import PanelIcon from './PanelIcon.jsx'; /* ============================================================ * Toolbar:VSCode 风格顶栏(高度 56px) * * Rain Work(渐变字标) | 菜单栏 | ← → ↻ | 地址栏(自适应填满) | 搜索 | 返回 * - 地址栏仅展示当前面板 URL(嵌入地址优先),只读、可点开新标签; * flex:1 填满顶栏剩余空间,左侧内容变宽时自然缩减 * - 搜索框:面板名/URL/分组,Enter 直达(逻辑由 Workbench 注入) * ============================================================ */ export default function Toolbar({ menus = [], canBack = false, canForward = false, onBack, onForward, onRefresh, currentPanel = null, onOpenExternal, search = '', onSearchChange, onSearchEnter, searchInputRef = null, onBackHome, }) { const muiTheme = useTheme(); const searchRef = useRef(null); const inputRef = searchInputRef || searchRef; const currentUrl = currentPanel ? (currentPanel.embed_url || currentPanel.url || '') : ''; const logoGradient = `linear-gradient(135deg, ${muiTheme.palette.primary.main} 0%, ${muiTheme.palette.tertiary.main} 100%)`; return ( {/* 品牌:纯文字 Logo,MD3 渐变字重 */} Rain Work {/* 导航:后退 / 前进 / 刷新 */} {/* 地址栏(只读,flex:1 自适应填满顶栏剩余空间;无 maxWidth 上限, 左侧菜单/导航变宽时自然缩减,顶栏始终占满) */} {currentPanel && } {currentPanel && ( )} {/* 搜索 */} onSearchChange?.(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { onSearchEnter?.(); inputRef.current?.blur(); } }} placeholder="搜索面板" inputProps={{ 'aria-label': '搜索面板', style: { paddingLeft: 30, fontSize: 12.5 } }} sx={{ height: 34, width: { xs: 100, sm: 150 }, px: 0.5, bgcolor: 'background.default', border: 1, borderColor: 'divider', borderRadius: 20, '&:focus-within': { borderColor: 'primary.main' }, }} /> {/* 返回前台 */} ); }