feat(v11-c): carte-o rendering refonte niveau/nature/statut + contextmenu positionne
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,14 +1,16 @@
|
||||
<script setup lang="ts">
|
||||
// Wrapper Carte O : fetch /data/carte-o.json + state modal.
|
||||
// Vue island Astro hydratée client:visible.
|
||||
import { ref, onMounted, computed } from 'vue'
|
||||
import CarteO from './CarteO.vue'
|
||||
import CarteOModal from './CarteOModal.vue'
|
||||
import CarteOContextMenu from './CarteOContextMenu.vue'
|
||||
|
||||
interface CarteNode {
|
||||
id: string
|
||||
label: string
|
||||
family: string
|
||||
niveau?: number
|
||||
nature?: 'essai' | 'projet'
|
||||
statut?: 'gestation' | 'edite'
|
||||
resume?: string | null
|
||||
intention?: string
|
||||
slug?: string
|
||||
theme?: string
|
||||
@@ -39,6 +41,8 @@ const props = withDefaults(defineProps<{
|
||||
const data = ref<CarteData | null>(null)
|
||||
const error = ref<string | null>(null)
|
||||
const selectedNode = ref<CarteNode | null>(null)
|
||||
const contextX = ref(0)
|
||||
const contextY = ref(0)
|
||||
const isMobileScreen = ref(false)
|
||||
|
||||
const familyColors = computed(() =>
|
||||
@@ -51,6 +55,12 @@ const familyColors = computed(() =>
|
||||
}
|
||||
)
|
||||
|
||||
function onNodeClick(payload: { node: CarteNode; x: number; y: number }) {
|
||||
selectedNode.value = payload.node
|
||||
contextX.value = payload.x
|
||||
contextY.value = payload.y
|
||||
}
|
||||
|
||||
onMounted(async () => {
|
||||
isMobileScreen.value = window.innerWidth < 768
|
||||
try {
|
||||
@@ -62,7 +72,6 @@ onMounted(async () => {
|
||||
error.value = e?.message || 'Erreur de chargement'
|
||||
}
|
||||
|
||||
// Update mobile flag on resize.
|
||||
window.addEventListener('resize', () => {
|
||||
isMobileScreen.value = window.innerWidth < 768
|
||||
})
|
||||
@@ -87,13 +96,13 @@ onMounted(async () => {
|
||||
</svg>
|
||||
</div>
|
||||
<p class="msg">
|
||||
Carte O optimisée desktop. Retournez sur grand écran pour explorer la mindmap interactive.
|
||||
Carte O optimisee desktop. Retournez sur grand ecran pour explorer la mindmap interactive.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Loading state -->
|
||||
<div v-else-if="!data && !error" class="state">
|
||||
<span>Chargement de la Carte O…</span>
|
||||
<span>Chargement de la Carte O...</span>
|
||||
</div>
|
||||
|
||||
<!-- Error state -->
|
||||
@@ -107,11 +116,12 @@ onMounted(async () => {
|
||||
:nodes="data.nodes"
|
||||
:edges="data.edges"
|
||||
:family-colors="familyColors"
|
||||
@node-click="selectedNode = $event"
|
||||
@node-click="onNodeClick"
|
||||
/>
|
||||
<CarteOModal
|
||||
<CarteOContextMenu
|
||||
:node="selectedNode"
|
||||
:family-colors="familyColors"
|
||||
:x="contextX"
|
||||
:y="contextY"
|
||||
@close="selectedNode = null"
|
||||
/>
|
||||
</template>
|
||||
|
||||
Reference in New Issue
Block a user