From ecb0d823bb7f6e5697cdd9f240934d13fe69ca0a Mon Sep 17 00:00:00 2001 From: tglide <26071571+TGlide@users.noreply.github.com> Date: Thu, 9 Mar 2023 12:08:59 +0000 Subject: [PATCH] feat: add stylish animation for secondary side nav --- src/lib/helpers/transition.ts | 48 +++++++++++++++++++ src/lib/layout/navigation.svelte | 5 +- .../secondSideNav.svelte | 8 ++-- 3 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 src/lib/helpers/transition.ts diff --git a/src/lib/helpers/transition.ts b/src/lib/helpers/transition.ts new file mode 100644 index 000000000..f8a80bd6b --- /dev/null +++ b/src/lib/helpers/transition.ts @@ -0,0 +1,48 @@ +import { cubicOut } from 'svelte/easing'; +import type { EasingFunction, TransitionConfig } from 'svelte/transition'; + +export interface SlideParams { + delay?: number; + duration?: number; + easing?: EasingFunction; + axis?: 'x' | 'y'; +} + +export function slide( + node: Element, + { delay = 0, duration = 400, easing = cubicOut, axis = 'y' }: SlideParams = {} +): TransitionConfig { + const style = getComputedStyle(node); + const opacity = +style.opacity; + const primary_property = axis === 'y' ? 'height' : 'width'; + const primary_property_value = parseFloat(style[primary_property]); + const secondary_properties = axis === 'y' ? ['top', 'bottom'] : ['left', 'right']; + const capitalized_secondary_properties = secondary_properties.map( + (e) => `${e[0].toUpperCase()}${e.slice(1)}` + ); + const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]); + const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]); + const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]); + const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]); + const border_width_start_value = parseFloat( + style[`border${capitalized_secondary_properties[0]}Width`] + ); + const border_width_end_value = parseFloat( + style[`border${capitalized_secondary_properties[1]}Width`] + ); + return { + delay, + duration, + easing, + css: (t) => + 'overflow: hidden;' + + `opacity: ${Math.min(t * 20, 1) * opacity};` + + `${primary_property}: ${t * primary_property_value}px;` + + `padding-${secondary_properties[0]}: ${t * padding_start_value}px;` + + `padding-${secondary_properties[1]}: ${t * padding_end_value}px;` + + `margin-${secondary_properties[0]}: ${t * margin_start_value}px;` + + `margin-${secondary_properties[1]}: ${t * margin_end_value}px;` + + `border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;` + + `border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;` + }; +} diff --git a/src/lib/layout/navigation.svelte b/src/lib/layout/navigation.svelte index 5acfc9244..77aa338b7 100644 --- a/src/lib/layout/navigation.svelte +++ b/src/lib/layout/navigation.svelte @@ -2,6 +2,7 @@ import { base } from '$app/paths'; import { page } from '$app/stores'; import { trackEvent } from '$lib/actions/analytics'; + import { slide } from '$lib/helpers/transition'; $: project = $page.params.project; $: projectPath = `${base}/console/project-${project}`; @@ -18,7 +19,7 @@ } -