feat(theseus/settings): Plug-ins section — Ariadne's Thread + Aegis moved out of General

New sidebar tab between Privacy and Extensions. The two long
system-scoped cards (Ariadne's Thread system-wide resolver, Aegis
built-in wallet) were bloating the General section; they cluster
naturally as "components that live alongside Theseus, each with
install/update/on-off controls of their own" and now have their
own home.

- Adds <a data-sec="plugins">Plug-ins</a> to nav.side
- New <section id="plugins"> with a short lede
- Ariadne + Aegis row blocks moved from General to Plug-ins verbatim
- sections array in showSection() extended with "plugins"
- Tab-switch handler clicks ariadneRefresh so status is never stale;
  Aegis card auto-loads on page-init and its "Check for updates"
  button stays user-initiated (avoid firing a network request every
  time the user opens the Plug-ins tab)
This commit is contained in:
Local Dev 2026-09-08 23:00:41 +02:00
parent 1b10afa1ca
commit 71bd3004e0
2 changed files with 17 additions and 2 deletions

View file

@ -1,6 +1,6 @@
{
"name": "theseus-navigator",
"version": "0.3.35",
"version": "0.3.36",
"description": "Theseus Navigator — a browser that follows the thread. By Silent Mode, a Deviant project.",
"author": "Silent Mode",
"main": "main.js",

View file

@ -171,6 +171,7 @@
<a data-sec="passwords">Passwords</a>
<a data-sec="performance">Performance</a>
<a data-sec="privacy">Privacy</a>
<a data-sec="plugins">Plug-ins</a>
<a data-sec="addons">Extensions</a>
</nav>
<div class="content">
@ -227,6 +228,11 @@
<div id="colSummary" class="pmuted" style="font-size:12.5px"></div>
<div><button id="resetCollisions" class="btn">Reset remembered choices</button></div>
</div>
</section>
<!-- PLUG-INS -->
<section id="plugins" hidden>
<h1>Plug-ins</h1>
<p class="lede">Silent Mode components that live alongside Theseus — the system-wide resolver and the built-in wallet. Each ships with its own install / update / on-off controls.</p>
<div class="row" style="flex-direction:column;align-items:stretch;gap:8px">
<div class="txt">
<div class="t">System-wide resolver — Ariadne's Thread</div>
@ -605,7 +611,7 @@
// into General in 0.3.21. Leaving the id in this list threw a
// TypeError inside showSection (getElementById("naming") → null),
// which broke every click after General/Search/Passwords.
const sections = ["general", "search", "passwords", "performance", "privacy", "addons"];
const sections = ["general", "search", "passwords", "performance", "privacy", "plugins", "addons"];
function showSection(sec) {
if (!sections.includes(sec)) return;
document.querySelectorAll(".side a").forEach((x) => x.classList.toggle("active", x.dataset.sec === sec));
@ -1275,6 +1281,15 @@
});
document.getElementById("addonsOpenDir").addEventListener("click", () => C.openAddonsDir());
document.querySelector('.side a[data-sec="addons"]').addEventListener("click", () => { loadAddons(); loadStagedAddonUpdates(); });
// Plug-ins tab: refresh Ariadne's live daemon state on every visit so it
// doesn't display stale "checking…" text if the background poll finished
// while another section was open. Aegis card loads on page-init and its
// "Check for updates" button is user-initiated, so we don't auto-poll it
// (that would fire a network request every tab-switch).
document.querySelector('.side a[data-sec="plugins"]').addEventListener("click", () => {
const ar = document.getElementById("ariadneRefresh");
if (ar) ar.click();
});
// Manual "Check for updates" for extensions — runs the same signed-update
// polling the boot timer runs, and surfaces what's staged for the next