1- import { memo } from "react" ;
1+ import { memo , useMemo } from "react" ;
22import {
33 DiffIcon ,
4- EllipsisIcon ,
5- FileCodeIcon ,
64 MonitorIcon ,
75 TerminalSquareIcon ,
86} from "lucide-react" ;
9- import { Button } from "../ui/button" ;
10- import { Menu , MenuCheckboxItem , MenuPopup , MenuSeparator , MenuTrigger } from "../ui/menu" ;
117import { Tooltip , TooltipPopup , TooltipTrigger } from "../ui/tooltip" ;
8+ import { ToggleGroup , Toggle , ToggleGroupSeparator } from "../ui/toggle-group" ;
129
1310interface HeaderPanelsMenuProps {
1411 terminalAvailable : boolean ;
@@ -19,13 +16,9 @@ interface HeaderPanelsMenuProps {
1916 diffOpen : boolean ;
2017 diffToggleShortcutLabel : string | null ;
2118 isGitRepo : boolean ;
22- codeViewerOpen : boolean ;
23- hasCodeViewerTabs : boolean ;
24- hasProject : boolean ;
2519 onToggleTerminal : ( ) => void ;
2620 onTogglePreview : ( ) => void ;
2721 onToggleDiff : ( ) => void ;
28- onToggleCodeViewer : ( ) => void ;
2922}
3023
3124export const HeaderPanelsMenu = memo ( function HeaderPanelsMenu ( {
@@ -37,88 +30,76 @@ export const HeaderPanelsMenu = memo(function HeaderPanelsMenu({
3730 diffOpen,
3831 diffToggleShortcutLabel,
3932 isGitRepo,
40- codeViewerOpen,
41- hasCodeViewerTabs,
42- hasProject,
4333 onToggleTerminal,
4434 onTogglePreview,
4535 onToggleDiff,
46- onToggleCodeViewer,
4736} : HeaderPanelsMenuProps ) {
37+ const value = useMemo ( ( ) => {
38+ const v : string [ ] = [ ] ;
39+ if ( terminalOpen ) v . push ( "terminal" ) ;
40+ if ( previewOpen ) v . push ( "preview" ) ;
41+ if ( diffOpen ) v . push ( "diff" ) ;
42+ return v ;
43+ } , [ terminalOpen , previewOpen , diffOpen ] ) ;
44+
4845 return (
49- < Menu >
46+ < ToggleGroup
47+ value = { value }
48+ variant = "outline"
49+ size = "xs"
50+ className = "shrink-0"
51+ >
52+ < Tooltip >
53+ < TooltipTrigger
54+ render = {
55+ < Toggle
56+ value = "terminal"
57+ disabled = { ! terminalAvailable }
58+ onClick = { onToggleTerminal }
59+ aria-label = "Toggle terminal"
60+ >
61+ < TerminalSquareIcon className = "size-3.5" />
62+ </ Toggle >
63+ }
64+ />
65+ < TooltipPopup side = "bottom" >
66+ Terminal{ terminalToggleShortcutLabel ? ` ${ terminalToggleShortcutLabel } ` : "" }
67+ </ TooltipPopup >
68+ </ Tooltip >
69+ < ToggleGroupSeparator />
70+ < Tooltip >
71+ < TooltipTrigger
72+ render = {
73+ < Toggle
74+ value = "preview"
75+ disabled = { ! previewAvailable }
76+ onClick = { onTogglePreview }
77+ aria-label = "Toggle preview"
78+ >
79+ < MonitorIcon className = "size-3.5" />
80+ </ Toggle >
81+ }
82+ />
83+ < TooltipPopup side = "bottom" > Preview</ TooltipPopup >
84+ </ Tooltip >
85+ < ToggleGroupSeparator />
5086 < Tooltip >
5187 < TooltipTrigger
5288 render = {
53- < MenuTrigger
54- render = {
55- < Button variant = "outline" size = "xs" className = "shrink-0" aria-label = "Toggle panels" >
56- < EllipsisIcon className = "size-3.5" />
57- </ Button >
58- }
59- />
89+ < Toggle
90+ value = "diff"
91+ disabled = { ! isGitRepo }
92+ onClick = { onToggleDiff }
93+ aria-label = "Toggle diff"
94+ >
95+ < DiffIcon className = "size-3.5" />
96+ </ Toggle >
6097 }
6198 />
62- < TooltipPopup side = "bottom" > Panels</ TooltipPopup >
99+ < TooltipPopup side = "bottom" >
100+ Diff{ diffToggleShortcutLabel ? ` ${ diffToggleShortcutLabel } ` : "" }
101+ </ TooltipPopup >
63102 </ Tooltip >
64- < MenuPopup side = "bottom" align = "end" sideOffset = { 6 } >
65- < MenuCheckboxItem
66- checked = { terminalOpen }
67- onCheckedChange = { onToggleTerminal }
68- disabled = { ! terminalAvailable }
69- variant = "switch"
70- >
71- < span className = "inline-flex items-center gap-2" >
72- < TerminalSquareIcon className = "size-3.5 opacity-80" />
73- Terminal
74- { terminalToggleShortcutLabel ? (
75- < kbd className = "ml-auto text-[10px] text-muted-foreground" >
76- { terminalToggleShortcutLabel }
77- </ kbd >
78- ) : null }
79- </ span >
80- </ MenuCheckboxItem >
81- < MenuCheckboxItem
82- checked = { previewOpen }
83- onCheckedChange = { onTogglePreview }
84- disabled = { ! previewAvailable }
85- variant = "switch"
86- >
87- < span className = "inline-flex items-center gap-2" >
88- < MonitorIcon className = "size-3.5 opacity-80" />
89- Preview
90- </ span >
91- </ MenuCheckboxItem >
92- < MenuSeparator />
93- < MenuCheckboxItem
94- checked = { diffOpen }
95- onCheckedChange = { onToggleDiff }
96- disabled = { ! isGitRepo }
97- variant = "switch"
98- >
99- < span className = "inline-flex items-center gap-2" >
100- < DiffIcon className = "size-3.5 opacity-80" />
101- Diff
102- { diffToggleShortcutLabel ? (
103- < kbd className = "ml-auto text-[10px] text-muted-foreground" >
104- { diffToggleShortcutLabel }
105- </ kbd >
106- ) : null }
107- </ span >
108- </ MenuCheckboxItem >
109- { hasProject && hasCodeViewerTabs ? (
110- < MenuCheckboxItem
111- checked = { codeViewerOpen }
112- onCheckedChange = { onToggleCodeViewer }
113- variant = "switch"
114- >
115- < span className = "inline-flex items-center gap-2" >
116- < FileCodeIcon className = "size-3.5 opacity-80" />
117- Code viewer
118- </ span >
119- </ MenuCheckboxItem >
120- ) : null }
121- </ MenuPopup >
122- </ Menu >
103+ </ ToggleGroup >
123104 ) ;
124105} ) ;
0 commit comments