2 import { ChatAttachmentsList, MarkdownContent, MentionText } from '$lib/components/app';
3 import { Card } from '$lib/components/ui/card';
4 import { config } from '$lib/stores/settings.svelte';
5 import type { DatabaseMessageExtra } from '$lib/types/database';
9 attachments?: DatabaseMessageExtra[];
10 renderMarkdown?: boolean;
11 textColorClass?: string;
13 maxHeightStyle?: string;
18 cardBgClass = 'dark:bg-primary/15',
21 renderMarkdown = false,
22 textColorClass = 'text-foreground'
25 let isMultiline = $state(false);
26 let messageElement: HTMLElement | undefined = $state();
27 const currentConfig = config();
30 if (!messageElement || !content.trim()) return;
32 if (content.includes('\n')) {
38 const resizeObserver = new ResizeObserver((entries) => {
39 for (const entry of entries) {
40 const element = entry.target as HTMLElement;
41 const estimatedSingleLineHeight = 24; // Typical line height for text-md
43 isMultiline = element.offsetHeight > estimatedSingleLineHeight * 1.5;
47 resizeObserver.observe(messageElement);
50 resizeObserver.disconnect();
55 {#if attachments && attachments.length > 0}
56 <div class="mb-2 max-w-[80%]">
57 <ChatAttachmentsList {attachments} readonly imageHeight="h-40" />
63 class="chat-message-user-bubble max-w-[80%] overflow-y-auto rounded-[1.125rem] border-none bg-primary/5 px-3.75 py-1.5 {textColorClass} backdrop-blur-md data-multiline:py-2.5 {cardBgClass}"
64 data-multiline={isMultiline ? '' : undefined}
65 style="{maxHeightStyle} overflow-wrap: anywhere; word-break: break-word;"
67 {#if renderMarkdown && currentConfig.renderUserContentAsMarkdown}
68 <div bind:this={messageElement}>
69 <MarkdownContent class="markdown-user-content" {content} />
72 <span bind:this={messageElement} class="text-md whitespace-pre-wrap"
73 ><MentionText {content} /></span