Skip to content

Commit 80d9758

Browse files
committed
refactor: streamline element movement logic and enhance transition effects
1 parent 513f5a3 commit 80d9758

1 file changed

Lines changed: 43 additions & 36 deletions

File tree

src/pages/forge/_main.ts

Lines changed: 43 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ function passiveUpdateElement() {
131131
}
132132

133133
async 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

309310
function 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

381388
function disableGame() {

0 commit comments

Comments
 (0)