Splits rendering into panels/list.lua and panels/detail.lua. List
implements row hit-test, scroll-state, whole-list bg-tint hook for the
dep-conflict UX (L-Q6). Detail renders an empty-state placeholder
until L.4-L.7 fill in title, description, deps, carousel, and launch
button.
The body region rebuilt from line-split included a trailing empty
entry from the final LF the parser appends to drive its gmatch. Strip
it so 'body text\n' (the on-disk content) parses to 'body text' (the
user-visible body), which is what the launcher-test asserts.
Hand-rolled parser + renderer for the launcher's description bodies.
Supports headers H1-H3, paragraphs, bullet + ordered lists, inline
bold/italic/code, inline images. No tables, blockquotes, links, or
code blocks. Font sizes per spec L-Q3 (H1=24, H2=20, H3=16, body=14).
Images resolve via engine.module.load_texture when a module_id is
provided to the renderer.
Parses manifest.launcher.md leading JSON-frontmatter (delimited by
standalone '---' lines), returns (meta, body). Reuses
lib-management.dep-fetcher._json_decode so we do not add a second JSON
decoder to the codebase. Lazy require so test-lib contexts can swap a
stub decoder via _G.LAUNCHER_FRONTMATTER_DECODER.
- Async update-check per module on init (git.start_ls_remote_tags),
polled per frame. Result classified into available / no-update /
fail / local-only via the new kind field from lib-core.git 0.2.0.
- Pre-emptive dep-check per module (depf.ensure_for_module) on init
populates a dep_check_result whose ok/conflicts/warnings/errors
drive the icon strip.
- Inline icon strip per module-row (icons.lua): rotating ASCII
spinner while pending, yellow warn for auth/network failures or
dirty deps, blue update-badge with target version (clickable to
trigger fetch+checkout), red error for dep-check conflicts, gray
L for repos that genuinely don't exist on the server. Tooltip on
hover shows the specific reason per icon.
- Click handler splits launch-vs-update by hit-testing the badge
rect before the row rect. Launch is blocked when dep-check failed.
- On init, reads engine.config("gitea_token") and forwards via
git.set_token so users can persist their token in their user-data
engine.json layer instead of using an env var.
- New deps: lib-core.git 0.1.0, lib-management.dep-fetcher 0.1.2.
Initial README following the project's module documentation structure:
Abstract paragraph, Badges as bold key:value list, Topology section
with auto-generated mermaid graph, Controls describing player input,
Demonstrates listing the Sporel features showcased, References at
the end.
Install pre-commit hook via Sporel --install-hooks=.; topology is
auto-managed by Sporel --lint --fix.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>