fix(rectification): hide option hover impact and composer step strip (BUG-575)

Hovering A/B/C/D rewrote a leading/lagging time line and made the card flicker; the step-state sentence above the composer was instructional filler, not something the user needed to answer.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-07 14:07:49 +08:00
parent 58081a2d51
commit 1ded6bb0d4
8 changed files with 29 additions and 44 deletions
-12
View File
@@ -3083,23 +3083,11 @@ input:not([type="radio"]):not([type="checkbox"]):not([class^="ant-"]):not([class
.rectification-choice-why-user p {
margin: var(--space-2) 0 0;
}
.rectification-choice-impact {
margin: var(--space-3) 0 0;
color: var(--color-ink-secondary);
font-size: var(--type-caption);
line-height: 1.5;
}
.rectification-composer-meta {
display: grid;
gap: var(--space-3);
margin: 0 0 var(--space-3);
}
.rectification-step-state {
margin: 0;
color: var(--color-ink-secondary);
font-size: var(--type-caption);
line-height: 1.5;
}
.rectification-composer-meta .rectification-collect-stop {
margin: 0;
}
@@ -37,10 +37,8 @@ import {
isRecommendedRectificationCandidate,
natalRecastMeaning,
parseRectificationCandidateResult,
parseRectificationStepState,
workingRectificationHouseTable,
type RectificationCandidateResult,
type RectificationStepState,
} from "@/lib/rectification-candidate-result";
import {
diffRectificationBoard,
@@ -435,7 +433,6 @@ type CaseSnapshotState = Readonly<{
question: CurrentQuestionModel | null;
questionSource: "focus" | "unavailable" | null;
choice: ChoiceCardModel | null;
stepState: RectificationStepState | null;
caseStatus: RectificationCaseStatus | null;
savedTime: string | null;
savedStatus: "accepted" | "confirmed" | null;
@@ -457,7 +454,6 @@ function caseSnapshotState(payload: RectificationCaseSnapshotPayload | null): Ca
question: currentQuestionFromSnapshot(payload.current_question),
questionSource: questionSourceFromSnapshot(payload.question_source),
choice: parseRectificationChoiceCard(payload.choice_card),
stepState: parseRectificationStepState(payload.step_state),
caseStatus: isRectificationCaseStatus(payload.case?.status) ? payload.case.status : null,
savedTime: confirmedTime ?? acceptedTime,
savedStatus: confirmedTime ? "confirmed" : acceptedTime ? "accepted" : null,
@@ -499,7 +495,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
const [savedStatus, setSavedStatus] = useState<"accepted" | "confirmed" | null>(() => caseSnapshotState(initialSnapshot)?.savedStatus ?? null);
const [candidateResult, setCandidateResult] = useState<CandidateResult>(() => caseSnapshotState(initialSnapshot)?.candidate ?? null);
const [choiceCard, setChoiceCard] = useState<ChoiceCardModel | null>(() => caseSnapshotState(initialSnapshot)?.choice ?? null);
const [stepState, setStepState] = useState<RectificationStepState | null>(() => caseSnapshotState(initialSnapshot)?.stepState ?? null);
const [currentQuestion, setCurrentQuestion] = useState<CurrentQuestionModel | null>(() => caseSnapshotState(initialSnapshot)?.question ?? null);
const [questionSource, setQuestionSource] = useState<"focus" | "unavailable" | null>(() => caseSnapshotState(initialSnapshot)?.questionSource ?? null);
const [caseStatus, setCaseStatus] = useState<RectificationCaseStatus | null>(() => caseSnapshotState(initialSnapshot)?.caseStatus ?? null);
@@ -672,7 +667,6 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
setCurrentQuestion(nextQuestion);
setQuestionSource(questionSourceFromSnapshot(payload.question_source));
setChoiceCard(nextChoice);
setStepState(parseRectificationStepState(payload.step_state));
setCaseStatus(nextCaseStatus);
setNextUserActionId(nextActionId || null);
setCaseSnapshotLoaded(true);
@@ -1772,13 +1766,8 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
<span className="rectification-adopt-status__hint"></span>
</div>
)}
<div className="rectification-composer-meta">
{stepState ? (
<p className="rectification-step-state" role="status">
{stepState.headline} {stepState.reason} {stepState.next}
</p>
) : null}
{currentQuestion?.kind === "collect_spoken" && !readonly && !busy && (
{currentQuestion?.kind === "collect_spoken" && !readonly && !busy && (
<div className="rectification-composer-meta">
<button
type="button"
className="rectification-collect-stop"
@@ -1786,8 +1775,8 @@ export function RectificationAgenticChat(props: RectificationAgenticChatProps) {
>
{CHOICE_STOP_LABEL}
</button>
)}
</div>
</div>
)}
<ChatComposer
inputRef={composer}
value={draft}
@@ -21,13 +21,8 @@ type RectificationChoiceCardProps = Readonly<{
export function RectificationChoiceCard(props: RectificationChoiceCardProps) {
const [localSelected, setLocalSelected] = useState<ChoiceKey | "stop" | "skip_probe" | "">("");
const [hoveredKey, setHoveredKey] = useState<ChoiceKey | "">("");
const selectedKey = props.selectedKey || localSelected;
const answered = Boolean(selectedKey);
const impactKey = (selectedKey === "A" || selectedKey === "B" || selectedKey === "C" || selectedKey === "D"
? selectedKey
: hoveredKey) as ChoiceKey | "";
const impactLine = impactKey ? props.card.answer_impact?.[impactKey] ?? "" : "";
function select(key: ChoiceKey) {
if (props.pending || props.disabled || selectedKey) return;
@@ -78,10 +73,6 @@ export function RectificationChoiceCard(props: RectificationChoiceCardProps) {
type="button"
className="birth-time-choice-option is-primary"
data-selected={selectedKey === option.key ? "true" : "false"}
onMouseEnter={() => setHoveredKey(option.key)}
onMouseLeave={() => setHoveredKey("")}
onFocus={() => setHoveredKey(option.key)}
onBlur={() => setHoveredKey("")}
onClick={() => select(option.key)}
>
<strong>{option.key}.</strong> {option.label}
@@ -98,9 +89,6 @@ export function RectificationChoiceCard(props: RectificationChoiceCardProps) {
</button>
) : null}
</div>
{impactLine ? (
<p className="rectification-choice-impact" role="status">{impactLine}</p>
) : null}
</fieldset>
</section>
);