11"use client" ;
22
3- import { useEffect } from "react" ;
4- import { Loader2 , X } from "lucide-react" ;
3+ import { useEffect , useState } from "react" ;
4+ import { Loader2 , X , Filter } from "lucide-react" ;
55import { motion } from "framer-motion" ;
66import ReactDiffViewer from "react-diff-viewer" ;
77import type { ReactDiffViewerStylesOverride } from "react-diff-viewer" ;
@@ -38,6 +38,8 @@ export default function DiffComparisonModal({
3838 isLoading,
3939 error,
4040} : DiffComparisonModalProps ) {
41+ const [ showDiffOnly , setShowDiffOnly ] = useState ( false ) ;
42+
4143 // ESC key handler
4244 useEffect ( ( ) => {
4345 if ( ! isOpen ) {
@@ -106,9 +108,9 @@ export default function DiffComparisonModal({
106108 </ p >
107109 </ header >
108110
109- { /* Tabs */ }
110- < div className = "flex items-center justify-center gap-4" >
111- < div className = "relative flex w-full justify-center rounded-full border border-border bg-muted p-1" >
111+ { /* Tabs and Filter Toggle */ }
112+ < div className = "flex items-center gap-4" >
113+ < div className = "relative flex flex-[9] justify-center rounded-full border border-border bg-muted p-1 min-w-0 " >
112114 { tabs . map ( ( tab ) => {
113115 const isActive = tab . id === activeTabId ;
114116 return (
@@ -138,6 +140,21 @@ export default function DiffComparisonModal({
138140 ) ;
139141 } ) }
140142 </ div >
143+ < motion . button
144+ type = "button"
145+ onClick = { ( ) => setShowDiffOnly ( ( prev ) => ! prev ) }
146+ whileHover = { { scale : 1.05 } }
147+ whileTap = { { scale : 0.95 } }
148+ className = { `inline-flex items-center gap-2 rounded-full border px-4 py-2 text-xs font-semibold uppercase tracking-[0.25em] transition-colors whitespace-nowrap shrink-0 flex-[1] justify-center ${
149+ showDiffOnly
150+ ? "border-primary bg-primary text-primary-foreground"
151+ : "border-border bg-muted text-muted-foreground hover:border-accent hover:bg-accent/10 hover:text-foreground"
152+ } `}
153+ aria-label = { showDiffOnly ? "Show all lines" : "Show diff only" }
154+ >
155+ < Filter className = "h-3.5 w-3.5" />
156+ < span > Diff Only</ span >
157+ </ motion . button >
141158 </ div >
142159
143160 { /* Error message */ }
@@ -163,16 +180,18 @@ export default function DiffComparisonModal({
163180 < div
164181 className = "custom-scrollbar flex-1 overflow-auto rounded-xl bg-muted p-4 max-h-[calc(95vh-200px)]"
165182 >
166- < ReactDiffViewer
167- oldValue = { diffContent . oldValue }
168- newValue = { diffContent . newValue }
169- splitView
170- styles = { diffViewerStyles }
171- useDarkTheme = { theme === "dark" }
172- showDiffOnly = { false }
173- leftTitle = { `v${ targetVersion } ` }
174- rightTitle = { `v${ baseVersion } ` }
175- />
183+ < div className = "min-w-fit" >
184+ < ReactDiffViewer
185+ oldValue = { diffContent . oldValue }
186+ newValue = { diffContent . newValue }
187+ splitView
188+ styles = { diffViewerStyles }
189+ useDarkTheme = { theme === "dark" }
190+ showDiffOnly = { showDiffOnly }
191+ leftTitle = { `v${ targetVersion } ` }
192+ rightTitle = { `v${ baseVersion } ` }
193+ />
194+ </ div >
176195 </ div >
177196 </ div >
178197 </ motion . div >
0 commit comments