feat(web): infra IDE réutilisable (persisted-ref, splitter, bootstrap temps réel)
Some checks failed
CI / Build & test (Node 24) (push) Has been cancelled
CI / Pack & boot smoke (Node 22) (push) Has been cancelled
CI / No em/en dashes (push) Has been cancelled
CI / Build & test (Node 22) (push) Has been cancelled

Extrait persistedRef dans lib/persisted-ref.ts (partagé, testable en node). Ajoute useSplitter + components/ide/PanelSplitter.vue (poignée de resize générique par pointer events, largeur/hauteur persistable), généralisant le resize souris de WorkspaceView.

Hisse le chargement initial et les abonnements temps réel dans useRealtimeBootstrap (monté par App.vue) : un seul propriétaire actif sur TOUS les layouts, y compris la vue IDE plein écran. AppShell et WorkspaceView n'en portent plus la responsabilité. Tests unitaires persisted-ref et useSplitter (10).
This commit is contained in:
2026-07-17 16:55:14 +02:00
parent 9a496abd00
commit cf60fa3a56
10 changed files with 244 additions and 55 deletions

View File

@@ -0,0 +1,23 @@
import { ref, watch, type Ref } from 'vue';
// Ref réactive persistée en localStorage : lue au démarrage (défaut si absente ou corrompue),
// réécrite à chaque changement. Gardée par try/catch, donc utilisable sans localStorage
// (tests en environnement node, navigation privée, quota dépassé).
export function persistedRef<T>(key: string, initial: T): Ref<T> {
let start = initial;
try {
const raw = localStorage.getItem(key);
if (raw != null) start = JSON.parse(raw) as T;
} catch {
/* localStorage indisponible / JSON corrompu : on garde le défaut */
}
const r = ref(start) as Ref<T>;
watch(r, (v) => {
try {
localStorage.setItem(key, JSON.stringify(v));
} catch {
/* quota / mode privé : silencieux */
}
});
return r;
}