@@ -5,6 +5,7 @@ import { useExtensionState } from "@/context/ExtensionStateContext"
5
5
import { vscode } from "@/utils/vscode"
6
6
import { useDebouncedAction } from "@/hooks/useDebouncedAction"
7
7
import { EXPERIMENT_IDS } from "../../../../src/shared/experiments"
8
+ import styles from "./FilesChangedOverview.module.css"
8
9
9
10
// Helper functions for file path display
10
11
const getFileName = ( uri : string ) : string => {
@@ -35,6 +36,12 @@ const FilesChangedOverview: React.FC = () => {
35
36
const [ changeset , setChangeset ] = React . useState < FileChangeset | null > ( null )
36
37
const [ isInitialized , setIsInitialized ] = React . useState ( false )
37
38
39
+ // Refs for dynamic CSS custom properties
40
+ const headerRef = React . useRef < HTMLDivElement > ( null )
41
+ const contentRef = React . useRef < HTMLDivElement > ( null )
42
+ const virtualizationContainerRef = React . useRef < HTMLDivElement > ( null )
43
+ const virtualizationOffsetRef = React . useRef < HTMLDivElement > ( null )
44
+
38
45
const files = React . useMemo < FileChange [ ] > ( ( ) => changeset ?. files ?? [ ] , [ changeset ?. files ] )
39
46
const [ isCollapsed , setIsCollapsed ] = React . useState ( true )
40
47
@@ -63,6 +70,32 @@ const FilesChangedOverview: React.FC = () => {
63
70
64
71
const { items : visibleItems , totalHeight, offsetY } = virtualizationState
65
72
73
+ // Update CSS custom properties for dynamic styling
74
+ React . useEffect ( ( ) => {
75
+ if ( headerRef . current ) {
76
+ const borderValue = isCollapsed ? "none" : "1px solid var(--vscode-panel-border)"
77
+ headerRef . current . style . setProperty ( "--header-border-bottom" , borderValue )
78
+ }
79
+ } , [ isCollapsed ] )
80
+
81
+ React . useEffect ( ( ) => {
82
+ if ( contentRef . current ) {
83
+ contentRef . current . style . setProperty ( "--content-opacity" , isCollapsed ? "0" : "1" )
84
+ }
85
+ } , [ isCollapsed ] )
86
+
87
+ React . useEffect ( ( ) => {
88
+ if ( virtualizationContainerRef . current && shouldVirtualize ) {
89
+ virtualizationContainerRef . current . style . setProperty ( "--virtualization-height" , `${ totalHeight } px` )
90
+ }
91
+ } , [ totalHeight , shouldVirtualize ] )
92
+
93
+ React . useEffect ( ( ) => {
94
+ if ( virtualizationOffsetRef . current && shouldVirtualize ) {
95
+ virtualizationOffsetRef . current . style . setProperty ( "--virtualization-transform" , `translateY(${ offsetY } px)` )
96
+ }
97
+ } , [ offsetY , shouldVirtualize ] )
98
+
66
99
// Debounced click handling for double-click prevention
67
100
const { isProcessing, handleWithDebounce } = useDebouncedAction ( 300 )
68
101
@@ -230,10 +263,8 @@ const FilesChangedOverview: React.FC = () => {
230
263
data-testid = "files-changed-overview" >
231
264
{ /* Collapsible header */ }
232
265
< div
233
- className = "flex justify-between items-center mt-0 cursor-pointer select-none"
234
- style = { {
235
- borderBottom : isCollapsed ? "none" : "1px solid var(--vscode-panel-border)" ,
236
- } }
266
+ ref = { headerRef }
267
+ className = { `flex justify-between items-center mt-0 cursor-pointer select-none ${ styles . header } ` }
237
268
onClick = { ( ) => setIsCollapsed ( ! isCollapsed ) }
238
269
onKeyDown = { ( e ) => {
239
270
if ( e . key === "Enter" || e . key === " " ) {
@@ -300,16 +331,14 @@ const FilesChangedOverview: React.FC = () => {
300
331
{ /* Collapsible content area */ }
301
332
{ ! isCollapsed && (
302
333
< div
303
- className = "max-h-[300px] overflow-y-auto transition-opacity duration-200 ease-in-out relative pt-2"
304
- style = { {
305
- opacity : isCollapsed ? 0 : 1 ,
306
- } }
334
+ ref = { contentRef }
335
+ className = { styles . content }
307
336
onScroll = { handleScroll }
308
337
role = "region"
309
338
aria-label = { t ( "file-changes:header.files_changed" , { defaultValue : "Files changed" } ) } >
310
339
{ shouldVirtualize && (
311
- < div style = { { height : totalHeight , position : "relative" } } >
312
- < div style = { { transform : `translateY( ${ offsetY } px)` } } >
340
+ < div ref = { virtualizationContainerRef } className = { styles . virtualizationContainer } >
341
+ < div ref = { virtualizationOffsetRef } className = { styles . virtualizationOffset } >
313
342
{ visibleItems . map ( ( file ) => (
314
343
< FileItem
315
344
key = { file . uri }
0 commit comments