feat(web): zone éditeur à onglets (Monaco multi-modèles + diff)
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

components/ide/EditorArea.vue : UNE instance Monaco partagée avec cache de modèles par onglet (préserve contenu, undo et curseur au changement d'onglet ; view states restaurés), thème arboretum-dark, save + conflit STALE_FILE + reload/overwrite, dispose des modèles à la fermeture d'onglet et au démontage. Onglets diff via DiffViewer.

components/ide/EditorTabs.vue : bandeau d'onglets multi-projets, point de modification, fermeture immédiate si propre et garde à deux clics si modifié. Bascule éditeur/diff par onglet. Branché dans IdeShell (centre). 427 tests.
This commit is contained in:
2026-07-17 17:12:15 +02:00
parent c96d929c7a
commit f62404234b
3 changed files with 313 additions and 3 deletions

View File

@@ -8,9 +8,9 @@
</template>
<div class="flex min-w-0 flex-1 flex-col">
<!-- centre : éditeur à onglets (livré en B4). Placeholder pour l'instant. -->
<!-- centre : éditeur Monaco à onglets + diff (B4) -->
<main class="min-h-0 flex-1 overflow-hidden">
<EmptyState :icon="FileCode" :title="t('ide.noFileOpen')" :hint="t('ide.noFileHint')" class="m-6" />
<EditorArea />
</main>
<!-- dock terminaux (livré en B5). Placeholder pour l'instant. -->
@@ -33,7 +33,7 @@
// des ressources ouvertes contre les données live (worktrees / sessions).
import { watch } from 'vue';
import { useI18n } from 'vue-i18n';
import { FileCode, SquareTerminal } from '@lucide/vue';
import { SquareTerminal } from '@lucide/vue';
import { useIdeStore, wtKey } from '../../stores/ide';
import { useWorktreesStore } from '../../stores/worktrees';
import { useSessionsStore } from '../../stores/sessions';
@@ -41,6 +41,7 @@ import ActivityBar from './ActivityBar.vue';
import PrimarySidebar from './PrimarySidebar.vue';
import PanelSplitter from './PanelSplitter.vue';
import StatusBar from './StatusBar.vue';
import EditorArea from './EditorArea.vue';
import EmptyState from '../ui/EmptyState.vue';
const { t } = useI18n();