@@ -47,6 +47,7 @@ export interface DiffRenderableOptions extends RenderableOptions<DiffRenderable>
4747 removedSignColor ?: string | RGBA
4848 addedLineNumberBg ?: string | RGBA
4949 removedLineNumberBg ?: string | RGBA
50+ onHighlightComplete ?: ( ) => void
5051}
5152
5253export class DiffRenderable extends Renderable {
@@ -106,6 +107,9 @@ export class DiffRenderable extends Renderable {
106107 private errorTextRenderable : TextRenderable | null = null
107108 private errorCodeRenderable : CodeRenderable | null = null
108109
110+ private _onHighlightComplete ?: ( ) => void
111+ private _pendingHighlights = 0
112+
109113 constructor ( ctx : RenderContext , options : DiffRenderableOptions ) {
110114 super ( ctx , {
111115 ...options ,
@@ -141,6 +145,7 @@ export class DiffRenderable extends Renderable {
141145 this . _removedSignColor = parseColor ( options . removedSignColor ?? "#ef4444" )
142146 this . _addedLineNumberBg = parseColor ( options . addedLineNumberBg ?? "transparent" )
143147 this . _removedLineNumberBg = parseColor ( options . removedLineNumberBg ?? "transparent" )
148+ this . _onHighlightComplete = options . onHighlightComplete
144149
145150 // Only parse and build if diff is provided
146151 if ( this . _diff ) {
@@ -240,6 +245,13 @@ export class DiffRenderable extends Renderable {
240245 super . destroyRecursively ( )
241246 }
242247
248+ private handleHighlightComplete ( ) : void {
249+ this . _pendingHighlights --
250+ if ( this . _pendingHighlights === 0 && this . _onHighlightComplete ) {
251+ this . _onHighlightComplete ( )
252+ }
253+ }
254+
243255 /**
244256 * Create or update a CodeRenderable with the given content and options.
245257 * Reuses existing instances to avoid expensive recreation.
@@ -315,6 +327,10 @@ export class DiffRenderable extends Renderable {
315327 ) : CodeRenderable {
316328 const existingRenderable = side === "left" ? this . leftCodeRenderable : this . rightCodeRenderable
317329
330+ if ( this . _filetype ) {
331+ this . _pendingHighlights ++
332+ }
333+
318334 if ( ! existingRenderable ) {
319335 // Create new CodeRenderable
320336 const codeOptions : CodeOptions = {
@@ -326,6 +342,7 @@ export class DiffRenderable extends Renderable {
326342 syntaxStyle : this . _syntaxStyle ?? SyntaxStyle . create ( ) ,
327343 width : "100%" ,
328344 height : "100%" ,
345+ onHighlightComplete : ( ) => this . handleHighlightComplete ( ) ,
329346 ...( this . _fg !== undefined && { fg : this . _fg } ) ,
330347 ...( drawUnstyledText !== undefined && { drawUnstyledText } ) ,
331348 ...( this . _selectionBg !== undefined && { selectionBg : this . _selectionBg } ) ,
@@ -346,6 +363,7 @@ export class DiffRenderable extends Renderable {
346363 existingRenderable . content = content
347364 existingRenderable . wrapMode = wrapMode ?? "none"
348365 existingRenderable . conceal = this . _conceal
366+ existingRenderable . onHighlightComplete = ( ) => this . handleHighlightComplete ( )
349367 if ( drawUnstyledText !== undefined ) {
350368 existingRenderable . drawUnstyledText = drawUnstyledText
351369 }
0 commit comments