"use client"; import { MessageResponse } from "@/components/ai-elements/message"; import { cn } from "@/lib/utils"; import type { ArtifactPartProps } from "@/src/core"; /** * The practice transcript cards (practice sessions, owner design * 2026-10-04): three quiet records in the stream — * * - ProblemCard — a posed problem: the statement, compact-expandable * (like every card here; the dock is the working surface, this is the * record). The commitment NEVER renders — only the call's statement. * - ConcludeCard — the conclusion: outcome badge + verdict + the reveal * (the committed solution, shown when the problem ended). A dismissal * synthesis (outcome:"dismissed") renders as one muted line. * - ThinkingCard — the learner's own submission, user-side: the register * is the two buttons' (Nudge = working trace, Commit = answer). The * UNIFIED ThinkingBlock (owner round 2026-10-05): the quiz quote-block * language in a faint user-side shell, never collapsible. */ import { ThinkingBlock } from "@/components/thinking-block"; /** The practice-thinking marker's details (native-messages.ts). */ export interface PracticeThinkingData { problemCallId: string; /** Legacy records (pre 2026-10-05) carry the old two-lane flag; ignored. */ commit?: boolean; text: string; } export function ProblemCard({ part }: ArtifactPartProps) { // Always open, no chevron (owner round, 2026-10-05): the record IS the // statement — same container + eyebrow discipline as the answered card // and the dock (which mirrors this in Slice D). The commitment never // renders — only the call's statement. const input = (part.input ?? {}) as { statement?: string }; const statement = typeof input.statement === "string" ? input.statement : ""; return (