channelRows() referenced INPUT_STYLE expecting server-side substitution like
fieldRow() does, but never actually got it - it shipped as a literal
\${INPUT_STYLE} in the browser script, and nothing declared that name
client-side. Since channelRows() always renders at least one row, this threw
immediately on every plugin card, which crashed renderPlugins() (plugins list
never appeared) and crashed the post-save init() refresh too (edits looked
like they weren't taking effect). Now declares INPUT_STYLE once as a real
client-side const instead of the fragile double-escape trick, and init()
surfaces failures visibly instead of leaving the panel silently blank.
Public index.json now exposes every admin-set channel name (not just a hardcoded
"stable"), matching Next's real repository protocol - the in-app UI lists whatever
channel names a repo defines. Admin panel now reads from a new /api/admin/state
endpoint (full override + channel + site data) instead of /index.json, which only
ever carried the public-facing fields - fixes fields appearing blank on reload.
Channel editing is now a free-form name+version input instead of a single
"promote to stable" button.
Also: color accents, drifting background blobs, a few floating decorative icons
(pride flag included), and a custom cursor follower on desktop, applied site-wide
via the shared theme shell.