Updated functionnalities + added small menu if mobile

This commit is contained in:
Thomas Fransolet 2026-02-24 11:58:29 +01:00
parent 36d69fe2b4
commit 263cd872c5
2 changed files with 343 additions and 77 deletions

View File

@ -46,6 +46,31 @@
} }
} }
@keyframes fade-in {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@utility animate-fade-in {
animation: fade-in 0.4s ease-out forwards;
}
@utility animate-float { @utility animate-float {
animation: float 6s ease-in-out infinite; animation: float 6s ease-in-out infinite;
} }
@utility scrollbar-hide {
-ms-overflow-style: none;
scrollbar-width: none;
&::-webkit-scrollbar {
display: none;
}
}

View File

@ -1,6 +1,6 @@
'use client'; 'use client';
import React, { useState } from 'react'; import React, { useState, useEffect } from 'react';
import { resolveImage } from '@/data/stitch-images'; import { resolveImage } from '@/data/stitch-images';
export default function Home() { export default function Home() {
@ -12,6 +12,85 @@ export default function Home() {
}); });
const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle'); const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle');
const [activeModule, setActiveModule] = useState(0);
const [isMenuOpen, setIsMenuOpen] = useState(false);
// Lock body scroll when mobile menu is open
useEffect(() => {
if (isMenuOpen) {
document.body.style.overflow = 'hidden';
} else {
document.body.style.overflow = 'auto';
}
return () => { document.body.style.overflow = 'auto'; };
}, [isMenuOpen]);
const modules = [
{
id: 'map',
title: 'Cartes & Plans',
icon: 'map',
theme: 'rose',
description: 'Une cartographie interactive ultra-précise pour guider vos visiteurs. Géolocalisation en temps réel, points dintérêt cliquables et navigation fluide.',
value: 'Améliorez lorientation et augmentez la satisfaction visiteur.'
},
{
id: 'quiz',
title: 'Jeux & Quiz',
icon: 'sports_esports',
theme: 'rose',
description: 'Transformez la visite en aventure ludique. Chasses au trésor, quiz de connaissances et parcours gamifiés pour capter lattention des plus jeunes.',
value: 'Augmentez lengagement des familles et des scolaires.'
},
{
id: 'video',
title: 'Audio & Vidéo',
icon: 'videocam',
theme: 'rose',
description: 'Diffusez vos contenus multimédias HD sans latence. Audio-guides immersifs, vidéos documentaires et témoignages dexperts accessibles en un clic.',
value: 'Enrichissez l\'expérience culturelle par le multimédia.'
},
{
id: 'article',
title: 'Articles & PDF',
icon: 'article',
theme: 'rose',
description: 'Offrez une lecture confortable de vos contenus de fond. Fiches descriptives, brochures PDF et catalogues dexposition numérisés.',
value: 'Digitalisez vos supports papier sans perte de qualité.'
},
{
id: 'agenda',
title: 'Agenda & Événements',
icon: 'calendar_month',
theme: 'rose',
description: 'Gérez dynamiquement votre programmation. Expositions temporaires, conférences ou ateliers : vos visiteurs ne ratent plus rien.',
value: 'Optimisez la fréquentation de vos activités annexes.'
},
{
id: 'offline',
title: 'Accès Hors Ligne',
icon: 'download_for_offline',
theme: 'rose',
description: 'Éliminez les zones blanches. Permettez le téléchargement automatique des parcours pour une consultation fluide même sans connexion 4G/Wifi.',
value: 'Garantissez un service continu partout sur votre site.'
},
{
id: 'web',
title: 'Contenu Web & Social',
icon: 'public',
theme: 'rose',
description: 'Intégrez le meilleur du web. Formulaires denquête, réseaux sociaux ou liens vers votre billetterie : ouvrez votre app sur le monde.',
value: 'Connectez votre écosystème digital en un seul lieu.'
},
{
id: 'stats',
title: 'Statistiques & Data',
icon: 'monitoring',
theme: 'rose',
description: 'Analysez le comportement de vos visiteurs. Points dintérêt populaires, temps de lecture et engagement : pilotez par la donnée.',
value: 'Prenez des décisions éclairées basées sur lusage réel.'
}
];
const handleSubmit = async (e: React.FormEvent) => { const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault(); e.preventDefault();
@ -52,16 +131,16 @@ export default function Home() {
{/* Top Navigation */} {/* Top Navigation */}
<header className="fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-md border-b border-slate-200"> <header className="fixed top-0 left-0 right-0 z-50 bg-white/80 backdrop-blur-md border-b border-slate-200">
<div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between"> <div className="max-w-7xl mx-auto px-6 h-20 flex items-center justify-between">
<a className="flex items-center gap-3" href="#"> <a className="flex items-center gap-3 shrink-0" href="#">
<img <img
src={resolveImage("{{DATA:IMAGE:IMAGE_14}}")} src={resolveImage("{{DATA:IMAGE:IMAGE_14}}")}
alt="MyInfoMate Logo" alt="MyInfoMate Logo"
className="h-10 w-auto object-contain" className="h-10 w-auto object-contain"
/> />
<span className="text-xl font-extrabold tracking-tight text-slate-900">MyInfoMate</span> <span className="text-xl font-extrabold tracking-tight text-slate-900 hidden lg:block">MyInfoMate</span>
</a> </a>
<nav className="hidden md:flex items-center gap-10"> <nav className="hidden lg:flex items-center gap-10">
<a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#solutions">Solutions</a> <a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#deployment-modes">Solution</a>
<a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#features">Fonctionnalités</a> <a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#features">Fonctionnalités</a>
<a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#audience">Public</a> <a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#audience">Public</a>
{/* <a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#tarifs">Tarifs</a> */} {/* <a className="text-sm font-semibold text-slate-600 hover:text-primary transition-colors" href="#tarifs">Tarifs</a> */}
@ -69,20 +148,95 @@ export default function Home() {
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
<a <a
href="https://manager.myinfomate.be" href="https://manager.myinfomate.be"
className="hidden sm:block text-sm font-bold text-slate-900 hover:text-primary px-4 py-2 transition-colors" className="hidden lg:block text-sm font-bold text-slate-900 hover:text-primary px-4 py-2 transition-colors"
> >
Connexion Connexion
</a> </a>
<button <button
onClick={scrollToContact} onClick={scrollToContact}
className="bg-primary hover:brightness-110 text-slate-900 font-extrabold text-sm px-6 py-3 rounded-full shadow-lg shadow-primary/20 transition-all active:scale-95" className="bg-primary hover:brightness-110 text-slate-900 font-extrabold text-sm px-6 py-3 rounded-full shadow-lg shadow-primary/20 transition-all active:scale-95 hidden sm:block"
> >
Demander une démo Demander une démo
</button> </button>
<button
onClick={() => setIsMenuOpen(!isMenuOpen)}
className="lg:hidden w-10 h-10 flex items-center justify-center text-slate-600 hover:text-primary transition-colors"
>
<span className="material-symbols-outlined text-3xl">
{isMenuOpen ? 'close' : 'menu'}
</span>
</button>
</div> </div>
</div> </div>
</header> </header>
{/* Mobile Menu Backdrop */}
<div
className={`lg:hidden fixed inset-0 bg-slate-900/60 backdrop-blur-sm z-[150] transition-opacity duration-300 ${isMenuOpen ? 'opacity-100 visible' : 'opacity-0 invisible pointer-events-none'}`}
onClick={() => setIsMenuOpen(false)}
/>
{/* Mobile Menu Sidebar */}
<div className={`lg:hidden fixed inset-y-0 right-0 w-[300px] h-screen bg-white z-[200] shadow-2xl transition-transform duration-500 ease-in-out transform ${isMenuOpen ? 'translate-x-0' : 'translate-x-full'}`}>
<div className="flex flex-col h-full bg-white">
{/* Close Button Header */}
<div className="flex justify-end p-6 border-b border-slate-50">
<button
onClick={() => setIsMenuOpen(false)}
className="w-10 h-10 flex items-center justify-center text-slate-400 hover:text-slate-900 transition-colors"
aria-label="Fermer le menu"
>
<span className="material-symbols-outlined text-3xl font-bold text-slate-900">close</span>
</button>
</div>
<nav className="flex-1 flex flex-col p-8 gap-8 overflow-y-auto scrollbar-hide">
<div className="flex flex-col gap-6">
{[
{ label: 'ACCUEIL', href: '#' },
{ label: 'SOLUTION', href: '#deployment-modes' },
{ label: 'FONCTIONNALITÉS', href: '#features' },
{ label: 'PUBLIC', href: '#audience' },
{ label: 'CONTACT', href: '#contact' }
].map((item) => (
<a
key={item.label}
className="text-sm font-bold tracking-[0.2em] text-slate-900 hover:text-primary transition-colors py-3 border-b border-slate-50 flex items-center justify-between"
href={item.href}
onClick={() => {
if (item.href === '#') {
window.scrollTo({ top: 0, behavior: 'smooth' });
} else if (item.href.startsWith('#')) {
const el = document.querySelector(item.href);
if (el) { el.scrollIntoView({ behavior: 'smooth' }); }
}
setIsMenuOpen(false);
}}
>
{item.label}
</a>
))}
</div>
<div className="mt-auto py-8 flex flex-col gap-4">
<a
href="https://manager.myinfomate.be"
className="w-full text-center py-4 text-xs font-black tracking-widest text-slate-800 border-2 border-slate-100 rounded-xl hover:border-primary transition-all"
>
CONNEXION
</a>
<button
onClick={(e) => { scrollToContact(e); setIsMenuOpen(false); }}
className="w-full py-4 bg-primary text-slate-900 font-black text-xs tracking-widest rounded-xl shadow-xl shadow-primary/20 active:scale-95 transition-all"
>
DEMANDER UNE DÉMO
</button>
</div>
</nav>
</div>
</div>
<div className="pt-20"> <div className="pt-20">
{/* Hero Section */} {/* Hero Section */}
<section className="relative overflow-hidden py-20 lg:py-32"> <section className="relative overflow-hidden py-20 lg:py-32">
@ -113,11 +267,11 @@ export default function Home() {
</button> */} </button> */}
</div> </div>
</div> </div>
<div className="flex-1 relative"> <div className="flex-1 relative w-full mt-12 lg:mt-0">
{/* UI Mockup Group */} {/* UI Mockup Group - Improved for Mobile */}
<div className="relative w-full aspect-[4/3] max-w-xl mx-auto"> <div className="relative w-full aspect-[4/3] sm:aspect-video lg:aspect-[4/3] max-w-xl mx-auto">
{/* Interactive Map Tablet Preview */} {/* Interactive Map Tablet Preview */}
<div className="absolute top-0 left-0 w-full h-[85%] bg-slate-900 rounded-3xl overflow-hidden shadow-2xl border-4 border-slate-800 z-10 transform -rotate-2"> <div className="absolute top-0 left-0 w-full h-full lg:h-[85%] bg-slate-900 rounded-2xl lg:rounded-3xl overflow-hidden shadow-2xl border-4 border-slate-800 z-10 transform lg:-rotate-2">
<img <img
src={resolveImage("{{DATA:IMAGE:IMAGE_4}}")} src={resolveImage("{{DATA:IMAGE:IMAGE_4}}")}
alt="Modern Interactive Map Interface" alt="Modern Interactive Map Interface"
@ -128,48 +282,43 @@ export default function Home() {
<p className="text-xs font-extrabold text-slate-900">Parcours des Sculptures</p> <p className="text-xs font-extrabold text-slate-900">Parcours des Sculptures</p>
</div> </div>
</div> </div>
{/* Agenda Mobile Preview */}
<div className="absolute -bottom-10 -left-10 w-1/3 aspect-[9/19] bg-white rounded-[2rem] shadow-2xl border-4 border-slate-900 z-30 transform rotate-3 overflow-hidden"> {/* Agenda Mobile Preview - Hidden or repositioned on very small screens */}
<div className="hidden sm:block absolute -bottom-6 -left-6 lg:-bottom-10 lg:-left-10 w-1/3 aspect-[9/19] bg-white rounded-[1.5rem] lg:rounded-[2rem] shadow-2xl border-2 lg:border-4 border-slate-900 z-30 transform rotate-3 overflow-hidden">
<div className="h-full bg-slate-50 flex flex-col"> <div className="h-full bg-slate-50 flex flex-col">
<div className="p-3 bg-accent-violet text-white text-center"> <div className="p-2 lg:p-3 bg-accent-violet text-white text-center">
<p className="text-[10px] font-bold uppercase">Agenda</p> <p className="text-[8px] lg:text-[10px] font-bold uppercase">Agenda</p>
</div> </div>
<div className="p-2 space-y-2 overflow-hidden flex-1"> <div className="p-2 space-y-2 overflow-hidden flex-1">
<div className="rounded-lg overflow-hidden h-16 bg-slate-200 relative"> <div className="rounded-lg overflow-hidden h-12 lg:h-16 bg-slate-200 relative">
<img src={resolveImage("{{DATA:IMAGE:IMAGE_5}}")} alt="Mockup 1" className="w-full h-full object-cover" /> <img src={resolveImage("{{DATA:IMAGE:IMAGE_5}}")} alt="Mockup 1" className="w-full h-full object-cover" />
</div> </div>
<div className="h-2 w-3/4 bg-slate-200 rounded"></div> <div className="h-2 w-3/4 bg-slate-200 rounded"></div>
<div className="h-2 w-1/2 bg-slate-100 rounded"></div> <div className="h-2 w-1/2 bg-slate-100 rounded"></div>
<div className="rounded-lg h-16 bg-slate-200"></div>
</div> </div>
</div> </div>
<div className="absolute top-1 left-1/2 -translate-x-1/2 w-8 h-2 bg-slate-900 rounded-full"></div> <div className="absolute top-1 left-1/2 -translate-x-1/2 w-6 lg:w-8 h-1 lg:h-2 bg-slate-900 rounded-full"></div>
</div> </div>
{/* Tours Mobile Preview */} {/* Tours Mobile Preview */}
<div className="absolute -bottom-6 -right-6 w-[35%] aspect-[9/19] bg-white rounded-[2rem] shadow-2xl border-4 border-slate-900 z-20 transform -rotate-6 overflow-hidden"> <div className="absolute -bottom-4 -right-4 lg:-bottom-6 lg:-right-6 w-1/3 lg:w-[35%] aspect-[9/19] bg-white rounded-[1.5rem] lg:rounded-[2rem] shadow-2xl border-2 lg:border-4 border-slate-900 z-20 transform -rotate-6 overflow-hidden">
<div className="h-full flex flex-col"> <div className="h-full flex flex-col">
<div className="p-3 bg-primary text-slate-900 text-center"> <div className="p-2 lg:p-3 bg-primary text-slate-900 text-center">
<p className="text-[10px] font-bold uppercase">Visites</p> <p className="text-[8px] lg:text-[10px] font-bold uppercase">Visites</p>
</div> </div>
<div className="p-2 space-y-3 flex-1"> <div className="p-2 space-y-2 flex-1">
<div className="flex gap-2 items-center"> <div className="flex gap-2 items-center">
<div className="w-10 h-10 rounded-lg bg-slate-200 relative overflow-hidden"> <div className="w-8 h-8 lg:w-10 lg:h-10 rounded-lg bg-slate-200 relative overflow-hidden">
<img src={resolveImage("{{DATA:IMAGE:IMAGE_7}}")} alt="Mockup 2" className="w-full h-full object-cover" /> <img src={resolveImage("{{DATA:IMAGE:IMAGE_7}}")} alt="Mockup 2" className="w-full h-full object-cover" />
</div> </div>
<div className="space-y-1"> <div className="space-y-1">
<div className="h-2 w-16 bg-slate-200 rounded"></div> <div className="h-1.5 w-12 bg-slate-200 rounded"></div>
<div className="h-1 w-10 bg-slate-100 rounded"></div> <div className="h-1 w-8 bg-slate-100 rounded"></div>
</div>
</div>
<div className="flex gap-2 items-center opacity-50">
<div className="w-10 h-10 rounded-lg bg-slate-200 relative overflow-hidden">
<img src={resolveImage("{{DATA:IMAGE:IMAGE_6}}")} alt="Mockup 3" className="w-full h-full object-cover" />
</div>
<div className="h-2 w-16 bg-slate-200 rounded"></div>
</div> </div>
</div> </div>
</div> </div>
<div className="absolute top-1 left-1/2 -translate-x-1/2 w-8 h-2 bg-slate-900 rounded-full"></div> </div>
<div className="absolute top-1 left-1/2 -translate-x-1/2 w-6 lg:w-8 h-1 lg:h-2 bg-slate-900 rounded-full"></div>
</div> </div>
</div> </div>
</div> </div>
@ -220,71 +369,163 @@ export default function Home() {
</div> </div>
</section> </section>
{/* Interactive Modules Section (Feature target) */} {/* Deployment Modes Section */}
<section className="py-24 bg-slate-50 border-y border-slate-100" id="features"> <section className="py-24 bg-slate-50 border-y border-slate-100" id="deployment-modes">
<div className="max-w-7xl mx-auto px-6"> <div className="max-w-7xl mx-auto px-6">
<div className="text-center mb-16"> <div className="text-center mb-16">
<h2 className="text-primary font-extrabold uppercase tracking-widest text-sm mb-4">Fonctionnalités & Modules</h2> <h2 className="text-primary font-extrabold uppercase tracking-widest text-sm mb-4">Modes de déploiement</h2>
<h3 className="text-3xl lg:text-5xl font-extrabold text-slate-900 leading-tight mb-6">Des modules pour toutes vos envies</h3> <h3 className="text-3xl lg:text-5xl font-extrabold text-slate-900 leading-tight mb-6">Une plateforme, plusieurs solutions</h3>
<p className="text-lg text-slate-600 max-w-2xl mx-auto"> <p className="text-lg text-slate-600 max-w-2xl mx-auto">
Personnalisez l'expérience de vos visiteurs en combinant une large gamme de modules interactifs, gérables en quelques clics via notre interface. Choisissez le mode de diffusion le plus adapté à votre lieu et à vos visiteurs. MyInfoMate s'adapte à tous les terminaux.
</p> </p>
</div> </div>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-8"> <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-8">
{/* Module 1: Cartes */} {/* Mode 1: Mobile BYOD */}
<div className="bg-white p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all border border-slate-100 flex flex-col items-center text-center group"> <div className="group p-8 rounded-[2.5rem] bg-white border border-slate-100 shadow-sm hover:shadow-xl transition-all duration-300">
<div className="w-16 h-16 rounded-2xl bg-primary/10 text-primary flex items-center justify-center mb-6 group-hover:bg-primary group-hover:text-white transition-colors"> <div className="w-14 h-14 rounded-2xl bg-primary/10 text-primary flex items-center justify-center mb-6 group-hover:bg-primary group-hover:text-white transition-all">
<span className="material-symbols-outlined text-3xl">map</span> <span className="material-symbols-outlined text-3xl">smartphone</span>
</div> </div>
<h4 className="text-xl font-bold text-slate-900 mb-3">Cartes & Plans</h4> <h4 className="text-xl font-extrabold text-slate-900 mb-4">Application Mobile (BYOD)</h4>
<p className="text-slate-600 text-sm">Géolocalisation précise et plans interactifs pour guider vos visiteurs dans vos enceintes et parcs.</p> <p className="text-slate-600 text-sm leading-relaxed">Les visiteurs utilisent leur propre smartphone pour accéder à vos parcours en toute liberté.</p>
</div> </div>
{/* Module 2: Jeux & Quiz */} {/* Mode 2: Kiosk Tablet */}
<div className="bg-white p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all border border-slate-100 flex flex-col items-center text-center group"> <div className="group p-8 rounded-[2.5rem] bg-white border border-slate-100 shadow-sm hover:shadow-xl transition-all duration-300">
<div className="w-16 h-16 rounded-2xl bg-accent-violet/10 text-accent-violet flex items-center justify-center mb-6 group-hover:bg-accent-violet group-hover:text-white transition-colors"> <div className="w-14 h-14 rounded-2xl bg-accent-violet/10 text-accent-violet flex items-center justify-center mb-6 group-hover:bg-accent-violet group-hover:text-white transition-all">
<span className="material-symbols-outlined text-3xl">sports_esports</span> <span className="material-symbols-outlined text-3xl">tablet_android</span>
</div> </div>
<h4 className="text-xl font-bold text-slate-900 mb-3">Jeux & Quiz</h4> <h4 className="text-xl font-extrabold text-slate-900 mb-4">Mode Kiosk (Tablette)</h4>
<p className="text-slate-600 text-sm">Rendez la culture ludique avec des quiz interactifs et des parcours gamifiés pour les plus jeunes.</p> <p className="text-slate-600 text-sm leading-relaxed">Solution robuste pré-installée sur vos flottes de tablettes pour une expérience guidée et contrôlée.</p>
</div> </div>
{/* Module 3: Audio/Vidéo */} {/* Mode 3: Web App */}
<div className="bg-white p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all border border-slate-100 flex flex-col items-center text-center group"> <div className="group p-8 rounded-[2.5rem] bg-white border border-slate-100 shadow-sm hover:shadow-xl transition-all duration-300">
<div className="w-16 h-16 rounded-2xl bg-accent-orange/10 text-accent-orange flex items-center justify-center mb-6 group-hover:bg-accent-orange group-hover:text-white transition-colors"> <div className="w-14 h-14 rounded-2xl bg-accent-orange/10 text-accent-orange flex items-center justify-center mb-6 group-hover:bg-accent-orange group-hover:text-white transition-all">
<span className="material-symbols-outlined text-3xl">videocam</span> <span className="material-symbols-outlined text-3xl">language</span>
</div>
<h4 className="text-xl font-extrabold text-slate-900 mb-4">Application Web</h4>
<p className="text-slate-600 text-sm leading-relaxed">Accessible instantanément depuis n'importe quel navigateur moderne, sans installation préalable.</p>
</div>
{/* Mode 4: Future VR/AR */}
<div className="group p-8 rounded-[2.5rem] bg-slate-900 text-white shadow-xl relative overflow-hidden">
<div className="absolute top-0 right-0 p-3" title="Innovation à venir">
<span className="px-2 py-1 bg-primary text-slate-900 text-[10px] font-black uppercase rounded-md">Bientôt</span>
</div>
<div className="w-14 h-14 rounded-2xl bg-white/10 text-primary flex items-center justify-center mb-6">
<span className="material-symbols-outlined text-3xl">view_in_ar</span>
</div>
<h4 className="text-xl font-extrabold mb-4">Innovation VR & AR</h4>
<p className="text-slate-400 text-sm leading-relaxed">Préparez-vous pour le futur avec des expériences immersives sur Meta Quest et lunettes connectées.</p>
</div>
</div>
</div>
</section>
{/* Interactive Modules Section (Module Explorer) */}
<section className="py-24 bg-white" id="features">
<div className="max-w-7xl mx-auto px-6">
<div className="text-center mb-16">
<h2 className="text-rose-600 font-extrabold uppercase tracking-widest text-sm mb-4">Fonctionnalités & Modules</h2>
<h3 className="text-3xl lg:text-5xl font-extrabold text-slate-900 leading-tight mb-6">Explorateur de modules</h3>
<p className="text-lg text-slate-600 max-w-2xl mx-auto">
Plongez au cœur des possibilités offertes par MyInfoMate. Découvrez comment chaque module transforme l'expérience de vos visiteurs.
</p>
</div>
<div className="flex flex-col lg:flex-row gap-8 lg:gap-16 items-start">
{/* Sidebar (Tabs) */}
<div className="w-full lg:w-1/3 relative">
{/* Mobile scroll hints */}
<div className="lg:hidden absolute left-0 top-0 bottom-4 w-12 bg-gradient-to-r from-white to-transparent z-10 pointer-events-none"></div>
<div className="lg:hidden absolute right-0 top-0 bottom-4 w-12 bg-gradient-to-l from-white to-transparent z-10 pointer-events-none"></div>
<div className="flex lg:flex-col gap-3 overflow-x-auto pb-4 lg:pb-0 scrollbar-hide snap-x relative group/tabs">
{modules.map((module, index) => (
<button
key={module.id}
onClick={() => setActiveModule(index)}
className={`flex items-center gap-3 lg:gap-4 px-5 py-4 lg:px-6 lg:py-5 rounded-2xl border-2 transition-all text-left whitespace-nowrap lg:whitespace-normal snap-center flex-shrink-0 lg:flex-shrink-1 w-auto lg:w-full ${activeModule === index
? 'bg-rose-50 border-rose-200 text-rose-600 shadow-sm'
: 'bg-white border-slate-100 text-slate-500 hover:bg-slate-50'
}`}
>
<span className={`material-symbols-outlined text-xl lg:text-2xl ${activeModule === index ? 'text-rose-600' : 'text-slate-400'}`}>
{module.icon}
</span>
<span className="font-bold text-xs lg:text-base">{module.title}</span>
</button>
))}
</div>
</div>
{/* Main Display (Active Module) */}
<div className="flex-1 w-full animate-fade-in">
<div className="bg-slate-50 rounded-[3rem] p-8 lg:p-12 border border-slate-100 relative overflow-hidden flex flex-col lg:flex-row gap-12 items-center min-h-[500px]">
{/* Content */}
<div className="flex-1 relative z-10 text-center lg:text-left">
<div className="inline-flex p-3 rounded-2xl bg-white shadow-sm text-rose-600 mb-6 font-bold gap-2 items-center">
<span className="material-symbols-outlined">{modules[activeModule].icon}</span>
<span className="text-xs uppercase tracking-wider">{modules[activeModule].title}</span>
</div>
<h3 className="text-2xl lg:text-4xl font-black text-slate-900 mb-6 leading-tight">
{modules[activeModule].title}
</h3>
<p className="text-slate-600 text-lg leading-relaxed mb-8">
{modules[activeModule].description}
</p>
<div className="p-6 bg-rose-600/5 border border-rose-100 rounded-2xl">
<p className="text-rose-600 font-bold text-sm flex items-center gap-2">
<span className="material-symbols-outlined text-base">verified</span>
Valeur ajoutée : {modules[activeModule].value}
</p>
</div>
</div>
{/* Mockup Showcase */}
<div className="w-full lg:w-[320px] flex-shrink-0 relative">
<div className="relative mx-auto w-[240px] h-[500px] bg-slate-900 rounded-[3rem] border-[8px] border-slate-800 shadow-2xl overflow-hidden">
{/* Notch */}
<div className="absolute top-0 left-1/2 -translate-x-1/2 w-28 h-6 bg-slate-800 rounded-b-2xl z-20"></div>
{/* Content Area (Simulated Screen) */}
<div className="absolute inset-[2px] bg-white rounded-[2.25rem] overflow-hidden">
{/* Simulation of App UI */}
<div className="h-full flex flex-col pt-8">
<header className="h-14 border-b border-slate-100 flex items-center px-4 bg-white/80 backdrop-blur-sm sticky top-0 z-10">
<div className="w-8 h-8 rounded-lg bg-rose-100 flex items-center justify-center text-rose-600">
<span className="material-symbols-outlined text-lg">{modules[activeModule].icon}</span>
</div>
<span className="ml-3 font-bold text-xs text-slate-900 truncate">{modules[activeModule].title}</span>
</header>
<div className="p-4 flex-1 space-y-4">
<div className="h-40 rounded-2xl bg-slate-100 flex items-center justify-center relative overflow-hidden">
<span className="material-symbols-outlined text-5xl text-slate-300">{modules[activeModule].icon}</span>
<div className="absolute inset-0 bg-gradient-to-tr from-rose-500/10 to-transparent"></div>
</div>
<div className="h-3 w-full bg-slate-100 rounded-full"></div>
<div className="h-3 w-2/3 bg-slate-100 rounded-full"></div>
<div className="h-20 w-full bg-slate-50 border border-slate-100 rounded-xl p-3 flex gap-3">
<div className="w-10 h-10 rounded-lg bg-rose-200 shrink-0"></div>
<div className="space-y-2 flex-1">
<div className="h-2 w-full bg-slate-200 rounded-full"></div>
<div className="h-2 w-1/2 bg-slate-200 rounded-full"></div>
</div>
</div>
<div className="grid grid-cols-2 gap-3">
<div className="h-10 bg-slate-100 rounded-xl"></div>
<div className="h-10 bg-rose-600 rounded-xl"></div>
</div> </div>
<h4 className="text-xl font-bold text-slate-900 mb-3">Audio & Vidéo</h4>
<p className="text-slate-600 text-sm">Diffusez vos contenus multimédias HD directement sur les terminaux de vos visiteurs.</p>
</div> </div>
{/* Module 4: Articles/PDF */}
<div className="bg-white p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all border border-slate-100 flex flex-col items-center text-center group">
<div className="w-16 h-16 rounded-2xl bg-slate-100 text-slate-900 flex items-center justify-center mb-6 group-hover:bg-slate-900 group-hover:text-white transition-colors">
<span className="material-symbols-outlined text-3xl">article</span>
</div> </div>
<h4 className="text-xl font-bold text-slate-900 mb-3">Articles & PDF</h4>
<p className="text-slate-600 text-sm">Fiches descriptives détaillées, brochures PDF et guides de visite numériques.</p>
</div> </div>
{/* Module 5: Agenda */}
<div className="bg-white p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all border border-slate-100 flex flex-col items-center text-center group">
<div className="w-16 h-16 rounded-2xl bg-primary/10 text-primary flex items-center justify-center mb-6 group-hover:bg-primary group-hover:text-white transition-colors">
<span className="material-symbols-outlined text-3xl">calendar_month</span>
</div> </div>
<h4 className="text-xl font-bold text-slate-900 mb-3">Agenda & Événements</h4>
<p className="text-slate-600 text-sm">Gérez et affichez dynamiquement vos expositions temporaires et activités programmées.</p>
</div> </div>
{/* Module 6: Web */}
<div className="bg-white p-8 rounded-[2rem] shadow-sm hover:shadow-xl transition-all border border-slate-100 flex flex-col items-center text-center group">
<div className="w-16 h-16 rounded-2xl bg-accent-violet/10 text-accent-violet flex items-center justify-center mb-6 group-hover:bg-accent-violet group-hover:text-white transition-colors">
<span className="material-symbols-outlined text-3xl">public</span>
</div> </div>
<h4 className="text-xl font-bold text-slate-900 mb-3">Contenu Web</h4>
<p className="text-slate-600 text-sm">Intégrez des flux externes, réseaux sociaux ou formulaires pour une interaction maximale.</p>
</div> </div>
</div> </div>
</div> </div>
</section> </section>
{/* White Label / Value Proposition */} {/* White Label / Value Proposition */}
<section className="py-24 bg-white relative overflow-hidden" id="solutions"> <section className="py-24 bg-slate-50 border-y border-slate-100 relative overflow-hidden" id="whitelabel">
<div className="max-w-7xl mx-auto px-6"> <div className="max-w-7xl mx-auto px-6">
<div className="flex flex-col lg:flex-row items-center gap-20"> <div className="flex flex-col lg:flex-row items-center gap-20">
<div className="flex-1 order-2 lg:order-1"> <div className="flex-1 order-2 lg:order-1">
@ -352,7 +593,7 @@ export default function Home() {
</section> </section>
{/* Target Audience */} {/* Target Audience */}
<section className="py-24 bg-slate-50 border-y border-slate-100" id="audience"> <section className="py-24 bg-white" id="audience">
<div className="max-w-7xl mx-auto px-6"> <div className="max-w-7xl mx-auto px-6">
<div className="text-center mb-16"> <div className="text-center mb-16">
<h3 className="text-3xl lg:text-4xl font-extrabold text-slate-900 mb-4">Une solution pensée pour vous</h3> <h3 className="text-3xl lg:text-4xl font-extrabold text-slate-900 mb-4">Une solution pensée pour vous</h3>
@ -385,7 +626,7 @@ export default function Home() {
</section> </section>
{/* Final CTA */} {/* Final CTA */}
<section className="py-20"> <section className="py-20 bg-slate-50">
<div className="max-w-7xl mx-auto px-6"> <div className="max-w-7xl mx-auto px-6">
<div className="bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900 rounded-[3rem] p-12 lg:p-24 text-center relative overflow-hidden"> <div className="bg-gradient-to-br from-slate-900 via-slate-800 to-slate-900 rounded-[3rem] p-12 lg:p-24 text-center relative overflow-hidden">
<div className="absolute top-0 left-0 w-full h-full opacity-10 pointer-events-none"> <div className="absolute top-0 left-0 w-full h-full opacity-10 pointer-events-none">