refactor: rethink ProcessStep transition + use tick in transitions

This commit is contained in:
2024-08-05 16:28:14 +02:00
parent 1cc143ef27
commit 191e1ef847
3 changed files with 46 additions and 46 deletions

View File

@@ -9,13 +9,11 @@ import { quartOut } from './easings'
export const scaleFade = (node: HTMLElement, { export const scaleFade = (node: HTMLElement, {
scale = [0.7, 1], scale = [0.7, 1],
opacity = [1, 0], opacity = [1, 0],
x = null, x = [0, 0],
delay = 0, delay = 0,
duration = 1, duration = 0.75,
}): TransitionConfig => { }): TransitionConfig => {
return { const anim = animate(node, {
css: () => {
animate(node, {
scale, scale,
opacity, opacity,
x, x,
@@ -26,7 +24,10 @@ export const scaleFade = (node: HTMLElement, {
delay, delay,
}) })
return null return {
duration: anim.duration * 1000,
tick: (t) => {
anim.currentTime = t
} }
} }
} }
@@ -42,9 +43,7 @@ export const revealSplit = (node: HTMLElement, {
duration = 1, duration = 1,
delay = 0, delay = 0,
}): TransitionConfig => { }): TransitionConfig => {
return { const anim = animate(node.querySelectorAll(children), {
css: () => {
animate(node.querySelectorAll(children), {
opacity, opacity,
y, y,
z: 0, z: 0,
@@ -54,7 +53,10 @@ export const revealSplit = (node: HTMLElement, {
delay: stagger(0.04, { start: delay }), delay: stagger(0.04, { start: delay }),
}) })
return null return {
duration: anim.duration * 1000,
tick: (t) => {
anim.currentTime = t
} }
} }
} }

View File

@@ -3,18 +3,18 @@
</style> </style>
<script lang="ts"> <script lang="ts">
import { scale } from 'svelte/transition'
import { quartOut } from 'svelte/easing'
import { scaleFade } from '$animations/transitions' import { scaleFade } from '$animations/transitions'
// Components // Components
import Image from '$components/atoms/Image.svelte' import Image from '$components/atoms/Image.svelte'
import { getAssetUrlKey } from '$utils/api' import { getAssetUrlKey } from '$utils/api'
let { let {
index,
text, text,
image, image,
video, video,
}: { }: {
index: number
text: string text: string
image?: any image?: any
video?: any video?: any
@@ -25,9 +25,8 @@
<div <div
class="step grid" class="step grid"
style:--index={index}
in:scaleFade|local={{ scale: [1.1, 1], opacity: [0, 1], x: [20, 0], delay: 0.2 }} in:scaleFade|local={{ scale: [1.1, 1], opacity: [0, 1], x: [20, 0], delay: 0.2 }}
out:scaleFade|local={{ scale: [1, 0.9], opacity: [1, 0], x: [0, -20] }} out:scale={{ start: 0.9, duration: 750, easing: quartOut }}
> >
{#if image || video} {#if image || video}
<div class="media"> <div class="media">

View File

@@ -26,7 +26,8 @@
let innerWidth = $state<number>() let innerWidth = $state<number>()
let photosGridEl: HTMLElement let photosGridEl: HTMLElement
let photosGridParallax = $state<number>() let photosGridParallax = $state<number>()
let currentStep = $state(0) let currentStepIndex = $state(0)
const currentStep = $derived(data.about.process_steps[currentStepIndex])
let emailCopied = $state<string>() let emailCopied = $state<string>()
let emailCopiedTimeout: ReturnType<typeof setTimeout> | number let emailCopiedTimeout: ReturnType<typeof setTimeout> | number
@@ -312,13 +313,13 @@
<ol> <ol>
{#each data.about.process_steps as { title }, index} {#each data.about.process_steps as { title }, index}
<li class:is-active={index === currentStep}> <li class:is-active={index === currentStepIndex}>
<a <a
class="title-big" class="title-big"
href="#step-{index + 1}" href="#step-{index + 1}"
onclick={(event) => { onclick={(event) => {
event.preventDefault() event.preventDefault()
currentStep = index currentStepIndex = index
sendEvent('aboutStepSwitch') sendEvent('aboutStepSwitch')
}} }}
> >
@@ -330,18 +331,16 @@
</aside> </aside>
<div class="steps"> <div class="steps">
{#each data.about.process_steps as { text, image, video_mp4, video_webm }, index} {#key currentStep}
{#if index === currentStep}
<ProcessStep <ProcessStep
{index} {text} text={currentStep.text}
image={image ?? undefined} image={currentStep.image}
video={{ video={{
mp4: video_mp4?.id, mp4: currentStep.video_mp4?.id,
webm: video_webm?.id webm: currentStep.video_webm?.id
}} }}
/> />
{/if} {/key}
{/each}
</div> </div>
</div> </div>
</section> </section>