mirror of
https://github.com/wukko/cobalt.git
synced 2025-04-29 22:14:26 +02:00
75 lines
1.7 KiB
Svelte
75 lines
1.7 KiB
Svelte
<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>
|