From c2f9092c8c6bd13a6d2a822d03c48d423bf3c785 Mon Sep 17 00:00:00 2001 From: Rick Ye Date: Tue, 8 Sep 2026 10:55:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9D=A2=E6=9D=BF=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=8F=B3=E4=BE=A7=E6=96=B0=E5=A2=9E=E3=80=8C+=E3=80=8D?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=96=B0=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/renderer/src/components/SidePanel.tsx | 58 +++++++++++++++++-- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/apps/desktop/src/renderer/src/components/SidePanel.tsx b/apps/desktop/src/renderer/src/components/SidePanel.tsx index 4fe3e93..e4c33da 100644 --- a/apps/desktop/src/renderer/src/components/SidePanel.tsx +++ b/apps/desktop/src/renderer/src/components/SidePanel.tsx @@ -1,5 +1,5 @@ import { useEffect, useRef, useState, type ComponentType, type JSX, type ReactNode } from 'react' -import { LuChevronDown, LuX } from 'react-icons/lu' +import { LuChevronDown, LuPlus, LuX } from 'react-icons/lu' /** * 右侧通用标签面板(TabPanel,ZCode 式)。 @@ -59,6 +59,7 @@ export function SidePanel({ }: SidePanelProps): JSX.Element { const dragRef = useRef<{ startX: number; startWidth: number } | null>(null) const [listOpen, setListOpen] = useState(false) + const [plusOpen, setPlusOpen] = useState(false) const [ctxMenu, setCtxMenu] = useState<{ x: number; y: number; tabId: string } | null>(null) // 面板宽度拖拽(左边缘把手) @@ -85,21 +86,22 @@ export function SidePanel({ // 菜单打开时 Esc 关闭 useEffect(() => { - if (!listOpen && !ctxMenu) return + if (!listOpen && !plusOpen && !ctxMenu) return const onKey = (e: KeyboardEvent): void => { if (e.key === 'Escape') { setListOpen(false) + setPlusOpen(false) setCtxMenu(null) } } window.addEventListener('keydown', onKey) return () => window.removeEventListener('keydown', onKey) - }, [listOpen, ctxMenu]) + }, [listOpen, plusOpen, ctxMenu]) // 覆盖层开合上报(宿主借此暂停原生视图) useEffect(() => { - onOverlayChange?.(listOpen || ctxMenu !== null) - }, [listOpen, ctxMenu, onOverlayChange]) + onOverlayChange?.(listOpen || plusOpen || ctxMenu !== null) + }, [listOpen, plusOpen, ctxMenu, onOverlayChange]) const current = tabs.find((t) => t.id === activeId) ?? tabs[tabs.length - 1] ?? null @@ -196,6 +198,52 @@ export function SidePanel({ )} + {/* 新增标签:列出注册表中的类型,已打开的置灰 */} + {available.length > 0 && ( +
+ + + {plusOpen && ( + <> +
setPlusOpen(false)} /> +
+ {available.map(({ id, title, icon: Icon }) => { + const opened = tabs.some((t) => t.id === id) + return ( + + ) + })} +
+ + )} +
+ )} + {ctxMenu && ( <>