fix(webchat): move action buttons outside message bubble

Wrap each message in a .message-wrapper div and render copy/edit buttons
below the bubble instead of overlapping inside it. Improves readability
and prevents buttons from covering message content.
This commit is contained in:
William Valentin
2026-02-10 21:26:22 -08:00
parent 25482b8516
commit aaaf4a361a
2 changed files with 36 additions and 12 deletions
+7 -3
View File
@@ -52,6 +52,9 @@ function highlightCode() {
} }
function createMessageEl(role, content) { function createMessageEl(role, content) {
const wrapper = document.createElement('div');
wrapper.className = 'message-wrapper';
const div = document.createElement('div'); const div = document.createElement('div');
div.className = `message ${role}`; div.className = `message ${role}`;
@@ -61,13 +64,14 @@ function createMessageEl(role, content) {
} else { } else {
div.textContent = content; div.textContent = content;
} }
wrapper.appendChild(div);
// Add action buttons (copy for all, edit for user) // Add action buttons (copy for all, edit for user) outside the message box
if (role !== 'system') { if (role !== 'system') {
div.appendChild(createMessageActions(role)); wrapper.appendChild(createMessageActions(role));
} }
return div; return wrapper;
} }
function createToolEventEl(event, data) { function createToolEventEl(event, data) {
+29 -9
View File
@@ -163,11 +163,18 @@ header #status.status-ok {
gap: 12px; gap: 12px;
} }
/* Message wrapper - contains message box and actions below it */
.message-wrapper {
display: flex;
flex-direction: column;
gap: 6px;
max-width: 85%;
}
/* Individual message bubble */ /* Individual message bubble */
.message { .message {
padding: 10px 14px; padding: 10px 14px;
border-radius: var(--radius); border-radius: var(--radius);
max-width: 85%;
word-wrap: break-word; word-wrap: break-word;
white-space: pre-wrap; white-space: pre-wrap;
font-size: var(--font-size-base); font-size: var(--font-size-base);
@@ -1048,25 +1055,38 @@ tr:hover td {
border-radius: 3px; border-radius: 3px;
} }
/* Message action buttons (copy, edit) */ /* Message wrapper alignment */
.message { .message-wrapper.user {
position: relative; align-self: flex-end;
} }
.message-wrapper.assistant {
align-self: flex-start;
}
/* Message action buttons (copy, edit) */
.message-actions { .message-actions {
position: absolute;
bottom: 4px;
right: 4px;
display: flex; display: flex;
gap: 2px; gap: 4px;
opacity: 0; opacity: 0;
transition: opacity var(--transition); transition: opacity var(--transition);
align-self: flex-end;
} }
.message:hover .message-actions { .message-wrapper:hover .message-actions {
opacity: 1; opacity: 1;
} }
/* User message actions align right */
.message-wrapper.user .message-actions {
align-self: flex-end;
}
/* Assistant message actions align left */
.message-wrapper.assistant .message-actions {
align-self: flex-start;
}
.msg-action-btn { .msg-action-btn {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;