Skip to content

Commit be15eb8

Browse files
zlwaterfieldclaude
andcommitted
Add fast fade transition animation when screenshots change
- Implemented 150ms fade out/in transition when scrolling between different screenshots - Uses opacity animation with CSS transitions for smooth visual experience - Maintains current screenshot during transition to prevent flickering - Enhances user experience when navigating through conversation screenshots 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent e836c4a commit be15eb8

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

packages/bytebot-ui/src/components/screenshot/ScreenshotViewer.tsx

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useState, useEffect } from 'react';
22
import Image from 'next/image';
33
import { ScreenshotData } from '@/utils/screenshotUtils';
44

@@ -8,8 +8,25 @@ interface ScreenshotViewerProps {
88
}
99

1010
export function ScreenshotViewer({ screenshot, className = '' }: ScreenshotViewerProps) {
11-
12-
if (!screenshot) {
11+
const [isVisible, setIsVisible] = useState(true);
12+
const [currentScreenshot, setCurrentScreenshot] = useState(screenshot);
13+
14+
useEffect(() => {
15+
if (screenshot?.id !== currentScreenshot?.id) {
16+
// Start fade out
17+
setIsVisible(false);
18+
19+
// After fade out completes, update screenshot and fade in
20+
const timeout = setTimeout(() => {
21+
setCurrentScreenshot(screenshot);
22+
setIsVisible(true);
23+
}, 75); // Half of the transition duration
24+
25+
return () => clearTimeout(timeout);
26+
}
27+
}, [screenshot, currentScreenshot]);
28+
29+
if (!currentScreenshot) {
1330
return (
1431
<div className={`flex items-center justify-center bg-gray-100 ${className}`}>
1532
<div className="text-center text-gray-500">
@@ -24,10 +41,12 @@ export function ScreenshotViewer({ screenshot, className = '' }: ScreenshotViewe
2441
return (
2542
<div className={`relative overflow-hidden ${className}`}>
2643
<Image
27-
src={`data:image/png;base64,${screenshot.base64Data}`}
44+
src={`data:image/png;base64,${currentScreenshot.base64Data}`}
2845
alt="Task screenshot"
2946
fill
30-
className="object-contain"
47+
className={`object-contain transition-opacity duration-150 ease-in-out ${
48+
isVisible ? 'opacity-100' : 'opacity-0'
49+
}`}
3150
priority
3251
/>
3352
</div>

0 commit comments

Comments
 (0)