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:
+64
-8
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user