<script lang="ts">
import { RemoveButton } from '$lib/components/app';
- import { getFileTypeLabel, getPreviewText, formatFileSize, isTextFile } from '$lib/utils';
+ import { formatFileSize, getFileTypeLabel, getPreviewText, isTextFile } from '$lib/utils';
import { AttachmentType } from '$lib/enums';
interface Props {
import Input from '$lib/components/ui/input/input.svelte';
import { conversationsStore, conversations } from '$lib/stores/conversations.svelte';
import { chatStore } from '$lib/stores/chat.svelte';
+ import { getPreviewText } from '$lib/utils/text';
import ChatSidebarActions from './ChatSidebarActions.svelte';
const sidebar = Sidebar.useSidebar();
let showEditDialog = $state(false);
let selectedConversation = $state<DatabaseConversation | null>(null);
let editedName = $state('');
+ let selectedConversationNamePreview = $derived.by(() =>
+ selectedConversation ? getPreviewText(selectedConversation.name) : ''
+ );
let filteredConversations = $derived.by(() => {
if (searchQuery.trim().length > 0) {
bind:open={showDeleteDialog}
title="Delete Conversation"
description={selectedConversation
- ? `Are you sure you want to delete "${selectedConversation.name}"? This action cannot be undone and will permanently remove all messages in this conversation.`
+ ? `Are you sure you want to delete "${selectedConversationNamePreview}"? This action cannot be undone and will permanently remove all messages in this conversation.`
: ''}
confirmText="Delete"
cancelText="Cancel"
background: hsl(var(--muted) / 0.1);
}
+ /* User message markdown should keep table borders visible on light primary backgrounds */
+ div.markdown-user-content :global(table),
+ div.markdown-user-content :global(th),
+ div.markdown-user-content :global(td),
+ div.markdown-user-content :global(.table-wrapper) {
+ border-color: currentColor;
+ }
+
/* Horizontal rules */
div :global(hr) {
border: none;
background: var(--muted);
}
+ /* Disable hover effects when rendering user messages */
+ .markdown-user-content :global(a),
+ .markdown-user-content :global(a:hover) {
+ color: var(--primary-foreground);
+ }
+
+ .markdown-user-content :global(table:hover) {
+ box-shadow: none;
+ }
+
+ .markdown-user-content :global(th:hover),
+ .markdown-user-content :global(td:hover) {
+ background: inherit;
+ }
+
/* Enhanced blockquotes */
div :global(blockquote) {
transition: all 0.2s ease;
// Handle AttachmentType or other plain strings
return input.toUpperCase();
}
-
-/**
- * Truncates text content for preview display
- * @param content - The text content to truncate
- * @returns Truncated content with ellipsis if needed
- */
-export function getPreviewText(content: string): string {
- return content.length > 150 ? content.substring(0, 150) + '...' : content;
-}
export { copyToClipboard, copyCodeToClipboard } from './copy';
// File preview utilities
-export { getFileTypeLabel, getPreviewText } from './file-preview';
+export { getFileTypeLabel } from './file-preview';
+export { getPreviewText } from './text';
// File type utilities
export {
--- /dev/null
+/**
+ * Returns a shortened preview of the provided content capped at the given length.
+ * Appends an ellipsis when the content exceeds the maximum.
+ */
+export function getPreviewText(content: string, max = 150): string {
+ return content.length > max ? content.slice(0, max) + '...' : content;
+}