@@ -5,6 +5,7 @@ import { useExtensionState } from "@/context/ExtensionStateContext"
55import { vscode } from "@/utils/vscode"
66import { useDebouncedAction } from "@/hooks/useDebouncedAction"
77import { EXPERIMENT_IDS } from "../../../../src/shared/experiments"
8+ import styles from "./FilesChangedOverview.module.css"
89
910// Helper functions for file path display
1011const getFileName = ( uri : string ) : string => {
@@ -35,6 +36,12 @@ const FilesChangedOverview: React.FC = () => {
3536 const [ changeset , setChangeset ] = React . useState < FileChangeset | null > ( null )
3637 const [ isInitialized , setIsInitialized ] = React . useState ( false )
3738
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+
3845 const files = React . useMemo < FileChange [ ] > ( ( ) => changeset ?. files ?? [ ] , [ changeset ?. files ] )
3946 const [ isCollapsed , setIsCollapsed ] = React . useState ( true )
4047
@@ -63,6 +70,32 @@ const FilesChangedOverview: React.FC = () => {
6370
6471 const { items : visibleItems , totalHeight, offsetY } = virtualizationState
6572
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+
6699 // Debounced click handling for double-click prevention
67100 const { isProcessing, handleWithDebounce } = useDebouncedAction ( 300 )
68101
@@ -230,10 +263,8 @@ const FilesChangedOverview: React.FC = () => {
230263 data-testid = "files-changed-overview" >
231264 { /* Collapsible header */ }
232265 < 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 } ` }
237268 onClick = { ( ) => setIsCollapsed ( ! isCollapsed ) }
238269 onKeyDown = { ( e ) => {
239270 if ( e . key === "Enter" || e . key === " " ) {
@@ -300,16 +331,14 @@ const FilesChangedOverview: React.FC = () => {
300331 { /* Collapsible content area */ }
301332 { ! isCollapsed && (
302333 < 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 }
307336 onScroll = { handleScroll }
308337 role = "region"
309338 aria-label = { t ( "file-changes:header.files_changed" , { defaultValue : "Files changed" } ) } >
310339 { 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 } >
313342 { visibleItems . map ( ( file ) => (
314343 < FileItem
315344 key = { file . uri }
0 commit comments