From b304e841de5ee97834006b334818e1cb68dd7d10 Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Fri, 6 Feb 2026 12:04:32 +0300 Subject: [PATCH] feat(ComparisonSlider): integrate loader and add animations for appearance/disappearance --- .../ComparisonSlider/ComparisonSlider.svelte | 64 +++++++++++-------- .../components/ControlsWrapper.svelte | 3 + .../ComparisonSlider/components/Labels.svelte | 3 + 3 files changed, 43 insertions(+), 27 deletions(-) diff --git a/src/widgets/ComparisonSlider/ui/ComparisonSlider/ComparisonSlider.svelte b/src/widgets/ComparisonSlider/ui/ComparisonSlider/ComparisonSlider.svelte index 2120233..bcd3eef 100644 --- a/src/widgets/ComparisonSlider/ui/ComparisonSlider/ComparisonSlider.svelte +++ b/src/widgets/ComparisonSlider/ui/ComparisonSlider/ComparisonSlider.svelte @@ -15,8 +15,10 @@ import { createTypographyControl, } from '$shared/lib'; import type { LineData } from '$shared/lib'; +import { Loader } from '$shared/ui'; import { comparisonStore } from '$widgets/ComparisonSlider/model'; import { Spring } from 'svelte/motion'; +import { fade } from 'svelte/transition'; import CharacterSlot from './components/CharacterSlot.svelte'; import ControlsWrapper from './components/ControlsWrapper.svelte'; import Labels from './components/Labels.svelte'; @@ -26,6 +28,8 @@ import SliderLine from './components/SliderLine.svelte'; const fontA = $derived(comparisonStore.fontA); const fontB = $derived(comparisonStore.fontB); +const isLoading = $derived(comparisonStore.isLoading || !comparisonStore.isReady); + let container: HTMLElement | undefined = $state(); let controlsWrapperElement = $state(null); let measureCanvas: HTMLCanvasElement | undefined = $state(); @@ -164,31 +168,33 @@ $effect(() => { {/snippet} -{#if fontA && fontB} - - + + -
-
- +
+
+ + {#if isLoading} + + {:else}
{#each charComparison.lines as line, lineIndex}
{
-
+ {/if} +
+ {#if fontA && fontB && !isLoading} { {sizeControl} {heightControl} /> -
-{/if} + {/if} +
diff --git a/src/widgets/ComparisonSlider/ui/ComparisonSlider/components/ControlsWrapper.svelte b/src/widgets/ComparisonSlider/ui/ComparisonSlider/components/ControlsWrapper.svelte index c23106b..7dd0fe7 100644 --- a/src/widgets/ComparisonSlider/ui/ComparisonSlider/components/ControlsWrapper.svelte +++ b/src/widgets/ComparisonSlider/ui/ComparisonSlider/components/ControlsWrapper.svelte @@ -12,6 +12,7 @@ import { ComboControlV2 } from '$shared/ui'; import { ExpandableWrapper } from '$shared/ui'; import AArrowUP from '@lucide/svelte/icons/a-arrow-up'; import { Spring } from 'svelte/motion'; +import { fade } from 'svelte/transition'; interface Props { /** @@ -121,6 +122,8 @@ $effect(() => { translateX({xSpring.current}px) rotateZ({rotateSpring.current}deg) " + in:fade={{ duration: 300, delay: 300 }} + out:fade={{ duration: 300, delay: 300 }} > { /** @@ -60,6 +61,8 @@ function selectFontB(font: UnifiedFont) {
e.stopPropagation())} + in:fade={{ duration: 300, delay: 300 }} + out:fade={{ duration: 300, delay: 300 }} >