fix: ContinuationModal UX - hover tooltips and stay-on-step flow
- Replace grouped section headers with hover tooltips (title attr) for a cleaner flat list of descendant options - After selecting a descendant, stay on the custom step so the user can write notes before proceeding via a "Continue to" button - Add pendingContinuationNodeId state to track selected descendant - "Continue to" and custom branch controls are mutually exclusive Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -37,15 +37,6 @@ export function ContinuationModal({
|
||||
onSelectNode,
|
||||
onBuildCustomBranch
|
||||
}: ContinuationModalProps) {
|
||||
// Group nodes by parent option
|
||||
const groupedNodes = descendantNodes.reduce((acc, node) => {
|
||||
if (!acc[node.parentOptionLabel]) {
|
||||
acc[node.parentOptionLabel] = []
|
||||
}
|
||||
acc[node.parentOptionLabel].push(node)
|
||||
return acc
|
||||
}, {} as Record<string, DescendantNode[]>)
|
||||
|
||||
const hasDescendants = descendantNodes.length > 0
|
||||
|
||||
return (
|
||||
@@ -58,36 +49,28 @@ export function ContinuationModal({
|
||||
Select the next step in your troubleshooting path:
|
||||
</p>
|
||||
|
||||
<div className="space-y-4">
|
||||
{Object.entries(groupedNodes).map(([parentOption, nodes]) => (
|
||||
<div key={parentOption}>
|
||||
<p className="mb-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
|
||||
From: {parentOption}
|
||||
</p>
|
||||
<div className="space-y-2">
|
||||
{nodes.map(node => (
|
||||
<button
|
||||
key={node.id}
|
||||
onClick={() => onSelectNode(node.id)}
|
||||
className={cn(
|
||||
'flex w-full items-center gap-3 rounded-lg border border-border p-3 text-left transition-colors',
|
||||
'hover:border-primary hover:bg-accent'
|
||||
)}
|
||||
>
|
||||
<div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-muted">
|
||||
{nodeTypeIcons[node.type]}
|
||||
</div>
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="truncate font-medium">{node.label}</p>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
{nodeTypeLabels[node.type]}
|
||||
</p>
|
||||
</div>
|
||||
<ArrowRight className="h-4 w-4 flex-shrink-0 text-muted-foreground" />
|
||||
</button>
|
||||
))}
|
||||
<div className="space-y-2">
|
||||
{descendantNodes.map(node => (
|
||||
<button
|
||||
key={node.id}
|
||||
onClick={() => onSelectNode(node.id)}
|
||||
title={`From: ${node.parentOptionLabel}`}
|
||||
className={cn(
|
||||
'flex w-full items-center gap-3 rounded-lg border border-border p-3 text-left transition-colors',
|
||||
'hover:border-primary hover:bg-accent'
|
||||
)}
|
||||
>
|
||||
<div className="flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-muted">
|
||||
{nodeTypeIcons[node.type]}
|
||||
</div>
|
||||
</div>
|
||||
<div className="min-w-0 flex-1">
|
||||
<p className="truncate font-medium">{node.label}</p>
|
||||
<p className="text-xs text-muted-foreground">
|
||||
{nodeTypeLabels[node.type]}
|
||||
</p>
|
||||
</div>
|
||||
<ArrowRight className="h-4 w-4 flex-shrink-0 text-muted-foreground" />
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user