|
5 | 5 |
|
6 | 6 | import { marked } from 'marked'; |
7 | 7 | import { createEventDispatcher, onMount } from 'svelte'; |
| 8 | + import XMark from '$lib/components/icons/XMark.svelte'; |
8 | 9 |
|
9 | 10 | const dispatch = createEventDispatcher(); |
10 | 11 |
|
|
15 | 16 | let startX = 0, |
16 | 17 | startY = 0; |
17 | 18 | let moved = false; |
| 19 | + let closeButtonElement: HTMLButtonElement; |
18 | 20 | const DRAG_THRESHOLD_PX = 6; |
19 | 21 |
|
20 | 22 | const clickHandler = () => { |
21 | 23 | onClick(); |
22 | 24 | dispatch('closeToast'); |
23 | 25 | }; |
24 | 26 |
|
| 27 | + const closeHandler = () => { |
| 28 | + dispatch('closeToast'); |
| 29 | + }; |
| 30 | +
|
25 | 31 | function onPointerDown(e: PointerEvent) { |
26 | 32 | startX = e.clientX; |
27 | 33 | startY = e.clientY; |
|
43 | 49 | // Release capture if taken |
44 | 50 | (e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId); |
45 | 51 |
|
| 52 | + // Skip if clicking the close button |
| 53 | + if (closeButtonElement && (e.target === closeButtonElement || closeButtonElement.contains(e.target as Node))) { |
| 54 | + return; |
| 55 | + } |
| 56 | +
|
46 | 57 | // Only treat as a click if there wasn't a drag |
47 | 58 | if (!moved) { |
48 | 59 | clickHandler(); |
|
71 | 82 | <!-- svelte-ignore a11y-click-events-have-key-events --> |
72 | 83 | <!-- svelte-ignore a11y-no-static-element-interactions --> |
73 | 84 | <div |
74 | | - class="flex gap-2.5 text-left min-w-[var(--width)] w-full dark:bg-gray-850 dark:text-white bg-white text-black border border-gray-100 dark:border-gray-800 rounded-3xl px-4 py-3.5 cursor-pointer select-none" |
| 85 | + class="group relative flex gap-2.5 text-left min-w-[var(--width)] w-full dark:bg-gray-850 dark:text-white bg-white text-black border border-gray-100 dark:border-gray-800 rounded-3xl px-4 py-3.5 cursor-pointer select-none" |
75 | 86 | on:dragstart|preventDefault |
76 | 87 | on:pointerdown={onPointerDown} |
77 | 88 | on:pointermove={onPointerMove} |
|
84 | 95 | } |
85 | 96 | }} |
86 | 97 | > |
| 98 | + <!-- Close button (visible on hover) --> |
| 99 | + <button |
| 100 | + bind:this={closeButtonElement} |
| 101 | + class="absolute -top-0.5 -left-0.5 p-0.5 rounded-full opacity-0 group-hover:opacity-100 bg-gray-200 dark:bg-gray-700 hover:bg-gray-300 dark:hover:bg-gray-600 text-gray-500 dark:text-gray-400 hover:text-gray-700 dark:hover:text-gray-200 transition-opacity z-10" |
| 102 | + on:click|stopPropagation={closeHandler} |
| 103 | + aria-label="Dismiss notification" |
| 104 | + > |
| 105 | + <XMark className="size-3" /> |
| 106 | + </button> |
| 107 | + |
87 | 108 | <div class="shrink-0 self-top -translate-y-0.5"> |
88 | 109 | <img src="{WEBUI_BASE_URL}/static/favicon.png" alt="favicon" class="size-6 rounded-full" /> |
89 | 110 | </div> |
|
0 commit comments