Area
prototype/speaker-role-mapping.html — the screen that consumes the layout-first start handoff and assigns each placed video a podcast role.
Problem
Editing Speaker name is broken: you can only enter one character at a time.
The name field is an <input data-field="name"> wired to an input listener that calls updateTrack(), which unconditionally calls render(). render() rebuilds every track row with tracksElement.replaceChildren(...), destroying and recreating the very <input> the creator is typing in. So after the first keystroke the field is replaced, focus and caret are lost, and the next character does not land — the creator must click back into the field for each letter.
Steps to reproduce
- Open
prototype/speaker-role-mapping.html (the seeded tracks land with generic names like "Host video" / "Guest video").
- Click into Speaker name and type
Dana Brooks.
- Only
D is entered; focus is dropped. Each further character requires re-clicking the field.
Expected
Typing a speaker name updates live without losing focus, exactly like a normal text field. Labeling speakers is the core action of this screen.
Suggested fix
A name only affects the summary copy (issue titles); it does not change the badges or the readiness gate (those depend on role/sig/decision). Split render() into a full rebuild plus a summary-only refresh, and route field === "name" edits to the summary refresh so the track rows (and the focused input) are left intact. Role/signal/decision changes (<select> elements, plus the role->suggested reset) keep the full rebuild.
Area
prototype/speaker-role-mapping.html— the screen that consumes the layout-first start handoff and assigns each placed video a podcast role.Problem
Editing Speaker name is broken: you can only enter one character at a time.
The name field is an
<input data-field="name">wired to aninputlistener that callsupdateTrack(), which unconditionally callsrender().render()rebuilds every track row withtracksElement.replaceChildren(...), destroying and recreating the very<input>the creator is typing in. So after the first keystroke the field is replaced, focus and caret are lost, and the next character does not land — the creator must click back into the field for each letter.Steps to reproduce
prototype/speaker-role-mapping.html(the seeded tracks land with generic names like "Host video" / "Guest video").Dana Brooks.Dis entered; focus is dropped. Each further character requires re-clicking the field.Expected
Typing a speaker name updates live without losing focus, exactly like a normal text field. Labeling speakers is the core action of this screen.
Suggested fix
A name only affects the summary copy (issue titles); it does not change the badges or the readiness gate (those depend on role/sig/decision). Split
render()into a full rebuild plus a summary-only refresh, and routefield === "name"edits to the summary refresh so the track rows (and the focused input) are left intact. Role/signal/decision changes (<select>elements, plus the role->suggested reset) keep the full rebuild.