feat: better bg gradient transition

This commit is contained in:
not-nullptr 2025-04-16 16:10:33 +01:00
parent 1b55dcc005
commit 4e18269204
2 changed files with 196 additions and 58 deletions

View File

@ -44,6 +44,11 @@
--accent-green-alt: hsl(140, 66%, 55%); --accent-green-alt: hsl(140, 66%, 55%);
--accent: var(--accent-pink); --accent: var(--accent-pink);
--accent-alt: var(--accent-pink-alt); --accent-alt: var(--accent-pink-alt);
--accent-pink-transparent: hsla(303, 100%, 50%, 0);
--accent-red-transparent: hsla(348, 100%, 50%, 0);
--accent-purple-transparent: hsla(264, 100%, 50%, 0);
--accent-blue-transparent: hsla(220, 100%, 50%, 0);
--accent-green-transparent: hsla(140, 70%, 30%, 0);
// foregrounds // foregrounds
--fg: hsl(0, 0%, 0%); --fg: hsl(0, 0%, 0%);
@ -56,65 +61,91 @@
// backgrounds // backgrounds
--bg: hsl(0, 0%, 95%); --bg: hsl(0, 0%, 95%);
--bg-gradient-from: var(--accent-pink);
--bg-gradient-to: hsla(303, 100%, 50%, 0);
--bg-gradient-pink-from: var(--accent-pink);
--bg-gradient-pink-to: hsla(303, 100%, 50%, 0);
--bg-gradient-pink-alt-from: var(--accent-pink);
--bg-gradient-pink-alt-to: hsl(303, 100%, 91%);
--bg-gradient-red-from: var(--accent-red);
--bg-gradient-red-to: hsla(348, 100%, 50%, 0);
--bg-gradient-red-alt-from: var(--accent-red);
--bg-gradient-red-alt-to: hsl(348, 100%, 91%);
--bg-gradient-purple-from: var(--accent-purple);
--bg-gradient-purple-to: hsla(264, 100%, 50%, 0);
--bg-gradient-purple-alt-from: var(--accent-purple);
--bg-gradient-purple-alt-to: hsl(264, 100%, 91%);
--bg-gradient-blue-from: var(--accent-blue);
--bg-gradient-blue-to: hsla(220, 100%, 50%, 0);
--bg-gradient-blue-alt-from: var(--accent-blue);
--bg-gradient-blue-alt-to: hsl(220, 100%, 91%);
--bg-gradient-green-from: var(--accent-green);
--bg-gradient-green-to: hsla(140, 70%, 30%, 0);
--bg-gradient-green-alt-from: var(--accent-green-alt);
--bg-gradient-green-alt-to: hsl(140, 70%, 91%);
--bg-gradient-image-from: hsla(0, 0%, 95%, 0.5);
--bg-gradient-image-to: hsla(0, 0%, 95%, 1);
--bg-gradient: linear-gradient( --bg-gradient: linear-gradient(
to bottom, to bottom,
var(--accent-pink), var(--bg-gradient-from),
hsla(303, 100%, 50%, 0) 100% var(--bg-gradient-to) 100%
); );
--bg-gradient-pink: linear-gradient( --bg-gradient-pink: linear-gradient(
to bottom, to bottom,
var(--accent-pink), var(--bg-gradient-pink-from),
hsla(303, 100%, 50%, 0) 25% var(--bg-gradient-pink-to) 25%
); );
--bg-gradient-pink-alt: linear-gradient( --bg-gradient-pink-alt: linear-gradient(
to top, to top,
var(--accent-pink), var(--bg-gradient-pink-alt-from),
hsl(303, 100%, 91%) 100% var(--bg-gradient-pink-alt-to) 100%
); );
--bg-gradient-red: linear-gradient( --bg-gradient-red: linear-gradient(
to bottom, to bottom,
var(--accent-red), var(--bg-gradient-red-from),
hsla(348, 100%, 50%, 0) 25% var(--bg-gradient-red-to) 25%
); );
--bg-gradient-red-alt: linear-gradient( --bg-gradient-red-alt: linear-gradient(
to top, to top,
var(--accent-red), var(--bg-gradient-red-alt-from),
hsl(348, 100%, 91%) 100% var(--bg-gradient-red-alt-to) 100%
); );
--bg-gradient-purple: linear-gradient( --bg-gradient-purple: linear-gradient(
to bottom, to bottom,
var(--accent-purple), var(--bg-gradient-purple-from),
hsla(264, 100%, 50%, 0) 25% var(--bg-gradient-purple-to) 25%
); );
--bg-gradient-purple-alt: linear-gradient( --bg-gradient-purple-alt: linear-gradient(
to top, to top,
var(--accent-purple), var(--bg-gradient-purple-alt-from),
hsl(264, 100%, 91%) 100% var(--bg-gradient-purple-alt-to) 100%
); );
--bg-gradient-blue: linear-gradient( --bg-gradient-blue: linear-gradient(
to bottom, to bottom,
var(--accent-blue), var(--bg-gradient-blue-from),
hsla(220, 100%, 50%, 0) 25% var(--bg-gradient-blue-to) 25%
); );
--bg-gradient-blue-alt: linear-gradient( --bg-gradient-blue-alt: linear-gradient(
to top, to top,
var(--accent-blue), var(--bg-gradient-blue-alt-from),
hsl(220, 100%, 91%) 100% var(--bg-gradient-blue-alt-to) 100%
); );
--bg-gradient-green: linear-gradient( --bg-gradient-green: linear-gradient(
to bottom, to bottom,
var(--accent-green), var(--bg-gradient-green-from),
hsla(140, 70%, 30%, 0) 25% var(--bg-gradient-green-to) 25%
); );
--bg-gradient-green-alt: linear-gradient( --bg-gradient-green-alt: linear-gradient(
to top, to top,
var(--accent-green-alt), var(--bg-gradient-green-alt-from),
hsl(140, 70%, 91%) 100% var(--bg-gradient-green-alt-to) 100%
); );
--bg-gradient-image: linear-gradient( --bg-gradient-image: linear-gradient(
to bottom, to bottom,
hsla(0, 0%, 95%, 0.5), var(--bg-gradient-image-from),
hsla(0, 0%, 95%, 1) 100% var(--bg-gradient-image-to) 100%
); );
--bg-panel: hsl(0, 0%, 100%); --bg-panel: hsl(0, 0%, 100%);
--bg-panel-highlight: hsl(0, 0%, 92%); --bg-panel-highlight: hsl(0, 0%, 92%);
@ -140,6 +171,11 @@
--accent-alt: var(--accent-pink-alt); --accent-alt: var(--accent-pink-alt);
--accent-green: hsl(140, 70%, 74%); --accent-green: hsl(140, 70%, 74%);
--accent-green-alt: hsl(140, 64%, 42%); --accent-green-alt: hsl(140, 64%, 42%);
--accent-pink-transparent: hsla(303, 100%, 50%, 0);
--accent-red-transparent: hsla(348, 100%, 50%, 0);
--accent-purple-transparent: hsla(264, 100%, 50%, 0);
--accent-blue-transparent: hsla(220, 100%, 50%, 0);
--accent-green-transparent: hsla(140, 70%, 30%, 0);
// foregrounds // foregrounds
--fg: hsl(0, 0%, 100%); --fg: hsl(0, 0%, 100%);
@ -151,65 +187,91 @@
// backgrounds // backgrounds
--bg: hsl(220, 5%, 15%); --bg: hsl(220, 5%, 15%);
--bg-gradient-from: hsla(303, 100%, 50%, 0.1);
--bg-gradient-to: hsla(303, 100%, 50%, 0);
--bg-gradient-pink-from: hsla(303, 100%, 50%, 0.1);
--bg-gradient-pink-to: hsla(303, 100%, 50%, 0);
--bg-gradient-pink-alt-from: var(--accent-pink);
--bg-gradient-pink-alt-to: hsl(303, 100%, 91%);
--bg-gradient-red-from: hsla(348, 100%, 50%, 0.1);
--bg-gradient-red-to: hsla(348, 100%, 50%, 0);
--bg-gradient-red-alt-from: var(--accent-red);
--bg-gradient-red-alt-to: hsl(348, 100%, 91%);
--bg-gradient-purple-from: hsla(264, 100%, 50%, 0.1);
--bg-gradient-purple-to: hsla(264, 100%, 50%, 0);
--bg-gradient-purple-alt-from: var(--accent-purple);
--bg-gradient-purple-alt-to: hsl(264, 100%, 91%);
--bg-gradient-blue-from: hsla(220, 100%, 50%, 0.1);
--bg-gradient-blue-to: hsla(220, 100%, 50%, 0);
--bg-gradient-blue-alt-from: var(--accent-blue);
--bg-gradient-blue-alt-to: hsl(220, 100%, 91%);
--bg-gradient-green-from: hsla(140, 70%, 30%, 0.1);
--bg-gradient-green-to: hsla(140, 70%, 30%, 0);
--bg-gradient-green-alt-from: var(--accent-green-alt);
--bg-gradient-green-alt-to: hsl(140, 70%, 91%);
--bg-gradient-image-from: hsla(220, 5%, 12%, 0.5);
--bg-gradient-image-to: hsla(220, 5%, 12%, 1);
--bg-gradient: linear-gradient( --bg-gradient: linear-gradient(
to bottom, to bottom,
hsla(303, 100%, 50%, 0.1), var(--bg-gradient-from),
hsla(303, 100%, 50%, 0) 100% var(--bg-gradient-to) 100%
); );
--bg-gradient-pink: linear-gradient( --bg-gradient-pink: linear-gradient(
to bottom, to bottom,
hsla(303, 100%, 50%, 0.1), var(--bg-gradient-pink-from),
hsla(303, 100%, 50%, 0) 25% var(--bg-gradient-pink-to) 25%
); );
--bg-gradient-pink-alt: linear-gradient( --bg-gradient-pink-alt: linear-gradient(
to top, to top,
var(--accent-pink), var(--bg-gradient-pink-alt-from),
hsl(303, 100%, 91%) 100% var(--bg-gradient-pink-alt-to) 100%
); );
--bg-gradient-red: linear-gradient( --bg-gradient-red: linear-gradient(
to bottom, to bottom,
hsla(348, 100%, 50%, 0.1), var(--bg-gradient-red-from),
hsla(348, 100%, 50%, 0) 25% var(--bg-gradient-red-to) 25%
); );
--bg-gradient-red-alt: linear-gradient( --bg-gradient-red-alt: linear-gradient(
to top, to top,
var(--accent-red), var(--bg-gradient-red-alt-from),
hsl(348, 100%, 91%) 100% var(--bg-gradient-red-alt-to) 100%
); );
--bg-gradient-purple: linear-gradient( --bg-gradient-purple: linear-gradient(
to bottom, to bottom,
hsla(264, 100%, 50%, 0.1), var(--bg-gradient-purple-from),
hsla(264, 100%, 50%, 0) 25% var(--bg-gradient-purple-to) 25%
); );
--bg-gradient-purple-alt: linear-gradient( --bg-gradient-purple-alt: linear-gradient(
to top, to top,
var(--accent-purple), var(--bg-gradient-purple-alt-from),
hsl(264, 100%, 91%) 100% var(--bg-gradient-purple-alt-to) 100%
); );
--bg-gradient-blue: linear-gradient( --bg-gradient-blue: linear-gradient(
to bottom, to bottom,
hsla(220, 100%, 50%, 0.1), var(--bg-gradient-blue-from),
hsla(220, 100%, 50%, 0) 25% var(--bg-gradient-blue-to) 25%
); );
--bg-gradient-blue-alt: linear-gradient( --bg-gradient-blue-alt: linear-gradient(
to top, to top,
var(--accent-blue), var(--bg-gradient-blue-alt-from),
hsl(220, 100%, 91%) 100% var(--bg-gradient-blue-alt-to) 100%
); );
--bg-gradient-green: linear-gradient( --bg-gradient-green: linear-gradient(
to bottom, to bottom,
hsla(140, 70%, 30%, 0.1), var(--bg-gradient-green-from),
hsla(140, 70%, 30%, 0) 25% var(--bg-gradient-green-to) 25%
); );
--bg-gradient-green-alt: linear-gradient( --bg-gradient-green-alt: linear-gradient(
to top, to top,
var(--accent-green-alt), var(--bg-gradient-green-alt-from),
hsl(140, 70%, 91%) 100% var(--bg-gradient-green-alt-to) 100%
); );
--bg-gradient-image: linear-gradient( --bg-gradient-image: linear-gradient(
to bottom, to bottom,
hsla(220, 5%, 12%, 0.5), var(--bg-gradient-image-from),
hsla(220, 5%, 12%, 1) 100% var(--bg-gradient-image-to) 100%
); );
--bg-panel: hsl(220, 4%, 24%); --bg-panel: hsl(220, 4%, 24%);
--bg-panel-highlight: hsl(220, 2%, 32%); --bg-panel-highlight: hsl(220, 2%, 32%);

View File

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { page } from "$app/state"; import { page } from "$app/state";
import { duration } from "$lib/animation"; import { duration, transition } from "$lib/animation";
import VertVBig from "$lib/assets/vert-bg.svg?component"; import VertVBig from "$lib/assets/vert-bg.svg?component";
import { import {
files, files,
@ -9,6 +9,63 @@
} from "$lib/store/index.svelte"; } from "$lib/store/index.svelte";
import { quintOut } from "svelte/easing"; import { quintOut } from "svelte/easing";
import { fade } from "$lib/animation"; import { fade } from "$lib/animation";
import { Tween } from "svelte/motion";
const colors: {
matcher: (path: string) => boolean;
color: string;
at: number;
}[] = $derived([
{
matcher: (path) => path === "/",
color: "var(--bg-gradient-from)",
at: 100,
},
{
matcher: (path) => path === "/convert/",
color: `var(--bg-gradient-${$gradientColor ? $gradientColor + "-" : ""}from)`,
at: 25,
},
{
matcher: (path) => path === "/settings/",
color: "var(--bg-gradient-blue-from)",
at: 25,
},
{
matcher: (path) => path === "/about/",
color: "var(--bg-gradient-from)",
at: 25,
},
{
matcher: (path) => path === "/jpegify/",
color: "var(--bg-gradient-red-from)",
at: 100,
},
]);
const color = $derived(
Object.values(colors).find((p) => p.matcher(page.url.pathname)) || {
matcher: () => false,
color: "transparent",
at: 0,
},
);
// svelte-ignore state_referenced_locally This is handled in the effect below
let at = new Tween(color.at, {
duration,
easing: quintOut,
});
$effect(() => {
at.set(color.at);
});
const maskImage = $derived(
`linear-gradient(to top, transparent ${100 - at.current}%, black 100%)`,
);
$inspect(colors);
</script> </script>
{#if page.url.pathname === "/"} {#if page.url.pathname === "/"}
@ -23,6 +80,33 @@
class="fill-[--fg] opacity-10 dynadark:opacity-5 scale-[200%] md:scale-[80%]" class="fill-[--fg] opacity-10 dynadark:opacity-5 scale-[200%] md:scale-[80%]"
/> />
</div> </div>
{/if}
<div
class="fixed top-0 left-0 w-screen h-screen -z-40 pointer-events-none"
style="background-color: {color.color};
mask-image: {maskImage};
-webkit-mask-image: {maskImage};
transition: background-color {duration}ms {transition};"
></div>
{#if page.url.pathname === "/convert/" && files.files.length === 1}
{@const bgMask =
"linear-gradient(to top, transparent 5%, rgba(0, 0, 0, 0.5) 100%)"}
<div
class="fixed top-0 left-0 w-screen h-screen -z-50"
style="background-image: url({files.files[0].blobUrl});
background-size: cover;
background-position: center;
background-repeat: no-repeat;
filter: blur(10px);
mask-image: {bgMask};
-webkit-mask-image: {bgMask};"
transition:fade={{ duration, easing: quintOut }}
></div>
{/if}
<!--
<div <div
id="gradient-bg" id="gradient-bg"
class="fixed top-0 left-0 w-screen h-screen -z-40 pointer-events-none" class="fixed top-0 left-0 w-screen h-screen -z-40 pointer-events-none"
@ -64,14 +148,6 @@
class="absolute top-0 left-0 w-full h-full" class="absolute top-0 left-0 w-full h-full"
style="background: var(--bg-gradient-image);" style="background: var(--bg-gradient-image);"
></div> ></div>
<!-- <div class="absolute bottom-0 left-0 w-full h-full">
<ProgressiveBlur
direction="bottom"
endIntensity={256}
iterations={8}
fadeTo="var(--bg)"
/>
</div> -->
</div> </div>
</div> </div>
{:else if page.url.pathname === "/settings/"} {:else if page.url.pathname === "/settings/"}
@ -94,4 +170,4 @@
easing: quintOut, easing: quintOut,
}} }}
></div> ></div>
{/if} {/if} -->