@@ -131,6 +131,7 @@ function passiveUpdateElement() {
131131}
132132
133133async function initializeLevel ( ) {
134+ styles . replaceSync ( `` ) ;
134135 write ( "" ) ;
135136 disableGame ( ) ;
136137 levelState . tree = ( levelState . level + levelState . random ) % data . length ;
@@ -264,7 +265,7 @@ function stopMove(event: PointerEvent) {
264265 ::view-transition-group(.element) {
265266 top: 0px;
266267 left: 0px;
267- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
268+ transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1), left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
268269 }` ) ;
269270 }
270271 updateBreadcrumbs ( ) ;
@@ -279,7 +280,7 @@ function stopMove(event: PointerEvent) {
279280 write ( "No more moves. Try to go back!" , true ) ;
280281 }
281282 if ( elementName . innerText === targetName . innerText ) {
282- write ( "Congratulations! You've completed the level!" ) ;
283+ write ( "Congratulations! You've completed this level!" ) ;
283284 quickShot ( ) ;
284285 actionButtonText ( "NEXT LEVEL" ) ;
285286 actionButtonRelocate ( center ) ;
@@ -308,32 +309,14 @@ function move(event: PointerEvent) {
308309
309310function work ( ) {
310311
311- let top = moveState . top ;
312- let left = moveState . left ;
313312
314- const width = chambers [ 0 ] ! . getBoundingClientRect ( ) . width ;
315- const quarter = width / 4 ;
316- const distance = Math . sqrt ( top * top + left * left ) / width ;
317- if ( distance > 1.2 ) {
318- top /= distance / 1.2 ;
319- left /= distance / 1.2 ;
320- }
321- const current = levelState . elements . length - 1 ;
322- const where =
323- top > quarter && left > quarter
324- ? 3
325- : top > quarter && left < - quarter
326- ? 2
327- : top < - quarter && left > quarter
328- ? 1
329- : top < - quarter && left < - quarter
330- ? 0
331- : - 1 ;
313+ const { where, distance, top, left } = geometry ( moveState . top , moveState . left ) ;
332314
333315 chambers . forEach ( ( chamber ) => chamber . classList . remove ( "selected" ) ) ;
334316 if ( where !== - 1 ) {
335317 chambers [ where ] ! . classList . add ( "selected" ) ;
336318 }
319+ const current = levelState . elements . length - 1 ;
337320 const next = levelState . elements [ current - 1 ] ?. reactions [ where ] ?? - 1 ;
338321 if ( next !== - 1 ) {
339322 levelState . elements [ current ] = data [ levelState . tree ] ! . items [ next ] ! ;
@@ -351,9 +334,26 @@ function work() {
351334 } ;
352335 passiveUpdateElement ( ) ;
353336 }
337+ drag ( top , left , where , distance ) ;
338+ scrub ( distance ) ;
339+ }
340+
341+ function scrub ( distance : number ) {
342+ document . getAnimations ( ) . forEach ( ( animation ) => {
343+ if ( animation . effect ?. pseudoElement ?. startsWith (
344+ "::view-transition-new(element"
345+ ) ||
346+ animation . effect ?. pseudoElement ?. startsWith (
347+ "::view-transition-old(element"
348+ ) ) {
349+ animation . currentTime = Math . min ( 248 , ( distance - 0.5 ) * 240 ) ;
350+ }
351+ } ) ;
352+ }
353+
354+ function drag ( top : number , left : number , where : number , distance : number ) {
354355 styles . replaceSync ( `
355- ::view-transition-group(element-image),
356- ::view-transition-group(element) {
356+ ::view-transition-group(.element) {
357357 top: ${ top } px;
358358 left: ${ left } px;
359359 }
@@ -363,19 +363,26 @@ function work() {
363363 ::view-transition-image-pair(.element) {
364364 scale: ${ Math . min ( 2 , 1 + distance / 2 ) } ;
365365 }` ) ;
366+ }
366367
367- document . getAnimations ( ) . forEach ( ( animation ) => {
368- if (
369- animation . effect ?. pseudoElement ?. startsWith (
370- "::view-transition-new(element" ,
371- ) ||
372- animation . effect ?. pseudoElement ?. startsWith (
373- "::view-transition-old(element" ,
374- )
375- ) {
376- animation . currentTime = Math . min ( 248 , ( distance - 0.5 ) * 240 ) ;
377- }
378- } ) ;
368+ function geometry ( top : number , left : number ) {
369+ const width = chambers [ 0 ] ! . getBoundingClientRect ( ) . width ;
370+ const quarter = width / 4 ;
371+ const distance = Math . sqrt ( top * top + left * left ) / width ;
372+ if ( distance > 1.2 ) {
373+ top /= distance / 1.2 ;
374+ left /= distance / 1.2 ;
375+ }
376+ const where = top > quarter && left > quarter
377+ ? 3
378+ : top > quarter && left < - quarter
379+ ? 2
380+ : top < - quarter && left > quarter
381+ ? 1
382+ : top < - quarter && left < - quarter
383+ ? 0
384+ : - 1 ;
385+ return { where, distance, top, left } ;
379386}
380387
381388function disableGame ( ) {
0 commit comments