homepage: rework LLM model cards to structured role/spec/use lines

Each LLM card now carries a details object (role/spec/use) rendered as a
bold pale-green role, a bright-green spec line, and a dim 'Use:' line.
app.js descHTML() falls back to the plain description for non-LLM cards;
new .desc-role/.desc-spec/.desc-use CSS + bare-mode reset.

Roles made neutral (no nicknames): frank-large = deep reasoning,
frank-medium = primary model, frank-small = fast utility model.

The /docs model guide was fixed — it had drifted to retired model info
(frank-large as Qwen3.8-Flash-Next 87.3 GiB/200k, frank-medium as FP8
~31 GiB) — now Qwen3.8-27B UD-Q8_K_XL 31.5 GiB/262k and MXFP4/W4A8
19.4 GiB, reordered large->medium->small. bats 30/30 + live render.
This commit is contained in:
Frank committed 2026-09-25 23:51:41 -07:00
1 parent a489d8481d
commit 57fd42af6a
5 files changed
+47 -16

No files matched your search

+15 -1
View File
@@ -31,6 +31,20 @@ function esc(s) {
});
}
// The description: structured role/spec/use lines when the service defines
// them (the LLM cards), else the plain description string.
function descHTML(svc) {
const d = svc.details;
if (d && (d.role || d.spec || d.use)) {
const lines = [];
if (d.role) lines.push('<div class="desc-role">' + esc(d.role) + '</div>');
if (d.spec) lines.push('<div class="desc-spec">' + esc(d.spec) + '</div>');
if (d.use) lines.push('<div class="desc-use">Use: ' + esc(d.use) + '</div>');
return lines.join('');
}
return esc(svc.description || '');
}
// Shared panel component: one TUI panel for a service in a given state.
function renderPanel(svc, state) {
const panel = document.createElement('div');
@@ -43,7 +57,7 @@ function renderPanel(svc, state) {
' <span class="badge ' + state + '">' + BADGE_LABEL[state] + '</span>' +
' <span class="name">' + esc(svc.name) + '</span>' +
'</div>' +
'<div class="desc">' + esc(svc.description || '') + '</div>' +
'<div class="desc">' + descHTML(svc) + '</div>' +
'<div class="links">' + links.join('') + '</div>';
return panel;
}