mirror of
https://github.com/open-webui/open-webui
synced 2024-11-08 17:49:57 +00:00
127 lines
3.4 KiB
Svelte
127 lines
3.4 KiB
Svelte
|
<script lang="ts">
|
||
|
import type { Banner } from '$lib/types';
|
||
|
import { onMount, createEventDispatcher } from 'svelte';
|
||
|
import { fade } from 'svelte/transition';
|
||
|
|
||
|
const dispatch = createEventDispatcher();
|
||
|
|
||
|
export let banner: Banner = {
|
||
|
id: '',
|
||
|
type: 'info',
|
||
|
title: '',
|
||
|
content: '',
|
||
|
url: '',
|
||
|
dismissable: true,
|
||
|
timestamp: Math.floor(Date.now() / 1000)
|
||
|
};
|
||
|
|
||
|
export let dismissed = false;
|
||
|
|
||
|
let mounted = false;
|
||
|
|
||
|
const classNames: Record<string, string> = {
|
||
|
info: 'bg-blue-500/20 text-blue-700 dark:text-blue-200 ',
|
||
|
success: 'bg-green-500/20 text-green-700 dark:text-green-200',
|
||
|
warning: 'bg-yellow-500/20 text-yellow-700 dark:text-yellow-200',
|
||
|
error: 'bg-red-500/20 text-red-700 dark:text-red-200'
|
||
|
};
|
||
|
|
||
|
const dismiss = (id) => {
|
||
|
dismissed = true;
|
||
|
dispatch('dismiss', id);
|
||
|
};
|
||
|
|
||
|
onMount(() => {
|
||
|
mounted = true;
|
||
|
});
|
||
|
</script>
|
||
|
|
||
|
{#if mounted}
|
||
|
{#if !dismissed}
|
||
|
<div
|
||
|
class=" top-0 left-0 right-0 p-2 mx-4 px-3 flex justify-center items-center relative rounded-xl border dark:border-gray-800 text-gray-800 dark:text-gary-100 bg-white dark:bg-gray-900 backdrop-blur-xl"
|
||
|
transition:fade={{ delay: 0, duration: 300 }}
|
||
|
>
|
||
|
<div class=" flex flex-col md:flex-row md:items-center flex-1 text-sm w-fit gap-1.5">
|
||
|
<div class="flex justify-between self-start">
|
||
|
<div
|
||
|
class=" text-xs font-black {classNames[banner.type] ??
|
||
|
classNames['info']} w-fit px-2 rounded uppercase"
|
||
|
>
|
||
|
{banner.type}
|
||
|
</div>
|
||
|
|
||
|
{#if banner.url}
|
||
|
<div class="flex md:hidden group w-fit md:items-center">
|
||
|
<a
|
||
|
class="text-gray-700 dark:text-white text-xs font-bold underline"
|
||
|
href="/assets/files/whitepaper.pdf"
|
||
|
target="_blank">Learn More</a
|
||
|
>
|
||
|
|
||
|
<div
|
||
|
class=" ml-1 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-white"
|
||
|
>
|
||
|
<!-- -->
|
||
|
<svg
|
||
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
viewBox="0 0 16 16"
|
||
|
fill="currentColor"
|
||
|
class="w-4 h-4"
|
||
|
>
|
||
|
<path
|
||
|
fill-rule="evenodd"
|
||
|
d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
|
||
|
clip-rule="evenodd"
|
||
|
/>
|
||
|
</svg>
|
||
|
</div>
|
||
|
</div>
|
||
|
{/if}
|
||
|
</div>
|
||
|
|
||
|
<div class="flex-1 text-xs text-gray-700 dark:text-white">
|
||
|
{banner.content}
|
||
|
</div>
|
||
|
</div>
|
||
|
|
||
|
{#if banner.url}
|
||
|
<div class="hidden md:flex group w-fit md:items-center">
|
||
|
<a
|
||
|
class="text-gray-700 dark:text-white text-xs font-bold underline"
|
||
|
href="/"
|
||
|
target="_blank">Learn More</a
|
||
|
>
|
||
|
|
||
|
<div class=" ml-1 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-white">
|
||
|
<!-- -->
|
||
|
<svg
|
||
|
xmlns="http://www.w3.org/2000/svg"
|
||
|
viewBox="0 0 16 16"
|
||
|
fill="currentColor"
|
||
|
class="size-4"
|
||
|
>
|
||
|
<path
|
||
|
fill-rule="evenodd"
|
||
|
d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
|
||
|
clip-rule="evenodd"
|
||
|
/>
|
||
|
</svg>
|
||
|
</div>
|
||
|
</div>
|
||
|
{/if}
|
||
|
<div class="flex h-full justify-start">
|
||
|
{#if banner.dismissible}
|
||
|
<button
|
||
|
on:click={() => {
|
||
|
dismiss(banner.id);
|
||
|
}}
|
||
|
class="mt-[-2.5px] ml-1.5 mr-1 text-gray-400 dark:hover:text-white h-2 mb-auto"
|
||
|
>×</button
|
||
|
>
|
||
|
{/if}
|
||
|
</div>
|
||
|
</div>
|
||
|
{/if}
|
||
|
{/if}
|