fix: remove checkerboard bleed in before-after slider and image viewer

The before-after slider hardcoded a checkerboard background on the
entire "after" overlay, which filled letterbox/pillarbox space around
non-transparent images. Replaced with a neutral bg-muted/30.

In image-viewer, moved the checkerboard from the outer container
(which included padding) to the img element itself, so it only
shows through transparent pixels rather than the surrounding area.
This commit is contained in:
SnapOtter
2026-05-11 16:48:51 +08:00
parent a7a17fbff4
commit 0c8e8c075c
2 changed files with 9 additions and 15 deletions
@@ -114,15 +114,8 @@ export function BeforeAfterSlider({
{/* After image (clipped, top layer) */} {/* After image (clipped, top layer) */}
<div <div
className="absolute inset-0" className="absolute inset-0 bg-muted/30"
style={{ style={{ clipPath: `inset(0 0 0 ${position}%)` }}
clipPath: `inset(0 0 0 ${position}%)`,
backgroundImage:
"linear-gradient(45deg, #d1d5db 25%, transparent 25%), linear-gradient(-45deg, #d1d5db 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #d1d5db 75%), linear-gradient(-45deg, transparent 75%, #d1d5db 75%)",
backgroundSize: "16px 16px",
backgroundPosition: "0 0, 0 8px, 8px -8px, -8px 0",
backgroundColor: "#f9fafb",
}}
> >
<img <img
src={afterSrc} src={afterSrc}
@@ -107,12 +107,17 @@ export function ImageViewer({
.filter(Boolean) .filter(Boolean)
.join(" "); .join(" ");
const checkerBg = bgPreview?.showCheckerboard
? { background: "repeating-conic-gradient(#d0d0d0 0% 25%, #f0f0f0 0% 50%) 0 0 / 20px 20px" }
: {};
const imageStyle = const imageStyle =
fitMode === "fit" fitMode === "fit"
? { ? {
maxWidth: "100%", maxWidth: "100%",
maxHeight: "100%", maxHeight: "100%",
objectFit: "contain" as const, objectFit: "contain" as const,
...checkerBg,
...(previewTransform && { ...(previewTransform && {
transform: previewTransform, transform: previewTransform,
transition: "transform 0.25s ease, filter 0.15s ease", transition: "transform 0.25s ease, filter 0.15s ease",
@@ -122,6 +127,7 @@ export function ImageViewer({
: { : {
transform: `scale(${zoom / 100})${previewTransform ? ` ${previewTransform}` : ""}`, transform: `scale(${zoom / 100})${previewTransform ? ` ${previewTransform}` : ""}`,
transformOrigin: "center center", transformOrigin: "center center",
...checkerBg,
...(previewTransform && { transition: "transform 0.25s ease, filter 0.15s ease" }), ...(previewTransform && { transition: "transform 0.25s ease, filter 0.15s ease" }),
...(cssFilter && { filter: cssFilter, transition: "filter 0.15s ease" }), ...(cssFilter && { filter: cssFilter, transition: "filter 0.15s ease" }),
}; };
@@ -174,12 +180,7 @@ export function ImageViewer({
<div <div
ref={containerRef} ref={containerRef}
className="flex-1 flex items-center justify-center overflow-auto p-4" className="flex-1 flex items-center justify-center overflow-auto p-4"
style={{ style={{ backgroundColor: "hsl(var(--muted) / 0.2)" }}
background: bgPreview?.showCheckerboard
? "repeating-conic-gradient(#d0d0d0 0% 25%, #f0f0f0 0% 50%) 0 0 / 20px 20px"
: undefined,
backgroundColor: !bgPreview?.showCheckerboard ? "hsl(var(--muted) / 0.2)" : undefined,
}}
> >
{loadError ? ( {loadError ? (
<div className="flex flex-col items-center justify-center gap-3 text-center"> <div className="flex flex-col items-center justify-center gap-3 text-center">