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>
|