UI: flip bubble hierarchy — responses elevated, prompts recessed
Design direction: "Illuminated Transcript" — the AI response is the primary artifact; user prompts are subordinate margin notes. ChatMessage.vue: - User bubble: ghosted background (rgba 3-4% opacity), muted text, thin near-invisible border. De-emphasized, recessed. - Assistant bubble: left indigo accent border (2px), elevated shadow via --color-bubble-asst-shadow. Commands attention. - Assistant role label: indigo (var(--color-primary)); user label muted. - Removed old white-override content rules (no longer on dark bg). - Thinking block: full border → left-only indigo accent bar (35% opacity), removed inner top border. ChatView.vue: - Streaming bubble: same left accent + shadow as assistant bubbles. - Streaming role label: indigo to match ChatMessage. - Thinking block in streaming: same treatment as ChatMessage. theme.css: - Added --color-bubble-user-bg/border/text for light + dark. - Added --color-bubble-asst-shadow for light + dark. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -121,13 +121,19 @@ const timingParts = computed((): string[] => {
|
||||
border-radius: 18px;
|
||||
}
|
||||
|
||||
/* User prompts: recessed, muted — margin notes */
|
||||
.role-user .message-bubble {
|
||||
background: linear-gradient(135deg, #6366f1, #4f46e5);
|
||||
color: #fff;
|
||||
background: var(--color-bubble-user-bg);
|
||||
border: 1px solid var(--color-bubble-user-border);
|
||||
color: var(--color-bubble-user-text);
|
||||
border-bottom-right-radius: 4px;
|
||||
}
|
||||
|
||||
/* Assistant responses: elevated, lit — the primary text */
|
||||
.role-assistant .message-bubble {
|
||||
background: var(--color-bg-card);
|
||||
border-left: 2px solid var(--color-primary);
|
||||
box-shadow: var(--color-bubble-asst-shadow);
|
||||
border-bottom-left-radius: 4px;
|
||||
}
|
||||
|
||||
@@ -144,16 +150,17 @@ const timingParts = computed((): string[] => {
|
||||
letter-spacing: 0.03em;
|
||||
}
|
||||
.role-user .role-label {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
color: var(--color-text-muted);
|
||||
opacity: 0.6;
|
||||
}
|
||||
.role-assistant .role-label {
|
||||
color: var(--color-text-muted);
|
||||
color: var(--color-primary);
|
||||
}
|
||||
|
||||
.thinking-block {
|
||||
margin-bottom: 0.5rem;
|
||||
border: 1px solid var(--color-border);
|
||||
border-radius: var(--radius-sm);
|
||||
border-left: 2px solid rgba(129, 140, 248, 0.35);
|
||||
border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
.thinking-summary {
|
||||
@@ -191,7 +198,6 @@ details[open] .thinking-summary::before {
|
||||
max-height: 300px;
|
||||
overflow-y: auto;
|
||||
background: var(--color-bg-secondary);
|
||||
border-top: 1px solid var(--color-border);
|
||||
}
|
||||
.message-content {
|
||||
font-size: 0.95rem;
|
||||
@@ -202,22 +208,6 @@ details[open] .thinking-summary::before {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* User bubble content overrides for readability on primary bg */
|
||||
.role-user .message-content :deep(a) {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
text-decoration: underline;
|
||||
}
|
||||
.role-user .message-content :deep(code) {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
color: #fff;
|
||||
}
|
||||
.role-user .message-content :deep(pre) {
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
}
|
||||
.role-user .message-content :deep(blockquote) {
|
||||
border-left-color: rgba(255, 255, 255, 0.4);
|
||||
color: rgba(255, 255, 255, 0.85);
|
||||
}
|
||||
|
||||
.message-actions {
|
||||
display: flex;
|
||||
|
||||
Reference in New Issue
Block a user