summaryrefslogtreecommitdiff
path: root/src/components/jet/today-card/media/TodayCardMediaRiver.svelte
blob: d3f96666076b48fd55f6ba4f8dfbdf0f990bdb80 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<script lang="ts" context="module">
    import type {
        TodayCardMedia,
        TodayCardMediaRiver,
    } from '@jet-app/app-store/api/models';

    export function isTodayCardMediaRiver(
        media: TodayCardMedia,
    ): media is TodayCardMediaRiver {
        return media.kind === 'river';
    }
</script>

<script lang="ts">
    import {
        getBackgroundGradientCSSVarsFromArtworks,
        getLuminanceForRGB,
    } from '~/utils/color';
    import AppIconRiver from '~/components/AppIconRiver.svelte';

    /**
     * The actual properties of {@linkcode TodayCardMediaRiver} that are required
     * to render this component
     */
    type TodayCardMediaRiverRequirements = Pick<TodayCardMediaRiver, 'lockups'>;

    export let media: TodayCardMediaRiverRequirements;

    $: icons = media.lockups.map((lockup) => lockup.icon);
    $: backgroundGradientCssVars = getBackgroundGradientCSSVarsFromArtworks(
        icons,
        {
            // sorts from darkest to lightest
            sortFn: (a, b) => getLuminanceForRGB(a) - getLuminanceForRGB(b),
        },
    );
</script>

<div class="container" style={backgroundGradientCssVars}>
    {#if icons.length}
        <AppIconRiver {icons} />
    {/if}
</div>

<style>
    .container {
        --app-icon-river-icon-width: 96px;
        height: 100%;
        width: 100%;
        padding-top: 10%;
        overflow: hidden;
        border-radius: var(--today-card-border-radius);
        background: radial-gradient(
                circle at 3% -50%,
                var(--top-left, #000) 20%,
                transparent 70%
            ),
            radial-gradient(
                circle at -50% 120%,
                var(--bottom-left, #000) 40%,
                transparent 80%
            ),
            radial-gradient(
                circle at 140% -50%,
                var(--top-right, #000) 60%,
                transparent 80%
            ),
            radial-gradient(
                circle at 62% 100%,
                var(--bottom-right, #000) 50%,
                transparent 100%
            );

        @media (--range-small-only) {
            padding-top: 5%;
        }
    }
</style>