feat(web): infra IDE réutilisable (persisted-ref, splitter, bootstrap temps réel)
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:
23
packages/web/src/lib/persisted-ref.ts
Normal file
23
packages/web/src/lib/persisted-ref.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user