Wrote some UI Context events / callbacks for drag-and-drop functionality. Made a proof of concept where the user can drag menu-items between two ListBoxes.
Re-order menu-items within a ListBox by dragging with the mouse. Note that this is unrelated to the context drag-and-drop implementation.
Started a TreeBox widget.
Added utf8Tools to ProdUI to validate UTF-8 strings. (When using utf8.len as a string validator, it will allow some invalid code point values that LÖVE rejects.)
Turned the Simple TextBox into a barebones input box widget. It has no caret controls, and can only append or delete text at the end of the string.
Fixed up the main TextBox widget and the underlying EditField library (now called LineEditor).
Implemented multi-line indent and unindent (tab or shift+tab while highlighting multiple lines).
Added auto-indent and shifting whole lines (alt+up, alt+down).
(LÖVE 12) Added NumLock-off keypad input for LineEditor.
Split the TextBox widget into multi-line and single-line versions. The single-line version is partially functional: keyboard commands work, mouse actions are missing. The hope was that I could stuff logic into shared functions that are used in both implementations, but this isn’t panning out so far due to (among other things) the multi-line version using an array-of-strings data structure with its own API methods. If I can’t get the sharing to work, I may remove the single-line implementation and just use the multi-line version with some settings to disable line feeds.