File size: 1,750 Bytes
11fcc5a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
<script lang="ts">
    export let id = "";
    export let expanded = false;
    export let expandStart: "left" | "center" | "right" = "center";

    /*
        a popover isn't pre-rendered by default, because the user might never open it.
        but if they do, we render only once, and then keep it the dom :3
    */

    $: renderPopover = false;
    $: if (expanded && !renderPopover) renderPopover = true;
</script>

<div {id} class="popover {expandStart}" aria-hidden={!expanded} class:expanded>
    {#if renderPopover}
        <slot></slot>
    {/if}
</div>

<style>
    .popover {
        display: flex;
        flex-direction: column;
        border-radius: 18px;
        background: var(--button);
        box-shadow: var(--button-box-shadow);

        filter: drop-shadow(0 0 8px var(--popover-glow))
            drop-shadow(0 0 10px var(--popover-glow));
        position: relative;
        padding: var(--padding);
        gap: 6px;
        top: 6px;
        z-index: 2;

        opacity: 0;
        transform: scale(0);
        transform-origin: top center;

        transition:
            transform 0.3s cubic-bezier(0.53, 0.05, 0.23, 1.15),
            opacity 0.25s cubic-bezier(0.53, 0.05, 0.23, 0.99);

        will-change: transform, opacity;

        pointer-events: all;
    }

    .popover.left {
        transform-origin: top left;
    }

    :global([dir="rtl"]) .popover.left {
        transform-origin: top right;
    }

    .popover.center {
        transform-origin: top center;
    }

    .popover.right {
        transform-origin: top right;
    }

    :global([dir="rtl"]) .popover.right {
        transform-origin: top left;
    }

    .popover.expanded {
        opacity: 1;
        transform: none;
    }
</style>