- .cm-editor pinned to font-size 1rem so the input matches the
output pane (CodeMirror 6 defaults smaller)
- refreshLoaded(isInitial=true) on first load picks the hot model
as the dropdown default — avoids the 5-15s disk reload on the
first translation. Subsequent refreshes don't override the user's
manual selection.
- document-level Shift-H / Shift-L cycle focus across controls
(source → target → model → editor → button), suppressed when
focus is inside CodeMirror so vim's viewport H/L still work.
- Replace the plain <textarea> with a CodeMirror 6 EditorView that
has @replit/codemirror-vim attached. Loaded from esm.sh, so no
build step — finrod stays no-bundler.
- vim() extension is conditionally omitted on coarse-pointer devices
(phones, tablets) where modal editing without a hardware Esc key
is unusable and IME composition fights the keymap.
- Ctrl-/Cmd-Enter shortcut and the typing-debounce that refreshes
the "Hot:" indicator both migrate to CodeMirror's keymap and
updateListener APIs respectively.
- Editor styled to match the existing .output pane.
CHANGELOG: note under [Unreleased].
- CHANGELOG.md following Keep a Changelog; 0.1.0 entry covers all
features shipped through the loaded-model indicator
- build.sh now also tags the image with the version read from
pyproject.toml, e.g. rg.nl-ams.scw.cloud/valinor/finrod:0.1.0
- README documents the release workflow (edit CHANGELOG, bump
pyproject version, merge, tag vX.Y.Z, build, bump valinor)