@@ -3474,16 +3474,29 @@ impl VisitMut for CodePressTransform {
34743474
34753475 // JS-based metadata map mode: store metadata in window.__CODEPRESS_MAP__ instead of DOM
34763476 // Only codepress-data-fp attribute is on DOM (already added above at line 3273-3278)
3477- // No wrapper elements, no additional DOM attributes - cleanest possible approach
34783477 if self . use_js_metadata_map {
34793478 // Store metadata in the map keyed by fp
34803479 self . metadata_map . insert ( fp_value. clone ( ) , MetadataEntry {
3481- callsite : callsite_value,
3480+ callsite : callsite_value. clone ( ) ,
34823481 edit_candidates : cands_enc. clone ( ) ,
34833482 source_kinds : kinds_enc. clone ( ) ,
34843483 symbol_refs : symrefs_enc. clone ( ) ,
34853484 } ) ;
3486- // No DOM attributes or wrappers needed - extension reads from JS map
3485+
3486+ // For custom components, still wrap with __CPProvider for HMR support
3487+ // The provider uses useSyncExternalStore to trigger re-renders on preview updates
3488+ // Without this, HMR preview updates don't trigger proper re-renders
3489+ if is_custom_call && !block_provider && !self . skip_provider_wrap {
3490+ let meta = ProviderMeta {
3491+ cs : callsite_value,
3492+ c : cands_enc,
3493+ k : kinds_enc,
3494+ fp : fp_value,
3495+ } ;
3496+ self . wrap_with_provider ( node, meta) ;
3497+ }
3498+
3499+ // No DOM attributes needed - extension reads from JS map
34873500 return ;
34883501 }
34893502
0 commit comments