Spaces:
Sleeping
Sleeping
<script lang="ts"> | |
import type { Optional } from "$lib/types/generic"; | |
import type { MeowbaltEmotions } from "$lib/types/meowbalt"; | |
import type { DialogButton, SmallDialogIcons } from "$lib/types/dialog"; | |
import DialogContainer from "$components/dialog/DialogContainer.svelte"; | |
import Meowbalt from "$components/misc/Meowbalt.svelte"; | |
import DialogButtons from "$components/dialog/DialogButtons.svelte"; | |
import IconAlertTriangle from "@tabler/icons-svelte/IconAlertTriangle.svelte"; | |
export let id: string; | |
export let meowbalt: Optional<MeowbaltEmotions> = undefined; | |
export let icon: Optional<SmallDialogIcons> = undefined; | |
export let title = ""; | |
export let bodyText = ""; | |
export let bodySubText = ""; | |
export let buttons: Optional<DialogButton[]> = undefined; | |
export let dismissable = true; | |
export let leftAligned = false; | |
let close: () => void; | |
</script> | |
<DialogContainer {id} {dismissable} bind:close> | |
<div | |
class="dialog-body small-dialog" | |
class:meowbalt-visible={meowbalt} | |
class:align-left={leftAligned} | |
> | |
{#if meowbalt} | |
<div class="meowbalt-container"> | |
<Meowbalt emotion={meowbalt} /> | |
</div> | |
{/if} | |
<div class="dialog-inner-container"> | |
{#if title || icon} | |
<div class="popup-header"> | |
{#if icon === "warn-red"} | |
<div class="popup-icon {icon}"> | |
<IconAlertTriangle /> | |
</div> | |
{/if} | |
{#if title} | |
<h2 class="popup-title" tabindex="-1">{title}</h2> | |
{/if} | |
</div> | |
{/if} | |
{#if bodyText} | |
<div class="body-text" tabindex="-1">{bodyText}</div> | |
{/if} | |
{#if bodySubText} | |
<div class="subtext popup-subtext">{bodySubText}</div> | |
{/if} | |
</div> | |
{#if buttons} | |
<DialogButtons {buttons} closeFunc={close} /> | |
{/if} | |
</div> | |
</DialogContainer> | |
<style> | |
.small-dialog, | |
.dialog-inner-container { | |
display: flex; | |
flex-direction: column; | |
gap: var(--padding); | |
} | |
.dialog-inner-container { | |
overflow-y: scroll; | |
gap: 8px; | |
} | |
.small-dialog { | |
text-align: center; | |
max-width: 340px; | |
width: calc(100% - var(--padding) - var(--dialog-padding) * 2); | |
max-height: 85%; | |
margin: calc(var(--padding) / 2); | |
} | |
.small-dialog.meowbalt-visible { | |
padding-top: calc(var(--padding) * 4); | |
} | |
.meowbalt-container { | |
position: absolute; | |
top: -120px; | |
} | |
.popup-title { | |
color: var(--secondary); | |
font-size: 19px; | |
} | |
.popup-header, | |
.popup-icon { | |
display: flex; | |
flex-direction: column; | |
justify-content: center; | |
align-items: center; | |
} | |
.popup-icon :global(svg) { | |
stroke-width: 1.5px; | |
height: 50px; | |
width: 50px; | |
} | |
.warn-red :global(svg) { | |
stroke: var(--red); | |
} | |
.body-text { | |
font-size: 14.5px; | |
font-weight: 500; | |
line-height: 1.7; | |
color: var(--gray); | |
white-space: pre-wrap; | |
user-select: text; | |
-webkit-user-select: text; | |
} | |
.body-text:focus-visible, | |
.popup-title:focus-visible { | |
box-shadow: none !important; | |
} | |
.popup-subtext { | |
opacity: 0.7; | |
padding: 0; | |
} | |
.align-left .body-text { | |
text-align: start; | |
} | |
.align-left .popup-header { | |
align-items: start; | |
gap: 2px; | |
} | |
.align-left .popup-icon :global(svg) { | |
height: 40px; | |
width: 40px; | |
stroke-width: 1.8px; | |
} | |
</style> | |