6 Commits

3 changed files with 45 additions and 18 deletions

View File

@@ -5,7 +5,7 @@ import CarteOWrapper from '../vue/CarteOWrapper.vue';
import ChatbotV2 from '../vue/ChatbotV2.vue'; import ChatbotV2 from '../vue/ChatbotV2.vue';
import EmbedDynamique from '../vue/EmbedDynamique.vue'; import EmbedDynamique from '../vue/EmbedDynamique.vue';
--- ---
<div id="col-centre-grid" class="h-full grid grid-rows-2 gap-2 p-2"> <div id="col-centre-grid" class="h-full grid gap-2 p-2" style="grid-template-rows: 1fr 2fr;">
<!-- HAUT 50% : tabs Carte O / Chatbot --> <!-- HAUT 50% : tabs Carte O / Chatbot -->
<section id="col-centre-haut" class="border border-neutral-200 rounded flex flex-col overflow-hidden bg-white" style="min-height: 0;"> <section id="col-centre-haut" class="border border-neutral-200 rounded flex flex-col overflow-hidden bg-white" style="min-height: 0;">
<nav role="tablist" aria-label="Vues centrales" class="flex border-b border-neutral-200 px-1 pt-1"> <nav role="tablist" aria-label="Vues centrales" class="flex border-b border-neutral-200 px-1 pt-1">
@@ -97,8 +97,8 @@ import EmbedDynamique from '../vue/EmbedDynamique.vue';
haut.style.minHeight = '0'; haut.style.minHeight = '0';
poignee?.setAttribute('aria-label', 'Deployer la Carte O'); poignee?.setAttribute('aria-label', 'Deployer la Carte O');
} else { } else {
grid.classList.add('grid-rows-2'); grid.classList.remove('grid-rows-2');
grid.style.gridTemplateRows = ''; grid.style.gridTemplateRows = '1fr 2fr';
haut.style.overflow = ''; haut.style.overflow = '';
haut.style.minHeight = ''; haut.style.minHeight = '';
poignee?.setAttribute('aria-label', 'Replier la Carte O'); poignee?.setAttribute('aria-label', 'Replier la Carte O');
@@ -141,7 +141,7 @@ import EmbedDynamique from '../vue/EmbedDynamique.vue';
const parts = rows.split(' '); const parts = rows.split(' ');
return parseFloat(parts[0]) || 50; return parseFloat(parts[0]) || 50;
} }
return 50; return 33.33;
}; };
dragHandle.addEventListener('mousedown', (e: MouseEvent) => { dragHandle.addEventListener('mousedown', (e: MouseEvent) => {
@@ -182,10 +182,10 @@ import EmbedDynamique from '../vue/EmbedDynamique.vue';
gridEl.classList.remove('grid-rows-2'); gridEl.classList.remove('grid-rows-2');
} }
// Double-click sur drag handle = reset 50/50 // Double-click sur drag handle = reset default 1/3 + 2/3
dragHandle.addEventListener('dblclick', () => { dragHandle.addEventListener('dblclick', () => {
gridEl.style.gridTemplateRows = ''; gridEl.style.gridTemplateRows = '1fr 2fr';
gridEl.classList.add('grid-rows-2'); gridEl.classList.remove('grid-rows-2');
sessionStorage.removeItem('tf-centre-rows'); sessionStorage.removeItem('tf-centre-rows');
}); });
} }

View File

@@ -5,19 +5,19 @@ const categories = [
{ {
id: 'politique', id: 'politique',
label: 'Politique', label: 'Politique',
color: '#1d4ed8', color: '#B5443A',
hashtags: ['#politique', '#aep-politique'], hashtags: ['#politique', '#aep-politique'],
plateformes: [ plateformes: [
{ id: 'instagram', label: '@aep.politique', url: 'https://www.instagram.com/aep.politique/' }, { id: 'instagram', label: 'Court', url: 'https://www.instagram.com/aep.politique/' },
{ id: 'castopod', label: 'Podcast', url: 'https://podcast.trans-former.fr' }, { id: 'castopod', label: 'Podcast', url: 'https://podcast.trans-former.fr' },
{ id: 'substack', label: 'Substack', url: 'https://julesneny.substack.com' }, { id: 'substack', label: 'Article', url: 'https://julesneny.substack.com' },
], ],
hasSelector: true, hasSelector: true,
}, },
{ {
id: 'art', id: 'art',
label: 'Art', label: 'Art',
color: '#dc2626', color: '#5B6B3A',
hashtags: ['#peinture', '#art'], hashtags: ['#peinture', '#art'],
plateformes: [ plateformes: [
{ id: 'instagram', label: '@julesneny', url: 'https://www.instagram.com/julesneny/' }, { id: 'instagram', label: '@julesneny', url: 'https://www.instagram.com/julesneny/' },
@@ -27,7 +27,7 @@ const categories = [
{ {
id: 'outils', id: 'outils',
label: 'Outils', label: 'Outils',
color: '#16a34a', color: '#475569',
hashtags: ['#stack', '#building-public'], hashtags: ['#stack', '#building-public'],
plateformes: [ plateformes: [
{ id: 'gitea', label: 'Gitea', url: 'https://git.trans-former.fr/jules' }, { id: 'gitea', label: 'Gitea', url: 'https://git.trans-former.fr/jules' },
@@ -68,7 +68,7 @@ const categories = [
type="button" type="button"
data-platform-id={p.id} data-platform-id={p.id}
class="platform-pill" class="platform-pill"
style="font-family:'Courier New',Courier,monospace;font-size:12px;padding:2px 8px;border-radius:12px;cursor:pointer;border:1px solid #1d4ed8;background:transparent;color:#1d4ed8;" style="font-family:'Courier New',Courier,monospace;font-size:12px;padding:2px 8px;border-radius:12px;cursor:pointer;border:1px solid #B5443A;background:transparent;color:#B5443A;"
> >
{p.label} {p.label}
</button> </button>
@@ -219,11 +219,11 @@ const categories = [
pills.forEach((pill) => { pills.forEach((pill) => {
const pid = pill.dataset.platformId; const pid = pill.dataset.platformId;
if (!active || pid === active) { if (!active || pid === active) {
pill.style.background = '#1d4ed8'; pill.style.background = '#B5443A';
pill.style.color = '#fff'; pill.style.color = '#fff';
} else { } else {
pill.style.background = 'transparent'; pill.style.background = 'transparent';
pill.style.color = '#1d4ed8'; pill.style.color = '#B5443A';
} }
}); });
}; };

View File

@@ -14,8 +14,27 @@ interface JournalItem {
const selectedItem = ref<JournalItem | null>(null) const selectedItem = ref<JournalItem | null>(null)
const iframeRef = ref<HTMLIFrameElement | null>(null) const iframeRef = ref<HTMLIFrameElement | null>(null)
const wrapperRef = ref<HTMLDivElement | null>(null)
const skeletonHidden = ref(false) const skeletonHidden = ref(false)
// Force rendu desktop de l'iframe AEP : viewport simulée 1440px + scale dynamique
const VIEWPORT_W = 1440
const iframeScale = ref(0.42)
let resizeObs: ResizeObserver | null = null
const updateScale = () => {
if (!wrapperRef.value) return
const w = wrapperRef.value.clientWidth
if (w > 0) iframeScale.value = w / VIEWPORT_W
}
const iframeStyle = computed(() => ({
width: VIEWPORT_W + 'px',
height: (100 / iframeScale.value) + '%',
transform: `scale(${iframeScale.value})`,
transformOrigin: '0 0',
}))
const onJournalItemClick = (e: Event) => { const onJournalItemClick = (e: Event) => {
const ce = e as CustomEvent const ce = e as CustomEvent
if (ce.detail?.item) selectedItem.value = ce.detail.item if (ce.detail?.item) selectedItem.value = ce.detail.item
@@ -23,9 +42,16 @@ const onJournalItemClick = (e: Event) => {
onMounted(() => { onMounted(() => {
window.addEventListener('journal-item-click', onJournalItemClick as EventListener) window.addEventListener('journal-item-click', onJournalItemClick as EventListener)
if (wrapperRef.value && typeof ResizeObserver !== 'undefined') {
updateScale()
resizeObs = new ResizeObserver(updateScale)
resizeObs.observe(wrapperRef.value)
}
}) })
onUnmounted(() => { onUnmounted(() => {
window.removeEventListener('journal-item-click', onJournalItemClick as EventListener) window.removeEventListener('journal-item-click', onJournalItemClick as EventListener)
resizeObs?.disconnect()
resizeObs = null
}) })
const reset = () => { const reset = () => {
@@ -89,18 +115,19 @@ const formatDate = (iso: string) => {
<!-- DEFAULT : iframe AEP (aucun item selectionne) --> <!-- DEFAULT : iframe AEP (aucun item selectionne) -->
<div v-if="!selectedItem" class="h-full"> <div v-if="!selectedItem" class="h-full">
<div class="relative h-full bg-neutral-100"> <div ref="wrapperRef" class="relative h-full bg-neutral-100 overflow-hidden">
<div <div
v-if="!skeletonHidden" v-if="!skeletonHidden"
id="embed-skeleton" id="embed-skeleton"
class="absolute inset-0 flex items-center justify-center bg-neutral-50 animate-pulse" class="absolute inset-0 flex items-center justify-center bg-neutral-50 animate-pulse z-10"
> >
<span class="text-neutral-400 text-sm">Chargement de la carte AEP...</span> <span class="text-neutral-400 text-sm">Chargement de la carte AEP...</span>
</div> </div>
<iframe <iframe
src="https://aep.trans-former.fr/agences" src="https://aep.trans-former.fr/agences"
title="Carte AEP" title="Carte AEP"
class="w-full h-full border-0 opacity-0 transition-opacity duration-500" class="absolute top-0 left-0 border-0 opacity-0 transition-opacity duration-500"
:style="iframeStyle"
sandbox="allow-scripts allow-same-origin allow-popups allow-forms" sandbox="allow-scripts allow-same-origin allow-popups allow-forms"
@load="onIframeLoad" @load="onIframeLoad"
ref="iframeRef" ref="iframeRef"