fix(play): story-card clicks no longer trigger vision

Symptom: on a choice beat, clicking the dialogue/narration card fired
the vision ("识图") flow instead of doing nothing. Picking an option with
fast clicks that landed on the card repeatedly kicked off the expensive
/api/vision → insert-beat/scene chain — janky and confusing.

Root cause: the story-card <div> had `pointer-events-none`, so clicks
passed through to the background <img> onClick (handleImageClick), which
on choice beats calls onBackgroundClick → vision.

Fix: the card now owns its clicks (`pointer-events-auto` + handleCardClick):
  - mid-typing   → completes the text (VN skip affordance, unchanged)
  - continue beat → advances, as before
  - choice beat  → no-op (no vision)
Clicking the actual scene art still triggers vision; choice buttons
already had pointer-events-auto and are unaffected.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
yuanzonghao
2026-06-04 09:17:30 +08:00
parent b805b1d9c2
commit a18b91c48c
+14 -1
View File
@@ -276,6 +276,18 @@ export function PlayCanvas({
});
}
// Card swallows its own clicks so they never fall through to the image's
// vision (识图) trigger: while typing a click completes the text, a continue
// beat advances, and a choice beat stays inert (player must pick an option).
function handleCardClick() {
if (phase !== "ready" || !beat) return;
if (!typingDone) {
skipTypewriter();
return;
}
if (beat.next.type === "continue") onAdvance();
}
const interactive = phase === "ready" && !!imageUrl;
const dimmed = phase === "transitioning";
@@ -366,7 +378,8 @@ export function PlayCanvas({
{(beat.narration || beat.line) && (
<div
className="pointer-events-none mx-[2%] mb-[2%] px-[3%] py-[2.2%] relative"
className="pointer-events-auto mx-[2%] mb-[2%] px-[3%] py-[2.2%] relative"
onClick={handleCardClick}
style={{
background: "rgba(14, 10, 6, 0.72)",
border: "1.5px solid rgba(175, 138, 72, 0.60)",