Removing freshVnode() without converting any of the 53 popupMessage
call sites froze every dynamic modal at its first render: mithril skips
a subtree whose children array is identical between redraws, so the Add
Friend and Create Identity dialogs kept their submit buttons disabled
forever and displayed none of what was typed. The recursive copy is
back for vnode call sites -- component call sites keep the new direct
m(component) path, which is the right long-term shape; converting the
call sites one by one can then retire the copy for real.
For a component vnode (m(SomeComponent) passed ready-made) the copy
rebuilds via m(tag, attrs, children) without descending into children,
which belong to the component's own view.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A vnode carries the DOM node it owns, so the same one must not be rendered
twice. popupMessage is handed a ready made vnode and now mounts it, which
re-renders it on every global redraw, so freshVnode() rebuilds it on each pass.
It only rebuilt the root though: `m(vnode.tag, vnode.attrs, vnode.children)`
passes the children array by reference, and updateNodes() starts with
if (old === vnodes ...) return
so mithril skips the entire subtree. Everything below the first level of a modal
is therefore frozen at its first render — which goes unnoticed today because the
popups built as plain vnode trees are all static messages, and everything that
has to update is passed as a component. It is a trap for the next one.
The clone is now recursive, with the three tags that are not selectors handled
through their own factory: '<' is m.trust, and rebuilding it with m() would
silently turn trusted html into an empty div, since '<' matches nothing in the
selector parser; '[' is m.fragment; '#' is a text vnode whose children is the
string itself.
Checked that no popup built as a plain tree contains an input, textarea or
select, so nothing starts having its value re-applied under the user's fingers:
every form modal goes through a component, which re-renders on its own.
The version label assumes the loader robustness PR lands first.
Added Navbar for webui on phones
for Boards and Channels:
* Validate API responses before processing.
* Keep rendering/navigation functional if a response is incomplete.
* Log a clear warning instead of throwing an uncaught error.
* Use independent sorted arrays, avoiding mutation of the master list.