import { Check, X } from '@lucide/svelte';
import { Card } from '$lib/components/ui/card';
import { Button } from '$lib/components/ui/button';
- import { ChatAttachmentsList } from '$lib/components/app';
+ import { ChatAttachmentsList, MarkdownContent } from '$lib/components/app';
import { INPUT_CLASSES } from '$lib/constants/input-classes';
+ import { config } from '$lib/stores/settings.svelte';
import ChatMessageActions from './ChatMessageActions.svelte';
interface Props {
let isMultiline = $state(false);
let messageElement: HTMLElement | undefined = $state();
+ const currentConfig = config();
$effect(() => {
if (!messageElement || !message.content.trim()) return;
class="max-w-[80%] rounded-[1.125rem] bg-primary px-3.75 py-1.5 text-primary-foreground data-[multiline]:py-2.5"
data-multiline={isMultiline ? '' : undefined}
>
- <span bind:this={messageElement} class="text-md whitespace-pre-wrap">
- {message.content}
- </span>
+ {#if currentConfig.renderUserContentAsMarkdown}
+ <div bind:this={messageElement} class="text-md">
+ <MarkdownContent
+ class="markdown-user-content text-primary-foreground"
+ content={message.content}
+ />
+ </div>
+ {:else}
+ <span bind:this={messageElement} class="text-md whitespace-pre-wrap">
+ {message.content}
+ </span>
+ {/if}
</Card>
{/if}
pasteLongTextToFileLen: 2500,
pdfAsImage: false,
showModelInfo: false,
+ renderUserContentAsMarkdown: false,
// make sure these default values are in sync with `common.h`
samplers: 'top_k;typ_p;top_p;min_p;temperature',
temperature: 0.8,
'Ask for confirmation before automatically changing conversation title when editing the first message.',
pdfAsImage: 'Parse PDF as image instead of text (requires vision-capable model).',
showModelInfo: 'Display the model name used to generate each message below the message content.',
+ renderUserContentAsMarkdown: 'Render user messages using markdown formatting in the chat.',
pyInterpreterEnabled:
'Enable Python interpreter using Pyodide. Allows running Python code in markdown code blocks.'
};