Preferences is one component holding two hundred pieces of state, and its
biggest panels are eight hundred lines of form — external services, CAT.
A plain controlled input sends every keystroke into that state, so every
character re-rendered the whole dialog, and the letter arrived after the
finger had left the key.
BufferedInput keeps the text where it is typed and hands it up 120 ms
later. A drop-in for Input, so the change is one import rather than a
hundred call sites — which means it has to be right in every shape those
call sites take:
• Blur flushes at once, so clicking Save cannot lose the last word, and
so does unmounting: a panel changed mid-word still hands up what was
there.
• A value that comes back DIFFERENT from what was sent up is adopted,
even with the focus in the field. That is what keeps the fields that
normalise as you type working — the callsign box that upper-cases,
the port box that drops everything but digits. They echo a corrected
value, and the correction wins.
• A value changed from outside while the field is idle wins too: that
is how loading the settings, or switching profile, refills the form.
• Checkboxes, colour pickers and file fields pass straight through.