tweak(ui): show user message meta on hover
Adds a hover-only metadata line under user messages showing agent, provider, model, and timestamp for quicker context.
This commit is contained in:
@@ -119,6 +119,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: flex-end;
|
justify-content: flex-end;
|
||||||
|
gap: 10px;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
transition: opacity 0.15s ease;
|
transition: opacity 0.15s ease;
|
||||||
@@ -130,6 +131,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[data-slot="user-message-meta"] {
|
||||||
|
user-select: none;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
[data-slot="user-message-copy-wrapper"][data-interrupted] {
|
[data-slot="user-message-copy-wrapper"][data-interrupted] {
|
||||||
gap: 12px;
|
gap: 12px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -534,6 +534,27 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
|
|||||||
|
|
||||||
const agents = createMemo(() => (props.parts?.filter((p) => p.type === "agent") as AgentPart[]) ?? [])
|
const agents = createMemo(() => (props.parts?.filter((p) => p.type === "agent") as AgentPart[]) ?? [])
|
||||||
|
|
||||||
|
const stamp = createMemo(() => {
|
||||||
|
const created = props.message.time?.created
|
||||||
|
if (typeof created !== "number") return ""
|
||||||
|
const date = new Date(created)
|
||||||
|
const hours = date.getHours()
|
||||||
|
const hour12 = hours % 12 || 12
|
||||||
|
const minute = String(date.getMinutes()).padStart(2, "0")
|
||||||
|
return `${hour12}:${minute} ${hours < 12 ? "AM" : "PM"}`
|
||||||
|
})
|
||||||
|
|
||||||
|
const meta = createMemo(() => {
|
||||||
|
const agent = props.message.agent
|
||||||
|
const items = [
|
||||||
|
agent ? agent[0]?.toUpperCase() + agent.slice(1) : "",
|
||||||
|
props.message.model?.providerID,
|
||||||
|
props.message.model?.modelID,
|
||||||
|
stamp(),
|
||||||
|
]
|
||||||
|
return items.filter((x) => !!x).join(" \u00B7 ")
|
||||||
|
})
|
||||||
|
|
||||||
const openImagePreview = (url: string, alt?: string) => {
|
const openImagePreview = (url: string, alt?: string) => {
|
||||||
dialog.show(() => <ImagePreview src={url} alt={alt} />)
|
dialog.show(() => <ImagePreview src={url} alt={alt} />)
|
||||||
}
|
}
|
||||||
@@ -591,6 +612,11 @@ export function UserMessageDisplay(props: { message: UserMessage; parts: PartTyp
|
|||||||
{i18n.t("ui.message.interrupted")}
|
{i18n.t("ui.message.interrupted")}
|
||||||
</span>
|
</span>
|
||||||
</Show>
|
</Show>
|
||||||
|
<Show when={meta()}>
|
||||||
|
<span data-slot="user-message-meta" class="text-12-regular text-text-weak cursor-default">
|
||||||
|
{meta()}
|
||||||
|
</span>
|
||||||
|
</Show>
|
||||||
<Tooltip
|
<Tooltip
|
||||||
value={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copy")}
|
value={copied() ? i18n.t("ui.message.copied") : i18n.t("ui.message.copy")}
|
||||||
placement="top"
|
placement="top"
|
||||||
|
|||||||
Reference in New Issue
Block a user