3c0ae49a23
Closes #15957 The core problem: `handleChange` calls `setDraftValue`, but when blur fires, `handleClickOutside` runs in the same event turn and uses the `draftValue` captured in its closure from the last render. React hasn’t re-rendered yet, so that captured `draftValue` is stale. Recoil atom writes are synchronous, but the render that would update the closure happens on the next turn. I considered deferring `handleClickOutside` to the next tick (setTimeout/Promise), but that’s a timing hack: it makes focus/blur ordering unpredictable (inline cells, tables, other listeners), risks double triggers, and can fire after unmount. Another option was to duplicate the `handleChange` logic inside `handleClickOutside` (screenshot), but that defeats having draft state in one place. <p align="center"> <img width="496" height="332" alt="const nextSecondaryLinks = updatedLinks slice (1);" src="https://github.com/user-attachments/assets/638e2bcf-871b-4b53-9124-c8489c5db530" /> </p> The clean solution is to read the current draft from a Recoil snapshot at call time inside `handleClickOutside`. Snapshot reads pull the latest atom value (including synchronous `setDraftValue` that just ran) even before a re-render occurs, so they’re not subject to the stale closure. That way, blur uses the up-to-date draft without timing hacks or duplicated logic. MultiItemFieldInput is used in four places. Each of them contains the updated code.