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:
@@ -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) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user