diff options
| author | MaheshtheDev <[email protected]> | 2026-01-22 02:35:35 +0000 |
|---|---|---|
| committer | MaheshtheDev <[email protected]> | 2026-01-22 02:35:35 +0000 |
| commit | 7972e543c47cb97b1716bbfe305d3244eb4d00bf (patch) | |
| tree | 6968ac91eb4161d33bac4042dbba3958c78482a5 /apps/web/components/new/document-modal/content/image-preview.tsx | |
| parent | Re - feat(pipecat-sdk): add speech-to-speech model support (Gemini Live) (#683) (diff) | |
| download | supermemory-7972e543c47cb97b1716bbfe305d3244eb4d00bf.tar.xz supermemory-7972e543c47cb97b1716bbfe305d3244eb4d00bf.zip | |
chore: cmdk, google docs viewer, image preview, document icons (#691)01-21-chore_cmdk_google_docs_viewer_image_preview_document_icons
Diffstat (limited to 'apps/web/components/new/document-modal/content/image-preview.tsx')
| -rw-r--r-- | apps/web/components/new/document-modal/content/image-preview.tsx | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/apps/web/components/new/document-modal/content/image-preview.tsx b/apps/web/components/new/document-modal/content/image-preview.tsx new file mode 100644 index 00000000..31d5c1c0 --- /dev/null +++ b/apps/web/components/new/document-modal/content/image-preview.tsx @@ -0,0 +1,56 @@ +"use client" + +import { useState } from "react" +import { cn } from "@lib/utils" + +interface ImagePreviewProps { + url: string + title?: string | null +} + +export function ImagePreview({ url, title }: ImagePreviewProps) { + const [imageError, setImageError] = useState(false) + const [isLoading, setIsLoading] = useState(true) + + if (imageError || !url) { + return ( + <div className="flex items-center justify-center h-full text-[#737373]"> + <p>Failed to load image</p> + </div> + ) + } + + return ( + <div className="relative w-full h-full overflow-hidden flex items-center justify-center bg-[#0B1017]"> + {isLoading && ( + <div className="absolute inset-0 bg-cover bg-center animate-pulse"> + <div className="w-full h-full bg-[#1B1F24]" /> + </div> + )} + <div + className="absolute inset-0 bg-cover bg-center" + style={{ + backgroundImage: `url(${url})`, + filter: "blur(100px)", + transform: "scale(1.1)", + opacity: isLoading ? 0.5 : 1, + }} + /> + <div className="absolute inset-0 bg-black/30" /> + <img + src={url} + alt={title || "Image preview"} + className={cn( + "relative max-w-full max-h-full w-auto h-auto object-contain z-10", + isLoading && "opacity-0", + )} + onError={() => { + setImageError(true) + setIsLoading(false) + }} + onLoad={() => setIsLoading(false)} + loading="lazy" + /> + </div> + ) +} |