Component · Free prompt
Feature with Image Comparison
Feature with Image Comparison is a complete, paste-ready component build-prompt — a full art-direction spec for Lovable, Bolt, v0, Cursor and Claude. It's free: copy it below and paste it into your builder.

Feature with Image ComparisonComponent · free prompt · copy-paste
Feature block with Image Comparison
— Install —
npx shadcn@latest add "https://21st.dev/r/feature-with-image-comparison"
— Component source (Feature with Image Comparison.tsx) —
import { useState } from "react";
import Image from "next/image";
import { Badge } from "@/components/ui/badge";
import { GripVertical } from "lucide-react";
function Feature() {
const [inset, setInset] = useState<number>(50);
const [onMouseDown, setOnMouseDown] = useState<boolean>(false);
const onMouseMove = (e: React.MouseEvent | React.TouchEvent) => {
if (!onMouseDown) return;
const rect = e.currentTarget.getBoundingClientRect();
let x = 0;
if ("touches" in e && e.touches.length > 0) {
x = e.touches[0].clientX - rect.left;
} else if ("clientX" in e) {
x = e.clientX - rect.left;
}
const percentage = (x / rect.width) * 100;
setInset(percentage);
};
return (
<div className="w-full py-20 lg:py-40">
<div className="container mx-auto">
<div className="flex flex-col gap-4">
<div>
<Badge>Platform</Badge>
</div>
<div className="flex gap-2 flex-col">
<h2 className="text-3xl md:text-5xl tracking-tighter lg:max-w-xl font-regular">
Something new!
</h2>
<p className="text-lg max-w-xl lg:max-w-xl leading-relaxed tracking-tight text-muted-foreground">
Managing a small business today is already tough.
</p>
</div>
<div className="pt-12 w-full">
<div
className="relative aspect-video w-full h-full overflow-hidden rounded-2xl select-none"
onMouseMove={onMouseMove}
onMouseUp={() => setOnMouseDown(false)}
onTouchMove={onMouseMove}
onTouchEnd={() => setOnMouseDown(false)}
>
<div
className="bg-muted h-full w-1 absolute z-20 top-0 -ml-1 select-none"
style={{
left: inset + "%",
}}
>
<button
className="bg-muted rounded hover:scale-110 transition-all w-5 h-10 select-none -translate-y-1/2 absolute top-1/2 -ml-2 z-30 cursor-ew-resize flex justify-center items-center"
onTouchStart={(e) => {
setOnMouseDown(true);
onMouseMove(e);
}}
onMouseDown={(e) => {
setOnMouseDown(true);
onMouseMove(e);
}}
onTouchEnd={() => setOnMouseDown(false)}
onMouseUp={() => setOnMouseDown(false)}
>
<GripVertical className="h-4 w-4 select-none" />
</button>
</div>
<Image
src="https://www.twblocks.com/_next/image?url=%2Ffeature8.png&w=3840&q=75"
alt="feature8"
width={1920}
height={1080}
priority
className="absolute left-0 top-0 z-10 w-full h-full aspect-video rounded-2xl select-none border"
style={{
clipPath: "inset(0 0 0 " + inset + "%)",
}}
/>
<Image
src="https://www.twblocks.com/_next/image?url=%2Fdarkmode-feature8.png&w=3840&q=75"
alt="darkmode-feature8.png"
width={1920}
height={1080}
priority
className="absolute left-0 top-0 w-full h-full aspect-video rounded-2xl select-none border"
/>
</div>
</div>
</div>
</div>
</div>
);
}
export { Feature };
Browse & preview free Unlock everything — from $19/mo





