@@ -87,13 +87,21 @@ export function revealCompletedBoundariesWithViewTransitions(
8787) {
8888 let shouldStartViewTransition = false ;
8989 let autoNameIdx = 0 ;
90+ const restoreQueue = [ ] ;
9091 function applyViewTransitionName ( element , classAttributeName ) {
9192 const className = element . getAttribute ( classAttributeName ) ;
9293 if ( ! className || className === 'none' ) {
9394 return ;
9495 }
96+ // Add any elements we apply a name to a queue to be reverted when we start.
97+ const elementStyle = element . style ;
98+ restoreQueue . push (
99+ element ,
100+ elementStyle [ 'viewTransitionName' ] ,
101+ elementStyle [ 'viewTransitionClass' ] ,
102+ ) ;
95103 if ( className !== 'auto' ) {
96- element . style [ 'viewTransitionClass' ] = className ;
104+ elementStyle [ 'viewTransitionClass' ] = className ;
97105 }
98106 let name = element . getAttribute ( 'vt-name' ) ;
99107 if ( ! name ) {
@@ -103,7 +111,7 @@ export function revealCompletedBoundariesWithViewTransitions(
103111 const idPrefix = '' ;
104112 name = '\u00AB' + idPrefix + 'T' + autoNameIdx ++ + '\u00BB' ;
105113 }
106- element . style [ 'viewTransitionName' ] = name ;
114+ elementStyle [ 'viewTransitionName' ] = name ;
107115 shouldStartViewTransition = true ;
108116 }
109117 try {
@@ -240,7 +248,19 @@ export function revealCompletedBoundariesWithViewTransitions(
240248 types : [ ] , // TODO: Add a hard coded type for Suspense reveals.
241249 } ) ) ;
242250 transition . ready . finally ( ( ) => {
243- // TODO
251+ // Restore all the names/classes that we applied to what they were before.
252+ // We do it in reverse order in case there were duplicates so the first one wins.
253+ for ( let i = restoreQueue . length - 3 ; i >= 0 ; i -= 3 ) {
254+ const element = restoreQueue [ i ] ;
255+ const elementStyle = element . style ;
256+ const previousName = restoreQueue [ i + 1 ] ;
257+ elementStyle [ 'viewTransitionName' ] = previousName ;
258+ const previousClassName = restoreQueue [ i + 1 ] ;
259+ elementStyle [ 'viewTransitionClass' ] = previousClassName ;
260+ if ( element . getAttribute ( 'style' ) === '' ) {
261+ element . removeAttribute ( 'style' ) ;
262+ }
263+ }
244264 } ) ;
245265 transition . finished . finally ( ( ) => {
246266 if ( document [ '__reactViewTransition' ] === transition ) {
0 commit comments