diff --git a/components/MediaTabBackend.vue b/components/MediaTabBackend.vue index 94cf0fa..782677e 100644 --- a/components/MediaTabBackend.vue +++ b/components/MediaTabBackend.vue @@ -8,16 +8,6 @@

- -
-

⏳ Backend en cours d'exposition publique — bientôt accessible.

-

L'interface LightRAG sera disponible ici dès la mise en place du sous-domaine lightrag.trans-former.fr.

-
- - diff --git a/components/MediaTabVisuel.vue b/components/MediaTabVisuel.vue index d06b873..63188da 100644 --- a/components/MediaTabVisuel.vue +++ b/components/MediaTabVisuel.vue @@ -10,7 +10,7 @@ :class="[ layoutMode === 'split' ? 'carte-split' : '', layoutMode === 'carte-full' ? 'carte-full' : '', - layoutMode === 'chatbot-full' ? 'carte-hidden' : '', + (layoutMode === 'chatbot-full' || layoutMode === 'bonpote' || layoutMode === 'rag-backend') ? 'carte-hidden' : '', ]" :style="layoutMode === 'split' ? { flexBasis: carteFlexBasis } : {}" style="position: relative;" @@ -80,33 +80,46 @@ Chatbot plein ecran - - - - + +
+ +
+ + +
+ +
@@ -125,7 +138,7 @@ :class="[ layoutMode === 'split' ? 'chatbot-split' : '', layoutMode === 'chatbot-full' ? 'chatbot-full-mode' : '', - layoutMode === 'carte-full' ? 'chatbot-hidden' : '', + (layoutMode === 'carte-full' || layoutMode === 'bonpote' || layoutMode === 'rag-backend') ? 'chatbot-hidden' : '', ]" :style="layoutMode === 'split' ? { flexBasis: chatbotFlexBasis } : {}" > @@ -189,6 +202,14 @@ + +
+ +
+ @@ -264,7 +285,7 @@ interface LivreRag { slug: string; titre: string; annee: number; couches: string interface AuteurData { id: string; nom: string; dates: string; ecoles: string[]; ecole_principale: string; livres_rag: LivreRag[]; theses_cles: string[]; bio_courte: string } interface PenseesData { meta: any; ecoles: EcoleData[]; auteurs: AuteurData[] } -type LayoutMode = 'split' | 'carte-full' | 'chatbot-full' | 'bonpote' +type LayoutMode = 'split' | 'carte-full' | 'chatbot-full' | 'bonpote' | 'rag-backend' const STORAGE_KEY = 'media-layout-mode' const SPLIT_RATIO_KEY = 'media-split-ratio' @@ -279,19 +300,15 @@ const chatbotAuteur = ref(null) const layoutMode = ref('split') const cartePenseesRef = ref<{ triggerResize: () => void } | null>(null) -// Toggle PDF FRACAS const showFracasPdf = ref(false) const fracasOpacity = ref(60) -// Props injectées depuis le parent (penseesData) -const props = defineProps<{ penseesData: PenseesData | null }>() +const penseesData = ref(null) -// Ratio de la carte vs chatbot en mode split (0.2 a 0.8) const splitRatio = ref(DEFAULT_SPLIT_RATIO) const carteFlexBasis = computed(() => `${splitRatio.value * 100}%`) const chatbotFlexBasis = computed(() => `${(1 - splitRatio.value) * 100}%`) -// Logique poignee draggable let dragStartY = 0 let dragStartRatio = DEFAULT_SPLIT_RATIO let containerHeight = 0 @@ -321,10 +338,10 @@ function onHandleMouseup() { cartePenseesRef.value?.triggerResize() } -onMounted(() => { +onMounted(async () => { if (typeof window !== 'undefined') { const saved = localStorage.getItem(STORAGE_KEY) as LayoutMode | null - if (saved && ['split', 'carte-full', 'chatbot-full', 'bonpote'].includes(saved)) { + if (saved && (['split', 'carte-full', 'chatbot-full', 'bonpote', 'rag-backend'] as string[]).includes(saved)) { layoutMode.value = saved } const savedRatio = parseFloat(localStorage.getItem(SPLIT_RATIO_KEY) ?? '') @@ -336,6 +353,11 @@ onMounted(() => { localStorage.setItem('rag-fracas-info-seen', '1') } } + try { + penseesData.value = await $fetch('/data/auteurs-pensees.json?v=4.2') + } catch (e) { + console.error('Erreur chargement auteurs-pensees.json', e) + } }) function setLayoutMode(mode: LayoutMode) { @@ -343,7 +365,7 @@ function setLayoutMode(mode: LayoutMode) { if (typeof window !== 'undefined') { localStorage.setItem(STORAGE_KEY, mode) } - if (mode !== 'chatbot-full') { + if (mode === 'split' || mode === 'carte-full') { setTimeout(() => { cartePenseesRef.value?.triggerResize() }, 350) @@ -374,14 +396,14 @@ function onSelectAuteurFromEcole(auteurId: string) { function onInterrogerEcole(ecoleId: string) { ficheEcoleOpen.value = false - const ecole = props.penseesData?.ecoles.find(e => e.id === ecoleId) + const ecole = penseesData.value?.ecoles.find(e => e.id === ecoleId) chatbotAuteur.value = ecole?.label ?? null if (layoutMode.value === 'carte-full') setLayoutMode('split') } function onInterrogerRag(auteurId: string) { ficheOpen.value = false - const auteur = props.penseesData?.auteurs.find(a => a.id === auteurId) + const auteur = penseesData.value?.auteurs.find(a => a.id === auteurId) chatbotAuteur.value = auteur?.nom ?? null if (layoutMode.value === 'carte-full') { setLayoutMode('split') @@ -481,28 +503,28 @@ function onInterrogerRag(auteurId: string) { border-color: var(--nav-primary); } -/* --- Toggle layer PDF FRACAS --- */ -.layer-toggle { +/* --- Contrôle fusionné carte des pensées + tickbox --- */ +.carte-pensees-ctrl { display: inline-flex; align-items: center; - gap: 5px; - padding: 4px 10px; + gap: 0; border-radius: 6px; - font-size: 0.75rem; - font-weight: 500; - cursor: pointer; - background: var(--nav-bg-alt); - color: var(--nav-text-muted); - border: 1px solid transparent; - user-select: none; - margin-left: 4px; + overflow: hidden; + border: 1px solid rgba(180, 170, 160, 0.3); } -.layer-toggle input[type="checkbox"] { - margin: 0; +.fracas-check { + margin: 0 2px 0 7px; cursor: pointer; + accent-color: var(--nav-primary, #3b6ea5); } +.carte-pensees-btn { + border-radius: 0; + border: none; +} + +/* --- Slider opacité PDF --- */ .opacity-slider { width: 80px; cursor: pointer; diff --git a/pages/media.vue b/pages/media.vue index df39ccd..02591b9 100644 --- a/pages/media.vue +++ b/pages/media.vue @@ -5,24 +5,17 @@ :class="['subtab-btn', { active: tab === 'visuel' }]" @click="tab = 'visuel'" > - 🌳 RAG visuel - - - @@ -31,9 +24,9 @@ const route = useRoute() const router = useRouter() -const tab = ref<'visuel' | 'backend' | 'projets'>( - (['visuel', 'backend', 'projets'].includes(route.query.tab as string) - ? route.query.tab as 'visuel' | 'backend' | 'projets' +const tab = ref<'visuel' | 'projets'>( + (['visuel', 'projets'].includes(route.query.tab as string) + ? route.query.tab as 'visuel' | 'projets' : 'visuel') )