fix(enterprise): message nav hovercard and active state (#23964)
This commit is contained in:
@@ -323,6 +323,12 @@ export default function () {
|
|||||||
current={activeMessage()}
|
current={activeMessage()}
|
||||||
size="compact"
|
size="compact"
|
||||||
onMessageSelect={setActiveMessage}
|
onMessageSelect={setActiveMessage}
|
||||||
|
getLabel={(message) =>
|
||||||
|
data()
|
||||||
|
.part[message.id]?.find((part) => part.type === "text")
|
||||||
|
?.text.trim()
|
||||||
|
.split("\n")[0]
|
||||||
|
}
|
||||||
/>
|
/>
|
||||||
</Show>
|
</Show>
|
||||||
<SessionTurn
|
<SessionTurn
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
list-style: none;
|
list-style: none;
|
||||||
|
|
||||||
&[data-size="normal"] {
|
&[data-size="normal"] {
|
||||||
width: 240px;
|
width: 200px;
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -39,6 +39,7 @@
|
|||||||
|
|
||||||
&[data-active] [data-slot="message-nav-tick-line"] {
|
&[data-active] [data-slot="message-nav-tick-line"] {
|
||||||
background-color: var(--icon-strong-base);
|
background-color: var(--icon-strong-base);
|
||||||
|
height: 2px;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,11 +63,11 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
align-self: stretch;
|
align-self: stretch;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
column-gap: 12px;
|
column-gap: 10px;
|
||||||
cursor: default;
|
cursor: default;
|
||||||
border: none;
|
border: none;
|
||||||
background: none;
|
background: none;
|
||||||
padding: 4px 12px;
|
padding: 4px 10px;
|
||||||
border-radius: var(--radius-sm);
|
border-radius: var(--radius-sm);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,9 +82,15 @@
|
|||||||
|
|
||||||
&[data-active] {
|
&[data-active] {
|
||||||
color: var(--text-strong);
|
color: var(--text-strong);
|
||||||
|
font-weight: 500;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[data-slot="message-nav-item"]:has([data-slot="message-nav-title-preview"][data-active])
|
||||||
|
[data-slot="message-nav-message-button"] {
|
||||||
|
background-color: var(--surface-base-active);
|
||||||
|
}
|
||||||
|
|
||||||
[data-slot="message-nav-item"]:hover [data-slot="message-nav-message-button"] {
|
[data-slot="message-nav-item"]:hover [data-slot="message-nav-message-button"] {
|
||||||
background-color: var(--surface-base);
|
background-color: var(--surface-base);
|
||||||
}
|
}
|
||||||
@@ -95,18 +102,15 @@
|
|||||||
color: var(--text-base);
|
color: var(--text-base);
|
||||||
}
|
}
|
||||||
|
|
||||||
.message-nav-tooltip {
|
[data-slot="message-nav-hovercard-content"] {
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
}
|
|
||||||
|
|
||||||
[data-slot="message-nav-tooltip-content"] {
|
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 4px 4px 6px 4px;
|
padding: 4px 4px 6px 4px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: start;
|
align-items: start;
|
||||||
border-radius: var(--radius-md);
|
border-radius: var(--radius-md);
|
||||||
background: var(--surface-raised-stronger-non-alpha);
|
background: var(--surface-raised-stronger-non-alpha);
|
||||||
max-height: calc(100vh - 6rem);
|
max-height: min(480px, calc(100vh - 6rem));
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { UserMessage } from "@opencode-ai/sdk/v2"
|
import { UserMessage } from "@opencode-ai/sdk/v2"
|
||||||
import { ComponentProps, For, Match, Show, splitProps, Switch } from "solid-js"
|
import { HoverCard } from "@kobalte/core/hover-card"
|
||||||
|
import { ComponentProps, For, Match, Show, createSignal, splitProps, Switch } from "solid-js"
|
||||||
import { DiffChanges } from "./diff-changes"
|
import { DiffChanges } from "./diff-changes"
|
||||||
import { Tooltip } from "./tooltip"
|
|
||||||
import { useI18n } from "../context/i18n"
|
import { useI18n } from "../context/i18n"
|
||||||
|
|
||||||
export function MessageNav(
|
export function MessageNav(
|
||||||
@@ -14,18 +14,24 @@ export function MessageNav(
|
|||||||
},
|
},
|
||||||
) {
|
) {
|
||||||
const i18n = useI18n()
|
const i18n = useI18n()
|
||||||
const [local, others] = splitProps(props, ["messages", "current", "size", "onMessageSelect", "getLabel"])
|
const [local, others] = splitProps(props, ["messages", "current", "size", "onMessageSelect", "getLabel", "class"])
|
||||||
|
const [hovercardOpen, setHovercardOpen] = createSignal(false)
|
||||||
|
|
||||||
const content = () => (
|
const selectMessage = (message: UserMessage) => {
|
||||||
<ul role="list" data-component="message-nav" data-size={local.size} {...others}>
|
setHovercardOpen(false)
|
||||||
|
local.onMessageSelect(message)
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = (className?: string) => (
|
||||||
|
<ul role="list" data-component="message-nav" data-size={local.size} class={className} {...others}>
|
||||||
<For each={local.messages}>
|
<For each={local.messages}>
|
||||||
{(message) => {
|
{(message) => {
|
||||||
const handleClick = () => local.onMessageSelect(message)
|
const handleClick = () => selectMessage(message)
|
||||||
|
|
||||||
const handleKeyPress = (event: KeyboardEvent) => {
|
const handleKeyPress = (event: KeyboardEvent) => {
|
||||||
if (event.key !== "Enter" && event.key !== " ") return
|
if (event.key !== "Enter" && event.key !== " ") return
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
local.onMessageSelect(message)
|
selectMessage(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -70,23 +76,27 @@ export function MessageNav(
|
|||||||
return (
|
return (
|
||||||
<Switch>
|
<Switch>
|
||||||
<Match when={local.size === "compact"}>
|
<Match when={local.size === "compact"}>
|
||||||
<Tooltip
|
<HoverCard
|
||||||
|
open={hovercardOpen()}
|
||||||
|
onOpenChange={setHovercardOpen}
|
||||||
openDelay={0}
|
openDelay={0}
|
||||||
|
closeDelay={120}
|
||||||
placement="right-start"
|
placement="right-start"
|
||||||
gutter={-40}
|
gutter={8}
|
||||||
shift={-10}
|
overflowPadding={24}
|
||||||
overlap
|
fitViewport
|
||||||
contentClass="message-nav-tooltip"
|
|
||||||
value={
|
|
||||||
<div data-slot="message-nav-tooltip-content">
|
|
||||||
<MessageNav {...props} size="normal" class="" />
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
>
|
>
|
||||||
{content()}
|
<HoverCard.Trigger as="div" data-component="message-nav-hovercard" class={local.class}>
|
||||||
</Tooltip>
|
{content()}
|
||||||
|
</HoverCard.Trigger>
|
||||||
|
<HoverCard.Portal>
|
||||||
|
<HoverCard.Content data-slot="message-nav-hovercard-content">
|
||||||
|
<MessageNav {...props} size="normal" class="" onMessageSelect={selectMessage} />
|
||||||
|
</HoverCard.Content>
|
||||||
|
</HoverCard.Portal>
|
||||||
|
</HoverCard>
|
||||||
</Match>
|
</Match>
|
||||||
<Match when={local.size === "normal"}>{content()}</Match>
|
<Match when={local.size === "normal"}>{content(local.class)}</Match>
|
||||||
</Switch>
|
</Switch>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user