From bf2cc3aa2f0f0576317d048852d83d45a4724c46 Mon Sep 17 00:00:00 2001 From: Filip <34747899+neriousy@users.noreply.github.com> Date: Mon, 2 Mar 2026 08:57:34 +0100 Subject: feat(app): show which messages are queued (#15587) --- packages/ui/src/components/message-part.css | 22 +++++++++++++++++++++- packages/ui/src/components/message-part.tsx | 17 +++++++++++++++-- packages/ui/src/components/session-turn.tsx | 27 ++++++++++++++++++++++++--- 3 files changed, 60 insertions(+), 6 deletions(-) (limited to 'packages/ui/src/components') diff --git a/packages/ui/src/components/message-part.css b/packages/ui/src/components/message-part.css index 6727bb22f..c23a16ee1 100644 --- a/packages/ui/src/components/message-part.css +++ b/packages/ui/src/components/message-part.css @@ -46,12 +46,18 @@ overflow: hidden; background: var(--surface-weak); border: 1px solid var(--border-weak-base); - transition: border-color 0.15s ease; + transition: + border-color 0.15s ease, + opacity 0.3s ease; &:hover { border-color: var(--border-strong-base); } + &[data-queued] { + opacity: 0.6; + } + &[data-type="image"] { width: 48px; height: 48px; @@ -101,6 +107,11 @@ border: 1px solid var(--border-weak-base); padding: 8px 12px; border-radius: 6px; + transition: opacity 0.3s ease; + + &[data-queued] { + opacity: 0.6; + } [data-highlight="file"] { color: var(--syntax-property); @@ -113,6 +124,14 @@ max-width: 100%; } + [data-slot="user-message-queued-indicator"] { + margin-top: 6px; + margin-right: 2px; + font-size: var(--font-size-small); + color: var(--text-weak); + user-select: none; + } + [data-slot="user-message-copy-wrapper"] { min-height: 24px; margin-top: 4px; @@ -149,6 +168,7 @@ align-items: center; justify-content: flex-end; overflow: hidden; + gap: 6px; } [data-slot="user-message-meta-tail"] { diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx index 02a99f9dd..39a2b4c23 100644 --- a/packages/ui/src/components/message-part.tsx +++ b/packages/ui/src/components/message-part.tsx @@ -92,6 +92,7 @@ export interface MessageProps { parts: PartType[] showAssistantCopyPartID?: string | null interrupted?: boolean + queued?: boolean showReasoningSummaries?: boolean } @@ -500,6 +501,7 @@ export function Message(props: MessageProps) { message={userMessage() as UserMessage} parts={props.parts} interrupted={props.interrupted} + queued={props.queued} /> )} @@ -679,7 +681,12 @@ function ContextToolGroup(props: { parts: ToolPart[]; busy?: boolean }) { ) } -export function UserMessageDisplay(props: { message: UserMessage; parts: PartType[]; interrupted?: boolean }) { +export function UserMessageDisplay(props: { + message: UserMessage + parts: PartType[] + interrupted?: boolean + queued?: boolean +}) { const data = useData() const dialog = useDialog() const i18n = useI18n() @@ -759,6 +766,7 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp