From d5882c8c45819ada395154966e3b701299dedafc Mon Sep 17 00:00:00 2001 From: vegard Date: Mon, 16 Mar 2026 03:28:13 +0100 Subject: [PATCH] Markdown-rendering og revisjons-toggle for AI-behandlede meldinger MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AI-resultat (markdown) rendres med marked-biblioteket - «Vis original» / «Vis AI-resultat» toggle under AI-behandlede meldinger - Nytt API: GET /api/messages/:id/revisions for å hente originaltekst - Markdown-stiler: overskrifter, lister, blockquotes, kodeblokker Co-Authored-By: Claude Opus 4.6 --- web/package-lock.json | 13 + web/package.json | 1 + web/src/lib/components/MessageBox.svelte | 373 ++++++++++++++---- .../messages/[messageId]/revisions/+server.ts | 23 ++ 4 files changed, 327 insertions(+), 83 deletions(-) create mode 100644 web/src/routes/api/messages/[messageId]/revisions/+server.ts diff --git a/web/package-lock.json b/web/package-lock.json index 2e708b0..6c08e99 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -18,6 +18,7 @@ "@tiptap/extension-placeholder": "^3.20.1", "@tiptap/pm": "^3.20.1", "@tiptap/starter-kit": "^3.20.1", + "marked": "^17.0.4", "postgres": "^3.4.8", "spacetimedb": "^2.0.4", "svelte": "^5.53.12", @@ -2045,6 +2046,18 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/marked": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.4.tgz", + "integrity": "sha512-NOmVMM+KAokHMvjWmC5N/ZOvgmSWuqJB8FoYI019j4ogb/PeRMKoKIjReZ2w3376kkA8dSJIP8uD993Kxc0iRQ==", + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", diff --git a/web/package.json b/web/package.json index 63b4f90..ac2c026 100644 --- a/web/package.json +++ b/web/package.json @@ -20,6 +20,7 @@ "@tiptap/extension-placeholder": "^3.20.1", "@tiptap/pm": "^3.20.1", "@tiptap/starter-kit": "^3.20.1", + "marked": "^17.0.4", "postgres": "^3.4.8", "spacetimedb": "^2.0.4", "svelte": "^5.53.12", diff --git a/web/src/lib/components/MessageBox.svelte b/web/src/lib/components/MessageBox.svelte index be778cb..2e9c16a 100644 --- a/web/src/lib/components/MessageBox.svelte +++ b/web/src/lib/components/MessageBox.svelte @@ -1,19 +1,22 @@ {#if mode === 'expanded'} -
- {#if message.reply_to && message.parent_author_name} +
+ {#if message.reply_to && message.parent_author_name && !isReply}
{ e.stopPropagation(); const el = document.getElementById(`msg-${message.reply_to}`); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'center' }); }}> @@ -143,41 +210,37 @@ {#if showTimestamp} {formatTime(message.created_at)} {/if} - - {#if isOwnMessage && !editing} - - {#if callbacks.onEdit} - - {/if} - {#if callbacks.onDelete} - - {/if} - - {/if} - - {#if callbacks.onReply} - - {/if} - {#if callbacks.onConvertToKanban} - - {/if} - {#if callbacks.onConvertToCalendar} - - {/if} - - {#if callbacks.onTogglePin} - - {:else if message.pinned} - 📌 - {/if} - + {#if message.pinned} + 📌 + {/if}
{/if} + +
+ {#if callbacks.onReply} + + {/if} + {#if callbacks.onConvertToKanban} + + {/if} + {#if callbacks.onConvertToCalendar} + + {/if} + {#if callbacks.onMagic} + + {/if} + {#if callbacks.onTogglePin} + + {/if} + {#if isOwnMessage && !editing} + {#if callbacks.onEdit} + + {/if} + {#if callbacks.onDelete} + + {/if} + {/if} +
{#if editing}
{ if (e.key === 'Escape') cancelEdit(); }}> @@ -193,7 +256,38 @@
{:else} -
{@html message.body}
+ {#if expanded} + + {/if} +
{@html displayBody}
+ {#if isClamped && !expanded} + + {:else if expanded} + + {/if} + {#if isAiProcessing} +
✨ AI behandler…
+ {/if} + {#if isAiProcessed && !editing} + + {/if} {/if} {#if hasReactions || callbacks.onReaction}
@@ -258,6 +352,7 @@