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) */}
<div
className="absolute inset-0"
style={{
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",
}}
className="absolute inset-0 bg-muted/30"
style={{ clipPath: `inset(0 0 0 ${position}%)` }}
>
<img
src={afterSrc}
@@ -107,12 +107,17 @@ export function ImageViewer({
.filter(Boolean)
.join(" ");
const checkerBg = bgPreview?.showCheckerboard
? { background: "repeating-conic-gradient(#d0d0d0 0% 25%, #f0f0f0 0% 50%) 0 0 / 20px 20px" }
: {};
const imageStyle =
fitMode === "fit"
? {
maxWidth: "100%",
maxHeight: "100%",
objectFit: "contain" as const,
...checkerBg,
...(previewTransform && {
transform: previewTransform,
transition: "transform 0.25s ease, filter 0.15s ease",
@@ -122,6 +127,7 @@ export function ImageViewer({
: {
transform: `scale(${zoom / 100})${previewTransform ? ` ${previewTransform}` : ""}`,
transformOrigin: "center center",
...checkerBg,
...(previewTransform && { transition: "transform 0.25s ease, filter 0.15s ease" }),
...(cssFilter && { filter: cssFilter, transition: "filter 0.15s ease" }),
};
@@ -174,12 +180,7 @@ export function ImageViewer({
<div
ref={containerRef}
className="flex-1 flex items-center justify-center overflow-auto p-4"
style={{
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,
}}
style={{ backgroundColor: "hsl(var(--muted) / 0.2)" }}
>
{loadError ? (
<div className="flex flex-col items-center justify-center gap-3 text-center">