@@ -15,6 +15,7 @@ import {
1515 RevealInEditorCmd ,
1616 SelectedCmd ,
1717 ReadyCmd ,
18+ RenderedCmd ,
1819 RunDocifyCmd ,
1920 RequestModelDataCmd ,
2021 RequestTemplateDataCmd ,
@@ -76,7 +77,9 @@ export class CalmPreviewPanel {
7677 ] ,
7778 } )
7879 CalmPreviewPanel . currentPanel = new CalmPreviewPanel ( panel , context , config , log )
79- CalmPreviewPanel . currentPanel . reveal ( uri )
80+ // createWebviewPanel already shows the panel; calling reveal() here causes a
81+ // blank first paint on VSCode 1.116+. Initialize state without re-revealing.
82+ CalmPreviewPanel . currentPanel . reveal ( uri , { revealPanel : false } )
8083 return CalmPreviewPanel . currentPanel
8184 }
8285
@@ -111,7 +114,8 @@ export class CalmPreviewPanel {
111114 ] ,
112115 } )
113116 CalmPreviewPanel . currentPanel = new CalmPreviewPanel ( panel , context , config , log , viewModel )
114- CalmPreviewPanel . currentPanel . reveal ( uri )
117+ // See note in createOrShow: skip panel.reveal() on brand-new panels.
118+ CalmPreviewPanel . currentPanel . reveal ( uri , { revealPanel : false } )
115119 return CalmPreviewPanel . currentPanel
116120 }
117121
@@ -138,6 +142,7 @@ export class CalmPreviewPanel {
138142 this . commands . register ( new RevealInEditorCmd ( this ) )
139143 this . commands . register ( new SelectedCmd ( this ) )
140144 this . commands . register ( new ReadyCmd ( this ) )
145+ this . commands . register ( new RenderedCmd ( this ) )
141146 this . commands . register ( new RunDocifyCmd ( this ) )
142147 this . commands . register ( new RequestModelDataCmd ( this ) )
143148 this . commands . register ( new RequestTemplateDataCmd ( this ) )
@@ -212,7 +217,8 @@ export class CalmPreviewPanel {
212217 }
213218
214219 /** --------- public API - now delegates to ViewModel --------- */
215- reveal ( uri : vscode . Uri ) {
220+ reveal ( uri : vscode . Uri , options : { revealPanel ?: boolean } = { } ) {
221+ const revealPanel = options . revealPanel !== false
216222 this . viewModel . setCurrentUri ( uri . fsPath )
217223 const fileInfo = detectFileType ( uri . fsPath )
218224 const isTemplateMode = fileInfo . type === FileType . TemplateFile && fileInfo . isValid
@@ -245,7 +251,9 @@ export class CalmPreviewPanel {
245251
246252 // Don't trigger docify immediately here - let refreshForDocument handle it after selection is determined
247253
248- this . panel . reveal ( vscode . ViewColumn . Beside )
254+ if ( revealPanel ) {
255+ this . panel . reveal ( vscode . ViewColumn . Beside )
256+ }
249257 }
250258
251259 getCurrentUri ( ) : vscode . Uri | undefined {
@@ -273,6 +281,7 @@ export class CalmPreviewPanel {
273281 dispose ( ) {
274282 this . viewModel . setVisible ( false )
275283 this . viewModel . setReady ( false ) // Reset ready state so new panel can trigger state changes
284+ this . viewModel . setRendered ( false ) // Reset rendered probe so next panel gets a fresh paint check
276285 this . viewModel . clearCurrentUri ( ) // Clear URI so reopening will trigger proper data loading
277286 CalmPreviewPanel . currentPanel = undefined
278287 while ( this . disposables . length ) {
@@ -297,6 +306,11 @@ export class CalmPreviewPanel {
297306 this . viewModel . handleReady ( )
298307 }
299308
309+ public handleRendered ( ) {
310+ this . log . info ( '[preview] handleRendered() called - webview compositor produced a frame' )
311+ this . viewModel . handleRendered ( )
312+ }
313+
300314 public handleRunDocify ( ) {
301315 this . viewModel . handleRunDocify ( )
302316 }
0 commit comments