From 1637e2dd16f96a73e6350eaf9c4b0e74dc315c1d Mon Sep 17 00:00:00 2001 From: Local Dev Date: Mon, 21 Sep 2026 02:43:10 +0200 Subject: [PATCH] theseus + site: fix duplicate extension cards + real-icon rendering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Settings > Extensions: the Community list showed an entry even for extensions already listed above under Installed, so docx-editor appeared twice as soon as it landed in the gateway catalog. The render now filters out any catalog item whose id is installed — the Installed list handles updates via the poll + "Check for updates" button, so the Community list only needs to surface things you don't have. Empty-state copy branches on whether the catalog is empty vs "everything is installed". - theseus.x/extensions catalog renderer accepts data:image/... icons in addition to emoji, so an extension whose manifest.icon is an SVG data URI (pdf-editor, docx-editor) renders as an instead of the raw URI text. - Static PDF Editor entry on that page now uses the same inline SVG badge the browser dock renders. --- extensions/index.html | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/extensions/index.html b/extensions/index.html index 2bb8db1..aaf1113 100644 --- a/extensions/index.html +++ b/extensions/index.html @@ -181,7 +181,7 @@
-

📄 PDF Editor current 0.1.0

+

PDF Editor current 0.1.0

Open a PDF in a full tab — read, highlight, mark up, reorder or rotate or drop pages, fill form fields, save a new copy. Annotations are written as real PDF content, the original is never touched. Opens from the toolbar's PDF Editor menu or the right-click Open PDF in editor @@ -278,9 +278,14 @@ const cat = r.ok ? await r.json() : { extensions: [] }; const list = Array.isArray(cat.extensions) ? cat.extensions : []; if (!list.length) { box.innerHTML = '
Nothing published yet — yours could be the first. See Build and publish your own.
'; return; } + const iconHtml = (icon) => { + const s = String(icon || "🧩"); + if (/^data:image\//i.test(s)) return ``; + return esc(s); + }; box.innerHTML = list.map((e) => `
-

${esc(e.icon || "🧩")} ${esc(e.name)} v${esc(e.latest)}

+

${iconHtml(e.icon)} ${esc(e.name)} v${esc(e.latest)}

${esc(e.description)}
Published by ${esc(e.publisher)} · ${esc(String(e.versions || 1))} version${e.versions === 1 ? "" : "s"} · updated ${esc(String(e.updatedAt || "").slice(0, 10))}${e.capabilities && e.capabilities.length ? " · " + esc(e.capabilities.join(", ")) : ""}
${installUi(e.id)}