const HF = "https://huggingface.co/";
const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ }[c]));
const link = (id, text) => `${esc(text)}`;
function card(m) {
const org = m.owner === "Hebrish";
const badges = [];
if (m.status) badges.push(`${esc(m.status)}`);
if (m.gated) badges.push('Access request');
const facts = [];
if (m.base_model) facts.push(["Base", link(m.base_model, m.base_model.split("/")[1])]);
if (m.license) facts.push(["License", esc(m.license)]);
if (m.variants.length) facts.push(["Formats", m.variants.map((v) => link(v.id, v.label)).join("")]);
return `
${esc(m.owner)} ยท ${esc(m.type)}
${link(m.id, m.name)}
${esc(m.summary)}
${badges.length ? `${badges.join("")}
` : ""}
${facts.length ? `${facts.map(([k, v]) => `- ${k}
- ${v}
`).join("")}
` : ""}`;
}
(async () => {
const data = await (await fetch("data.json")).json();
const q = document.getElementById("q"), out = document.getElementById("list"), tabs = document.getElementById("tabs");
const cards = data.groups.reduce((n, g) => n + g.models.length, 0);
document.getElementById("built").textContent = data.built;
document.getElementById("count").textContent = `${cards} models across ${data.repos} repositories.`;
const draw = () => {
const current = data.groups.find((g) => g.slug === location.hash.slice(1)) || data.groups[0];
const term = q.value.trim().toLowerCase();
tabs.innerHTML = data.groups.map((g) => `${esc(g.tab)} (${g.models.length})`).join("");
const grid = (list) => `
${list.map(card).join("")}
`;
if (!term) { out.innerHTML = `${esc(current.name)}
` + grid(current.models); return; }
const match = (m) => [m.id, m.name, m.type, m.summary, m.base_model, ...m.variants.flatMap((v) => [v.id, v.label])].join(" ").toLowerCase().includes(term);
out.innerHTML = data.groups.map((g) => [g, g.models.filter(match)]).filter(([, hit]) => hit.length)
.map(([g, hit]) => `${esc(g.name)}
` + grid(hit)).join("") || 'No models match.
';
};
q.addEventListener("input", draw);
addEventListener("hashchange", () => { q.value = ""; draw(); });
draw();
})();