diff --git a/packages/web/lib/components/vton/BeforeAfterSlider.tsx b/packages/web/lib/components/vton/BeforeAfterSlider.tsx index ca791f3c..8c0a7d1e 100644 --- a/packages/web/lib/components/vton/BeforeAfterSlider.tsx +++ b/packages/web/lib/components/vton/BeforeAfterSlider.tsx @@ -36,29 +36,24 @@ export function BeforeAfterSlider({ }} onPointerMove={(e) => handleMove(e.clientX)} > + {/* After (밑층, 항상 100% 표시) */} Result + {/* Before (위층, clip-path로 좌측만 표시) */} + Original + {/* Divider line + handle */}
- Original -
-
diff --git a/packages/web/lib/components/vton/__tests__/BeforeAfterSlider.test.tsx b/packages/web/lib/components/vton/__tests__/BeforeAfterSlider.test.tsx new file mode 100644 index 00000000..dd472536 --- /dev/null +++ b/packages/web/lib/components/vton/__tests__/BeforeAfterSlider.test.tsx @@ -0,0 +1,44 @@ +/* @vitest-environment jsdom */ + +import { render, screen } from "@testing-library/react"; +import { describe, expect, it } from "vitest"; +import { BeforeAfterSlider } from "../BeforeAfterSlider"; + +describe("BeforeAfterSlider", () => { + it("renders both before and after images on first mount", () => { + render( + + ); + + expect(screen.getByAltText("Original")).toBeInTheDocument(); + expect(screen.getByAltText("Result")).toBeInTheDocument(); + }); + + it("applies clip-path inset(0 50% 0 0) to before image at default sliderPos=50", () => { + render( + + ); + + const beforeImg = screen.getByAltText("Original"); + expect(beforeImg.style.clipPath).toContain("inset(0 50% 0 0)"); + }); + + it("does not use offsetWidth measurement on before image", () => { + render( + + ); + + const beforeImg = screen.getByAltText("Original"); + // width should not be set as an inline px value (old race-condition approach) + expect(beforeImg.style.width).toBe(""); + }); +});