feat: integrate DSH Filebrowser (pinned v2.32.0, dark mode, toggle selector UI from Claude Design, /u/nabil/files/ proxy)

This commit is contained in:
bolbol
2026-08-19 23:29:25 +01:00
parent 4923aa380e
commit 098e377d27
7 changed files with 218 additions and 17 deletions
+64 -8
View File
@@ -1,15 +1,21 @@
/**
* Hermes Hub — Client-side Workspace Switcher & Context Manager
* Garantit l'isolation stricte du state front-end entre univers
* Intègre le sélecteur toggle DSH (Session vs Explorateur de fichiers)
*/
(function () {
let activeUniverse = "tt";
let activeMode = "session"; // "session" ou "files" (pour l'univers nabil)
const iframe = document.getElementById("workspace-iframe");
const loader = document.getElementById("hub-loader");
const activeTitle = document.getElementById("active-universe-name");
const activeScope = document.getElementById("active-universe-scope");
const activeTagline = document.getElementById("active-universe-tagline");
const nabilModeToggle = document.getElementById("nabil-mode-toggle");
const tabSession = document.getElementById("tab-session");
const tabFiles = document.getElementById("tab-files");
// Accent mappings
const ACCENT_MAP = {
@@ -33,21 +39,51 @@
document.documentElement.style.setProperty("--hub-accent-glow-current", glow);
}
function switchUniverse(universeId) {
if (!universeId || (activeUniverse === universeId && iframe.src !== "about:blank")) {
return;
function getTargetUrl(universeId, mode) {
if (universeId === "nabil" && mode === "files") {
return "/u/nabil/files/";
}
return `/u/${universeId}/`;
}
function setMode(mode) {
activeMode = mode;
if (tabSession && tabFiles) {
if (mode === "session") {
tabSession.classList.add("active");
tabSession.setAttribute("aria-selected", "true");
tabFiles.classList.remove("active");
tabFiles.setAttribute("aria-selected", "false");
} else {
tabFiles.classList.add("active");
tabFiles.setAttribute("aria-selected", "true");
tabSession.classList.remove("active");
tabSession.setAttribute("aria-selected", "false");
}
}
// Recharger le canvas avec le mode choisi
loader.classList.remove("hidden");
iframe.src = "about:blank";
setTimeout(() => {
iframe.src = getTargetUrl(activeUniverse, activeMode);
}, 50);
}
function switchUniverse(universeId) {
if (!universeId) return;
const btn = document.querySelector(`.hub-universe-btn[data-universe="${universeId}"]`);
if (!btn) return;
// 1. ISOLATION TOTALE DU STATE CLIENT
// Forcer le déchargement de l'iframe précédente pour éliminer tout résidu JS en mémoire
// Décharger immédiatement l'iframe précédente pour purger la mémoire JS
loader.classList.remove("hidden");
iframe.src = "about:blank";
// 2. Mettre à jour l'univers actif
activeUniverse = universeId;
activeMode = "session"; // Réinitialiser le mode à session par défaut
// 3. Mettre à jour la classe active sur la sidebar
document.querySelectorAll(".hub-universe-btn").forEach((el) => el.classList.remove("active"));
@@ -60,15 +96,31 @@
const name = btn.dataset.name || universeId.toUpperCase();
const scope = btn.dataset.scope || universeId;
const tagline = btn.dataset.tagline || "";
const supportsFiles = btn.dataset.supportsFiles === "true";
if (activeTitle) activeTitle.textContent = name;
if (activeScope) activeScope.textContent = `Scope: ${scope}`;
if (activeTagline) activeTagline.textContent = tagline;
// 6. Charger le nouvel univers via le proxy dédié
const targetProxyUrl = `/u/${universeId}/`;
// 6. Afficher ou masquer le sélecteur toggle DSH (Claude Design)
if (nabilModeToggle) {
if (supportsFiles) {
nabilModeToggle.classList.add("visible");
// Reset tabs visual state
if (tabSession && tabFiles) {
tabSession.classList.add("active");
tabSession.setAttribute("aria-selected", "true");
tabFiles.classList.remove("active");
tabFiles.setAttribute("aria-selected", "false");
}
} else {
nabilModeToggle.classList.remove("visible");
}
}
// 7. Charger le nouvel univers via le proxy dédié
setTimeout(() => {
iframe.src = targetProxyUrl;
iframe.src = getTargetUrl(activeUniverse, activeMode);
}, 50);
}
@@ -105,7 +157,7 @@
}
}
// Modal Personnalité
// Modales Personnalité & Clonage
const personaModal = document.getElementById("persona-modal");
const cloneModal = document.getElementById("clone-modal");
@@ -190,6 +242,10 @@
});
});
// Toggle Mode DSH (Session vs Files)
tabSession?.addEventListener("click", () => setMode("session"));
tabFiles?.addEventListener("click", () => setMode("files"));
// Outils Footer
document.getElementById("btn-edit-persona")?.addEventListener("click", openPersonaModal);
document.getElementById("btn-clone-universe")?.addEventListener("click", openCloneModal);