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:
29
packages/web/src/components/ide/PanelSplitter.vue
Normal file
29
packages/web/src/components/ide/PanelSplitter.vue
Normal file
@@ -0,0 +1,29 @@
|
||||
<template>
|
||||
<div
|
||||
class="shrink-0 bg-transparent transition-colors hover:bg-accent/40"
|
||||
:class="axis === 'x' ? 'w-1 cursor-col-resize' : 'h-1 cursor-row-resize'"
|
||||
role="separator"
|
||||
:aria-orientation="axis === 'x' ? 'vertical' : 'horizontal'"
|
||||
@pointerdown="onPointerDown"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// Poignée de redimensionnement réutilisable pour les panneaux de l'IDE.
|
||||
// La taille est un v-model (px) que le parent persiste via le store IDE.
|
||||
import { useSplitter } from '../../composables/useSplitter';
|
||||
|
||||
const size = defineModel<number>({ required: true });
|
||||
const props = defineProps<{ axis: 'x' | 'y'; min: number; max: number; invert?: boolean }>();
|
||||
|
||||
const { onPointerDown } = useSplitter({
|
||||
axis: props.axis,
|
||||
min: props.min,
|
||||
max: props.max,
|
||||
invert: props.invert,
|
||||
get: () => size.value,
|
||||
set: (v) => {
|
||||
size.value = v;
|
||||
},
|
||||
});
|
||||
</script>
|
||||
Reference in New Issue
Block a user