@@ -263,16 +263,22 @@ const TerminalActionButton = (
263263 {
264264 children,
265265 compactTypingMode,
266- onClick
266+ onClick,
267+ pressed,
268+ title
267269 } : {
268270 readonly children : string
269271 readonly compactTypingMode : boolean
270272 readonly onClick : ( ) => void
273+ readonly pressed ?: boolean
274+ readonly title ?: string
271275 }
272276) : JSX . Element => (
273277 < button
278+ aria-pressed = { pressed }
274279 onClick = { onClick }
275280 style = { compactTypingMode ? compactCloseButtonStyle : closeButtonStyle }
281+ title = { title }
276282 type = "button"
277283 >
278284 { children }
@@ -307,13 +313,15 @@ const OptionalTerminalActionButton = (
307313const TerminalHeaderActions = (
308314 {
309315 compactHeaderMode,
316+ inlineImagePreviewsEnabled,
310317 onApplyProject,
311318 onDetach,
312319 onKill,
313320 onOpenBrowser,
314321 onOpenSkiller,
315322 onOpenTaskManager,
316323 onOpenTerminal,
324+ onToggleInlineImagePreviews,
317325 session
318326 } :
319327 & Pick <
@@ -329,9 +337,16 @@ const TerminalHeaderActions = (
329337 >
330338 & {
331339 readonly compactHeaderMode : boolean
340+ readonly inlineImagePreviewsEnabled : boolean
341+ readonly onToggleInlineImagePreviews : ( ) => void
332342 }
333343) : JSX . Element => {
334344 const hasProjectActions = session . browserProjectId !== undefined
345+ const imageToggleLabel = inlineImagePreviewsEnabled ? "Images on" : "Images off"
346+ const compactImageToggleLabel = inlineImagePreviewsEnabled ? "Img on" : "Img off"
347+ const imageToggleTitle = inlineImagePreviewsEnabled
348+ ? "Automatic image previews enabled"
349+ : "Automatic image previews disabled"
335350
336351 return (
337352 < div style = { compactHeaderMode ? compactHeaderActionsStyle : headerActionsStyle } >
@@ -370,6 +385,14 @@ const TerminalHeaderActions = (
370385 label = "New terminal"
371386 onClick = { onOpenTerminal }
372387 />
388+ < TerminalActionButton
389+ compactTypingMode = { compactHeaderMode }
390+ onClick = { onToggleInlineImagePreviews }
391+ pressed = { inlineImagePreviewsEnabled }
392+ title = { imageToggleTitle }
393+ >
394+ { compactHeaderMode ? compactImageToggleLabel : imageToggleLabel }
395+ </ TerminalActionButton >
373396 < TerminalActionButton compactTypingMode = { compactHeaderMode } onClick = { onDetach } >
374397 Detach
375398 </ TerminalActionButton >
@@ -383,13 +406,15 @@ const TerminalHeaderActions = (
383406const TerminalHeader = (
384407 {
385408 compactHeaderMode,
409+ inlineImagePreviewsEnabled,
386410 onApplyProject,
387411 onDetach,
388412 onKill,
389413 onOpenBrowser,
390414 onOpenSkiller,
391415 onOpenTaskManager,
392416 onOpenTerminal,
417+ onToggleInlineImagePreviews,
393418 session,
394419 status
395420 } :
@@ -406,20 +431,24 @@ const TerminalHeader = (
406431 >
407432 & {
408433 readonly compactHeaderMode : boolean
434+ readonly inlineImagePreviewsEnabled : boolean
435+ readonly onToggleInlineImagePreviews : ( ) => void
409436 readonly status : TerminalStatus
410437 }
411438) : JSX . Element => (
412439 < div style = { compactHeaderMode ? compactHeaderStyle : headerStyle } >
413440 < TerminalHeaderTitle compactHeaderMode = { compactHeaderMode } session = { session } status = { status } />
414441 < TerminalHeaderActions
415442 compactHeaderMode = { compactHeaderMode }
443+ inlineImagePreviewsEnabled = { inlineImagePreviewsEnabled }
416444 onApplyProject = { onApplyProject }
417445 onDetach = { onDetach }
418446 onKill = { onKill }
419447 onOpenBrowser = { onOpenBrowser }
420448 onOpenSkiller = { onOpenSkiller }
421449 onOpenTaskManager = { onOpenTaskManager }
422450 onOpenTerminal = { onOpenTerminal }
451+ onToggleInlineImagePreviews = { onToggleInlineImagePreviews }
423452 session = { session }
424453 />
425454 </ div >
@@ -575,10 +604,13 @@ export const TerminalPanel = (
575604) : JSX . Element => {
576605 const connectionRef = useRef < TerminalConnectionState > ( { closing : false , opened : false } )
577606 const hostRef = useRef < HTMLDivElement | null > ( null )
607+ const inlineImagePreviewsEnabledRef = useRef ( true )
578608 const runtimeRef = useRef < TerminalInputController | null > ( null )
579609 const [ status , setStatus ] = useState < TerminalStatus > ( ( ) => resolveInitialTerminalStatus ( session ) )
610+ const [ inlineImagePreviewsEnabled , setInlineImagePreviewsEnabled ] = useState ( true )
580611 const [ mobileControlsCollapsed , setMobileControlsCollapsed ] = useState ( false )
581612 const [ mobileCtrlArmed , setMobileCtrlArmed ] = useState ( false )
613+ const terminalSessionId = session . session . id
582614 const onAttachFailureRef = useRef ( onAttachFailure )
583615 const onMessageRef = useRef ( onMessage )
584616 useEffect ( ( ) => {
@@ -590,12 +622,24 @@ export const TerminalPanel = (
590622 useEffect ( ( ) => {
591623 setStatus ( resolveInitialTerminalStatus ( session ) )
592624 } , [ session ] )
625+ useEffect ( ( ) => {
626+ inlineImagePreviewsEnabledRef . current = true
627+ setInlineImagePreviewsEnabled ( true )
628+ } , [ terminalSessionId ] )
593629 const notifyAttachFailure = useCallback ( ( ) => {
594630 onAttachFailureRef . current ( )
595631 } , [ ] )
596632 const notifyMessage = useCallback ( ( message : string ) => {
597633 onMessageRef . current ( message )
598634 } , [ ] )
635+ const toggleInlineImagePreviews = useCallback ( ( ) => {
636+ setInlineImagePreviewsEnabled ( ( current ) => {
637+ const next = ! current
638+ inlineImagePreviewsEnabledRef . current = next
639+ return next
640+ } )
641+ retainTerminalFocus ( runtimeRef . current )
642+ } , [ ] )
599643 const compactHeaderMode = resolveTerminalCompactHeaderMode ( mobileMode )
600644 const compactTypingMode = resolveTerminalTypingMode ( mobileMode , keyboardOpen )
601645 const hasBodyContent = bodyContent !== undefined
@@ -644,6 +688,7 @@ export const TerminalPanel = (
644688 useTerminalSessionLifecycle ( {
645689 connectionRef,
646690 hostRef,
691+ inlineImagePreviewsEnabledRef,
647692 notifyMessage,
648693 onAttachFailure : notifyAttachFailure ,
649694 runtimeRef,
@@ -655,6 +700,7 @@ export const TerminalPanel = (
655700 < div style = { terminalPanelStyle ( mobileMode , keyboardOpen ) } >
656701 < TerminalHeader
657702 compactHeaderMode = { compactHeaderMode }
703+ inlineImagePreviewsEnabled = { inlineImagePreviewsEnabled }
658704 onApplyProject = { onApplyProject }
659705 onDetach = { ( ) => {
660706 connectionRef . current . closing = true
@@ -668,6 +714,7 @@ export const TerminalPanel = (
668714 onOpenSkiller = { onOpenSkiller }
669715 onOpenTaskManager = { onOpenTaskManager }
670716 onOpenTerminal = { onOpenTerminal }
717+ onToggleInlineImagePreviews = { toggleInlineImagePreviews }
671718 session = { session }
672719 status = { status }
673720 />
0 commit comments