"use client"; import * as React from "react"; import { cn } from "./lib/utils"; export interface PromptDiffCompareProps extends React.HTMLAttributes { before: string; after: string; beforeLabel?: string; afterLabel?: string; } function words(text: string): string[] { return text.split(/\s+/).filter(Boolean); } /** Side-by-side prompt diff with added/removed word highlights. */ export function PromptDiffCompare({ before, after, beforeLabel = "Before", afterLabel = "After", className, ...props }: PromptDiffCompareProps) { const beforeWords = React.useMemo(() => words(before), [before]); const afterWords = React.useMemo(() => words(after), [after]); const afterSet = React.useMemo(() => new Set(afterWords), [afterWords]); const beforeSet = React.useMemo(() => new Set(beforeWords), [beforeWords]); const removed = beforeWords.filter((w) => !afterSet.has(w)).length; const added = afterWords.filter((w) => !beforeSet.has(w)).length; const pane = (label: string, list: string[], base: Set, tone: "removed" | "added") => (

{label}

{list.map((w, i) => { const changed = !base.has(w); return ( {w}{" "} ); })}

); return (

Prompt diff

-{removed} / +{added}

{pane(beforeLabel, beforeWords, afterSet, "removed")} {pane(afterLabel, afterWords, beforeSet, "added")}
); }