4de7f35b92
Ink's focusNext returns `findNextFocusable(...) ?? firstFocusableId` (App.tsx:455-487), so it ALWAYS reassigns activeId — to the next active, the first active, or undefined when NO focusable is active. vue's focusNext/focusPrevious only did `if (next) setActive(next)`, so when no focusable was active (reachable via focus(id) pinning an isActive=false item) the stale activeId was left in place. Call setActive(findNextActive(...)) unconditionally — a null result now clears the stale activeId (and fires the blur notification Ink also fires), matching Ink. Normal Tab cycling among active items is unchanged (findNextActive already wraps to the first/last active, equivalent to Ink's `next ?? first`). The focusables.length===0 guard is kept (activeId is already null at 0 focusables via remove(), and it avoids a %0 in the wrap arithmetic). Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>