@@ -449,16 +449,37 @@ const StateCard: React.FC<{
449449 forceOpen ?: boolean | null ; // null means use local state, true/false forces open/closed
450450 hiddenFields ?: Set < string > ;
451451 onHideField ?: ( fieldName : string ) => void ;
452- } > = ( { st, highlighted = false , changes, showRemovals = false , forceOpen = null , hiddenFields, onHideField } ) => {
452+ onResetForceOpen ?: ( ) => void ; // Called when user clicks header while forceOpen is active
453+ } > = ( { st, highlighted = false , changes, showRemovals = false , forceOpen = null , hiddenFields, onHideField, onResetForceOpen } ) => {
453454 const [ localOpen , setLocalOpen ] = React . useState ( true ) ;
455+
456+ // Sync local state when forceOpen changes - this ensures that when we
457+ // reset to individual control, each state keeps the forced value
458+ React . useEffect ( ( ) => {
459+ if ( forceOpen !== null ) {
460+ setLocalOpen ( forceOpen ) ;
461+ }
462+ } , [ forceOpen ] ) ;
463+
454464 // Use forceOpen if set, otherwise use local state
455465 const open = forceOpen !== null ? forceOpen : localOpen ;
466+
467+ const handleHeaderClick = ( ) => {
468+ if ( forceOpen !== null && onResetForceOpen ) {
469+ // User clicked while in force mode - switch to individual control
470+ // Set local state to opposite of current forced state, then reset force
471+ setLocalOpen ( ! forceOpen ) ;
472+ onResetForceOpen ( ) ;
473+ } else {
474+ setLocalOpen ( o => ! o ) ;
475+ }
476+ } ;
456477 // Filter out hidden fields
457478 const entries = Object . entries ( st . fields ) . filter ( ( [ k ] ) => ! hiddenFields ?. has ( k ) ) ;
458479
459480 return (
460481 < div className = { `state-card ${ highlighted ? "is-highlighted" : "" } ` } >
461- < div className = "state-header" onClick = { ( ) => setLocalOpen ( ( o ) => ! o ) } >
482+ < div className = "state-header" onClick = { handleHeaderClick } >
462483 < span className = "action-chip" title = { st . tag ?? '' } >
463484 { st . tag || '(no action)' }
464485 </ span >
@@ -1189,7 +1210,7 @@ const ModelCheckerView: React.FC<ModelCheckerViewProps> = ({
11891210 { trace . map ( ( s : ParsedState , idx : number ) => {
11901211 const prev = idx > 0 ? trace [ idx - 1 ] . fields : undefined ;
11911212 const changes = diffChanges ( prev , s . fields ) ;
1192- return < StateCard key = { s . index } st = { s } changes = { changes } showRemovals = { showRemovals } forceOpen = { allStatesOpen } hiddenFields = { hiddenFields } onHideField = { toggleFieldVisibility } /> ;
1213+ return < StateCard key = { s . index } st = { s } changes = { changes } showRemovals = { showRemovals } forceOpen = { allStatesOpen } hiddenFields = { hiddenFields } onHideField = { toggleFieldVisibility } onResetForceOpen = { ( ) => setAllStatesOpen ( null ) } /> ;
11931214 } ) }
11941215 </ div >
11951216
0 commit comments