diff --git a/src/components/RulesOfInferencePlayground.tsx b/src/components/RulesOfInferencePlayground.tsx index e377d5d..95f6778 100644 --- a/src/components/RulesOfInferencePlayground.tsx +++ b/src/components/RulesOfInferencePlayground.tsx @@ -88,12 +88,18 @@ function parseDragData(e: React.DragEvent): { type: DragType; value: string } | } } -function DraggableChip({ label, onDragStart: handle, disabled = false }: { label: string; onDragStart: (e: React.DragEvent) => void; disabled?: boolean }) { +function DraggableChip({ label, onDragStart: handle, onDoubleClick, disabled = false }: { + label: string; + onDragStart: (e: React.DragEvent) => void; + onDoubleClick?: () => void; + disabled?: boolean; +}) { return (
setActivePremises((prev) => prev.filter((x) => x !== p)); + // Double-click handlers + const handlePremiseDoubleClick = (premise: string) => { + if (reachedTarget) return; + if (!availableStatements.includes(premise)) return; + setActivePremises((prev) => (prev.includes(premise) ? prev : [...prev, premise])); + }; + + const handleRuleDoubleClick = (rule: string) => { + if (reachedTarget) return; + setActiveRule(rule); + }; + + // Check for invalid rule combination and show error + useEffect(() => { + if (activeRule && activePremises.length > 0 && candidates.length === 0) { + setShowInvalidRuleModal(true); + setActiveRule(undefined); + } + }, [activeRule, activePremises, candidates.length]); + return (
{/* Top controls */} @@ -290,7 +316,13 @@ export default function RulesOfInferencePlayground({ onComplete }: { onComplete?

Initial premises

{example.premises.map((p) => ( - onDragStart(e, "premise", p)} disabled={reachedTarget} /> + onDragStart(e, "premise", p)} + onDoubleClick={() => handlePremiseDoubleClick(p)} + disabled={reachedTarget} + /> ))}
@@ -303,6 +335,7 @@ export default function RulesOfInferencePlayground({ onComplete }: { onComplete? key={`${s.result}-${idx}`} label={s.result} onDragStart={(e) => onDragStart(e, "statement", s.result)} + onDoubleClick={() => handlePremiseDoubleClick(s.result)} disabled={reachedTarget} /> ))} @@ -317,7 +350,12 @@ export default function RulesOfInferencePlayground({ onComplete }: { onComplete?
{example.rules.map((r) => (
- onDragStart(e, "rule", r.id)} disabled={reachedTarget} /> + onDragStart(e, "rule", r.id)} + onDoubleClick={() => handleRuleDoubleClick(r.id)} + disabled={reachedTarget} + /> {r.help &&

{r.help}

}
))}