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% 표시) */}
+ {/* Before (위층, clip-path로 좌측만 표시) */}
+
+ {/* Divider line + handle */}
-

-
-
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("");
+ });
+});