mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
Merge branch 'feat/thumbnail-appearance' into staging
This commit is contained in:
@@ -24,6 +24,7 @@ import { useTimelineElementResize } from "@/hooks/use-timeline-element-resize";
|
|||||||
import {
|
import {
|
||||||
getTrackElementClasses,
|
getTrackElementClasses,
|
||||||
TIMELINE_CONSTANTS,
|
TIMELINE_CONSTANTS,
|
||||||
|
getTrackHeight,
|
||||||
} from "@/constants/timeline-constants";
|
} from "@/constants/timeline-constants";
|
||||||
import {
|
import {
|
||||||
DropdownMenu,
|
DropdownMenu,
|
||||||
@@ -267,35 +268,92 @@ export function TimelineElement({
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TILE_ASPECT_RATIO = 16 / 9;
|
||||||
|
|
||||||
if (mediaItem.type === "image") {
|
if (mediaItem.type === "image") {
|
||||||
|
// Calculate tile size based on 16:9 aspect ratio
|
||||||
|
const trackHeight = getTrackHeight(track.type);
|
||||||
|
const tileHeight = trackHeight - 8; // Account for padding
|
||||||
|
const tileWidth = tileHeight * TILE_ASPECT_RATIO;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full h-full flex items-center justify-center">
|
<div className="w-full h-full flex items-center justify-start overflow-hidden">
|
||||||
<div className="bg-[#004D52] py-3 w-full h-full">
|
<div className="bg-[#004D52]/20 h-full w-full relative">
|
||||||
<img
|
{/* Background with tiled images */}
|
||||||
src={mediaItem.url}
|
<div
|
||||||
alt={mediaItem.name}
|
className="absolute inset-0"
|
||||||
className="w-full h-full object-cover"
|
style={{
|
||||||
draggable={false}
|
backgroundImage: mediaItem.url
|
||||||
|
? `url(${mediaItem.url})`
|
||||||
|
: "none",
|
||||||
|
backgroundRepeat: "repeat-x",
|
||||||
|
backgroundSize: `${tileWidth}px ${tileHeight}px`,
|
||||||
|
backgroundPosition: "left center",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{/* Overlay with vertical borders */}
|
||||||
|
<div
|
||||||
|
className="absolute inset-0 pointer-events-none"
|
||||||
|
style={{
|
||||||
|
backgroundImage: `repeating-linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent 0px,
|
||||||
|
transparent ${tileWidth - 1}px,
|
||||||
|
rgba(255, 255, 255, 0.6) ${tileWidth - 1}px,
|
||||||
|
rgba(255, 255, 255, 0.6) ${tileWidth}px
|
||||||
|
)`,
|
||||||
|
backgroundPosition: "left center",
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const VIDEO_TILE_PADDING = 16;
|
||||||
|
const OVERLAY_SPACE_MULTIPLIER = 1.5;
|
||||||
|
|
||||||
if (mediaItem.type === "video" && mediaItem.thumbnailUrl) {
|
if (mediaItem.type === "video" && mediaItem.thumbnailUrl) {
|
||||||
|
const trackHeight = getTrackHeight(track.type);
|
||||||
|
const tileHeight = trackHeight - VIDEO_TILE_PADDING;
|
||||||
|
const tileWidth = tileHeight * TILE_ASPECT_RATIO;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="w-full h-full flex items-center gap-2">
|
<div className="w-full h-full flex items-center overflow-hidden relative">
|
||||||
<div className="w-8 h-8 flex-shrink-0">
|
<div className="h-full w-full relative">
|
||||||
<img
|
{/* Background with tiled thumbnails */}
|
||||||
src={mediaItem.thumbnailUrl}
|
<div
|
||||||
alt={mediaItem.name}
|
className="absolute inset-0"
|
||||||
className="w-full h-full object-cover rounded-sm"
|
style={{
|
||||||
draggable={false}
|
backgroundImage: mediaItem.thumbnailUrl
|
||||||
|
? `url(${mediaItem.thumbnailUrl})`
|
||||||
|
: "none",
|
||||||
|
backgroundRepeat: "repeat-x",
|
||||||
|
backgroundSize: `${tileWidth}px ${tileHeight}px`,
|
||||||
|
backgroundPosition: "left center",
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
{/* Overlay with vertical borders */}
|
||||||
|
<div
|
||||||
|
className="absolute inset-0 pointer-events-none"
|
||||||
|
style={{
|
||||||
|
backgroundImage: `repeating-linear-gradient(
|
||||||
|
to right,
|
||||||
|
transparent 0px,
|
||||||
|
transparent ${tileWidth - 1}px,
|
||||||
|
rgba(255, 255, 255, 0.6) ${tileWidth - 1}px,
|
||||||
|
rgba(255, 255, 255, 0.6) ${tileWidth}px
|
||||||
|
)`,
|
||||||
|
backgroundPosition: "left center",
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xs text-foreground/80 truncate flex-1">
|
{/* Show name overlay on the right if there's sufficient space */}
|
||||||
|
{elementWidth > tileWidth * OVERLAY_SPACE_MULTIPLIER && (
|
||||||
|
<div className="absolute right-2 top-1/2 -translate-y-1/2 bg-black/70 text-white text-xs px-2 py-1 rounded pointer-events-none max-w-[40%] truncate">
|
||||||
{element.name}
|
{element.name}
|
||||||
</span>
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user