diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..1aa1087
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+.next
+.github
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3b5ba47
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+[](https://classroom.github.com/a/c9R-q-e1)
diff --git a/app/benevole/page.jsx b/app/benevole/page.jsx
new file mode 100644
index 0000000..eb91d06
--- /dev/null
+++ b/app/benevole/page.jsx
@@ -0,0 +1,52 @@
+import Comment from '../components/comment';
+import VolunteerForm from '../components/volunteer-form';
+import WhyVolunteer from '../components/why-volunteer';
+import '../styles/globals.css';
+import Link from "next/link"
+
+
+
+export default function Benevole() {
+ return (
+
+
+
+ TÉMOIGNAGES DE BÉNÉVOLES
+ Découvrez ce que nos bénévoles ont à dire sur leur expérience avec Adaence
+
+
+
+
+ DES QUESTIONS ?
+ Nous sommes là pour répondre à toutes vos interrogations concernant le bénévolat chez Adaence.
+ N'hésitez pas à nous contacter pour en savoir plus sur notre démarche.
+
+
+ Foire aux questions
+
+
+ Contactez-nous
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/app/components/card.jsx b/app/components/card.jsx
new file mode 100644
index 0000000..271984c
--- /dev/null
+++ b/app/components/card.jsx
@@ -0,0 +1,9 @@
+export default function Card (props) {
+ return (
+
+
+
{props.title}
+
{props.text}
+
+ )
+}
\ No newline at end of file
diff --git a/app/components/comment.jsx b/app/components/comment.jsx
new file mode 100644
index 0000000..fb51abc
--- /dev/null
+++ b/app/components/comment.jsx
@@ -0,0 +1,19 @@
+'use client'
+import '../styles/comment.css'
+
+export default function Comment({ name, duration, quote, imageUrl }) {
+ return (
+
+
+
+
+
{name}
+
Bénévole depuis {duration}
+
+
+
+ ❝{quote}❞
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/components/don.jsx b/app/components/don.jsx
new file mode 100644
index 0000000..612769c
--- /dev/null
+++ b/app/components/don.jsx
@@ -0,0 +1,9 @@
+'use client'
+
+import Link from "next/link"
+
+export default function Don () {
+ return (
+ Faire un don 🫶
+
)
+}
\ No newline at end of file
diff --git a/app/components/footer.jsx b/app/components/footer.jsx
new file mode 100644
index 0000000..f5bff13
--- /dev/null
+++ b/app/components/footer.jsx
@@ -0,0 +1,56 @@
+import {
+ Facebook,
+ Instagram,
+ Linkedin,
+ Twitch
+} from 'lucide-react';
+
+import '../styles/footer.css'
+
+
+export default function Footer() {
+ return (
+
+ );
+}
diff --git a/app/components/header.jsx b/app/components/header.jsx
new file mode 100644
index 0000000..243a3d3
--- /dev/null
+++ b/app/components/header.jsx
@@ -0,0 +1,17 @@
+'use client'
+
+import Searchbar from './search-bar';
+
+export default function Header() {
+
+ return (
+
+ )
+}
\ No newline at end of file
diff --git a/app/components/how.jsx b/app/components/how.jsx
new file mode 100644
index 0000000..2388840
--- /dev/null
+++ b/app/components/how.jsx
@@ -0,0 +1,33 @@
+import Card from "./card";
+
+
+export default function How() {
+ return (
+
+
+ comment ça marche
+ Offrir un peu de votre temps, c'est offrir beaucoup. Découvrez comment planifier une visite en
+ toute simplicité.
+
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/app/components/make-difference.jsx b/app/components/make-difference.jsx
new file mode 100644
index 0000000..76ec6dd
--- /dev/null
+++ b/app/components/make-difference.jsx
@@ -0,0 +1,22 @@
+import Don from "./don";
+import Link from "next/link";
+export default function MakeDifference() {
+ return (
+
+ PRÊT-E À FAIRE LA DIFFÉRENCE ?
+ Offrez un peu de votre temps, partagez un moment, créez du lien ... Chaque présence compte. En
+ tendant la main à une personne âgée, vous lui offrez bien plus qu'une visite : une vraie bouffée de
+ chaleur humaine
+
+
+ Programmer une visite
+
+
+
+ Devenir bénévole
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/app/components/navbar.jsx b/app/components/navbar.jsx
new file mode 100644
index 0000000..f8bd9e5
--- /dev/null
+++ b/app/components/navbar.jsx
@@ -0,0 +1,59 @@
+'use client'
+'use client'
+
+import Link from "next/link";
+import { useState } from "react";
+import { House, Accessibility, BookOpen, HandHelping, Menu, X } from 'lucide-react';
+import Don from "./don";
+import { usePathname } from 'next/navigation';
+import "../styles/navbar.css";
+
+export default function Navbar() {
+ const pathname = usePathname();
+ const [menuOpen, setMenuOpen] = useState(false);
+
+ const toggleMenu = () => setMenuOpen(!menuOpen);
+ const closeMenu = () => setMenuOpen(false);
+
+ return (
+
+
+ 🍵Adaence
+
+
+
+ {menuOpen ? : }
+
+
+
+
+
+ Accueil
+
+
+
+
+ Je rends visite
+
+
+
+
+ Guide du partage
+
+
+
+
+ Devenir bénévole
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/components/persons.jsx b/app/components/persons.jsx
new file mode 100644
index 0000000..05d67e8
--- /dev/null
+++ b/app/components/persons.jsx
@@ -0,0 +1,25 @@
+import PhotoGrid from './photo-grid';
+import Link from 'next/link';
+export default function Persons () {
+ const images = [
+ './images/danie-franco-ClHY-KyvI1M-unsplash.jpg',
+ './images/tim-mossholder-FRPbQvAwY10-unsplash.jpg',
+ './images/tatiana-zanon-MMhazsT2wtM-unsplash.jpg',
+ './images/quentin-mahe-a6jCS61X1Hg-unsplash.jpg',
+ './images/vladimir-soares-z_8Jqe0Cc-s-unsplash.jpg',
+ './images/shimo-yann-7nTFrV1xQGE-unsplash.jpg',
+ './images/michael-matveev-Bk8zT4gLLt0-unsplash.jpg',
+ './images/mohammad-samir-huHXKc_usoA-unsplash.jpg'
+ ]
+ return (
+
+ Les personnalité à rencontrer
+ Feuilletez les visages de celles et ceux qui attendent simplement un peu de votre temps. Chaque
+ sourire porte une histoire, chaque rencontre est une promesse.
+
+
+ Voir tous les profils
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/components/photo-grid.jsx b/app/components/photo-grid.jsx
new file mode 100644
index 0000000..c8b9ff7
--- /dev/null
+++ b/app/components/photo-grid.jsx
@@ -0,0 +1,22 @@
+'use client'
+import '../styles/photo-grid.css';
+
+const areaNames = [
+ 'img1', 'img2', 'img3', 'img4',
+ 'img5', 'img6', 'img7', 'img8'];
+
+export default function PhotoGrid({ images }) {
+ return (
+
+ {images.map((image, index) => (
+
+
+
+ ))}
+
+ );
+ }
\ No newline at end of file
diff --git a/app/components/search-bar.jsx b/app/components/search-bar.jsx
new file mode 100644
index 0000000..fb85301
--- /dev/null
+++ b/app/components/search-bar.jsx
@@ -0,0 +1,80 @@
+'use client'
+import '../styles/search-bar.css'
+import { usePathname, useRouter, useSearchParams } from 'next/navigation'
+import { useState, useEffect } from 'react';
+
+export default function Searchbar({ num, onChange }) {
+ const pathname = usePathname()
+ const router = useRouter()
+ const searchParams = useSearchParams()
+
+ const [formMoment, setFormMoment] = useState('')
+ const [formLoc, setFormLoc] = useState('')
+
+ useEffect(() => {
+ const moment = searchParams.get('moment') || '';
+ const localisation = searchParams.get('localisation') || '';
+ setFormMoment(moment);
+ setFormLoc(localisation);
+ }, [searchParams]);
+
+ const options = ["Un repas", "Un café/thé", "Une promenade", "Une sortie culturelle", "Autre activité"];
+
+ const handleSubmit = (e) => {
+ e.preventDefault()
+
+ const params = new URLSearchParams()
+ if (formMoment) params.set('moment', formMoment)
+ if (formLoc) params.set('localisation', formLoc)
+
+ if (pathname === '/visite') {
+ router.replace(`/visite?${params.toString()}`)
+ onChange({ moment: formMoment, localisation: formLoc })
+ } else {
+ router.push(`/visite?${params.toString()}`)
+ }
+ }
+
+ const handleReset = () => {
+ setFormMoment('')
+ setFormLoc('')
+ onChange({ moment: '', localisation: '' })
+ router.replace(`/visite`)
+ }
+
+ return (
+
+ )
+}
diff --git a/app/components/user-card.jsx b/app/components/user-card.jsx
new file mode 100644
index 0000000..3bffd56
--- /dev/null
+++ b/app/components/user-card.jsx
@@ -0,0 +1,21 @@
+'use client'
+
+export default function UserCard (props) {
+ const handleClick = () => {
+ console.log(`name : ${props.firstname} | Moment Favori : ${props.type}`)
+ }
+ return (
+
+
+
+
+
+
{props.type}
+
{props.firstname}
+
{props.job} · {props.age} ans
+
{props.city}
+
{props.description}
+
Programmer un moment
+
+ );
+}
\ No newline at end of file
diff --git a/app/components/users.jsx b/app/components/users.jsx
new file mode 100644
index 0000000..2f24fd7
--- /dev/null
+++ b/app/components/users.jsx
@@ -0,0 +1,17 @@
+'use client'
+
+import UserCard from "./user-card"
+
+const Users = ({ users , ref}) => {
+
+ return (
+
+ {users.map((user, index) => (
+
+
+ ))}
+
+ )
+};
+
+export default Users;
diff --git a/app/components/volunteer-form.jsx b/app/components/volunteer-form.jsx
new file mode 100644
index 0000000..ee3af5e
--- /dev/null
+++ b/app/components/volunteer-form.jsx
@@ -0,0 +1,137 @@
+'use client'
+import '../styles/volunteer-form.css'
+
+import { useState } from 'react';
+
+export default function VolunteerForm() {
+ const options = ["une fois par semaine", "une fois par mois", "une fois par trimestre", "une fois par an"];
+ const [formData, setFormData] = useState({
+ firstName: '',
+ lastName: '',
+ email: '',
+ city: '',
+ zipCode: '',
+ dispo: '',
+ motivation: ''
+ });
+
+ const handleChange = (e) => {
+ const { name, value } = e.target;
+ setFormData(prev => ({
+ ...prev,
+ [name]: value
+ }));
+ };
+
+ const handleSubmit = async (e) => {
+ e.preventDefault();
+ try {
+ console.log(formData)
+ const response = await fetch('https://myapp-wlng.onrender.com/volunteers', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ body: JSON.stringify(formData)
+ });
+
+ const result = await response.json()
+ console.log(result);
+ } catch (err) {
+ console.error(err);
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/app/components/why-volunteer.jsx b/app/components/why-volunteer.jsx
new file mode 100644
index 0000000..94e989f
--- /dev/null
+++ b/app/components/why-volunteer.jsx
@@ -0,0 +1,35 @@
+'use client'
+import Card from "./card"
+
+export default function WhyVolunteer() {
+ return (
+
+
+ POURQUOI DEVENIR BÉNÉVOLE ?
+ Être bénévole chez Adaence, c'est bien plus qu'une simple activité. C'est une expérience simple activite. Ce
+ enrichissante qui apporte du sens à votre vie et à celle des autres.
+
+
+
+
+
+
+
+ )
+}
\ No newline at end of file
diff --git a/app/layout.js b/app/layout.js
new file mode 100644
index 0000000..0b2e147
--- /dev/null
+++ b/app/layout.js
@@ -0,0 +1,20 @@
+import Footer from "./components/footer"
+import Navbar from "./components/navbar"
+
+export const metadata = {
+ title: 'Adaence',
+ description: 'Site de rencontre intergénérationnelle',
+}
+
+export default function RootLayout({ children }) {
+ return (
+
+
+
+
+ {children}
+
+
+
+ )
+}
diff --git a/app/page.jsx b/app/page.jsx
new file mode 100644
index 0000000..6aea977
--- /dev/null
+++ b/app/page.jsx
@@ -0,0 +1,23 @@
+import './styles/globals.css';
+import Header from './components/header';
+import Persons from './components/persons';
+import How from './components/how';
+import MakeDifference from './components/make-difference';
+import { Suspense } from 'react';
+
+
+export default function HomePage() {
+
+
+ return (
+
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/app/styles/comment.css b/app/styles/comment.css
new file mode 100644
index 0000000..aa2b6db
--- /dev/null
+++ b/app/styles/comment.css
@@ -0,0 +1,42 @@
+.comment-card {
+ background-color: white;
+ border-radius: 12px;
+ box-shadow: var(--shadow-md);
+ padding: 24px;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ margin: 20px ;
+ text-align: left;
+ }
+ .comment-avatar {
+ display: flex;
+ flex-direction: row;
+
+ }
+ .comment-avatar img {
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ object-fit: cover;
+ margin-right: 16px;
+ }
+
+
+
+ .comment-name {
+ font-weight: bold;
+ color: #333;
+ }
+
+ .comment-role {
+ font-size: 0.9em;
+ color: #666;
+ }
+
+ .comment-quote {
+ font-style: italic;
+ color: #333;
+ margin-top: 12px;
+ line-height: 1.5rem;
+ }
\ No newline at end of file
diff --git a/app/styles/footer.css b/app/styles/footer.css
new file mode 100644
index 0000000..fca4b1b
--- /dev/null
+++ b/app/styles/footer.css
@@ -0,0 +1,88 @@
+.footer {
+ background-color: var(--dark-color);
+ padding: 40px;
+ width: 100%;
+ }
+
+ .footer-content {
+ display: grid;
+ grid-template-columns: repeat(3,1fr);
+ gap: 40px;
+ border-bottom: 1px solid #444;
+ padding-bottom: 30px;
+ }
+
+ @media screen and (max-width: 768px) {
+ .footer-content {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ }
+ }
+
+ .footer-column {
+ max-width: 350px;
+ }
+
+ .footer-title {
+ color: var(--secondary-color);
+ font-size: 1.1rem;
+ margin-bottom: 15px;
+ }
+
+ .footer-text {
+ font-size: 0.9em;
+ color: var(--light-color);
+ line-height: 1.6;
+ margin-bottom: 15px;
+
+ }
+
+ .footer-icons {
+ display: flex;
+ }
+
+ .footer-icons svg {
+ margin-right: 15px;
+ font-size: 1.2em;
+ transition: color 0.2s;
+ padding: 2px;
+ background-color: #484848;
+ border-radius: 50%;
+ color: var(--light-color);
+ }
+
+ .footer a {
+ color: var(--light-color);
+ text-decoration: none;
+
+ }
+
+ .footer-list {
+ list-style: none;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ align-items: start;
+ color: var(--light-color);
+
+ }
+
+ .footer-list li {
+ margin-bottom: 10px;
+ }
+
+ .footer-list a {
+ text-decoration: none;
+ color: #ccc;
+ font-size: 0.9em;
+ }
+
+
+
+ .footer-bottom {
+ text-align: center;
+ font-size: 0.75em;
+ color: #888;
+ margin-top: 20px;
+ }
\ No newline at end of file
diff --git a/app/styles/globals.css b/app/styles/globals.css
new file mode 100644
index 0000000..d21dac1
--- /dev/null
+++ b/app/styles/globals.css
@@ -0,0 +1,400 @@
+@import url('https://fonts.googleapis.com/css2?family=Amatic+SC:wght@400;700&family=Roboto:ital,wght@0,100..900;1,100..900&display=swap');
+
+* {
+ padding: 0;
+ margin: 0;
+ box-sizing: border-box;
+ font-family: "Roboto", sans-serif;
+}
+
+:root {
+ --primary-color: #fafafa;
+ --secondary-color: #7a78ff;
+ --accent-color: #ff6d38;
+ --heading-color: #333;
+ --light-color: #f9f9f9;
+ --dark-color: #333;
+
+ --btn-primary-bg: #333;
+ --btn-secondary-bg: #8584ff;
+ --btn-accent-bg: #ffc412;
+ --btn-primary-hover-bg: #e74c3c;
+ --btn-secondary-hover-bg: #333;
+
+ --font-family-heading: 'Amatic SC', sans-serif;
+ --border-radius: 8px;
+
+ --shadow-sm: 0 2px 5px rgba(0, 0, 0, 0.1);
+ --shadow-md: 0 3px 10px rgba(0, 0, 0, 0.1);
+ --shadow-lg: 0 5px 15px rgba(0, 0, 0, 0.1);
+ --shadow-xl: 0 5px 15px rgba(0, 0, 0, 0.2);
+
+ --section-margin: 2rem 0;
+ --container-width: 90%;
+}
+
+.navbar-title {
+ font-weight: bold;
+ font-size: 1.5rem;
+ padding-bottom: 6px;
+}
+
+.navbar-title span {
+ color: var(--secondary-color);
+
+}
+
+.navbar {
+ display: flex;
+ align-items: center;
+ justify-content: space-around;
+ height: 100px;
+ width: 100%;
+
+}
+
+li {
+ list-style: none;
+ padding: 0 10px;
+}
+
+.nav-links {
+ display: flex;
+ align-items: center;
+ margin: 0;
+
+}
+
+.don {
+ display: flex;
+ background-color: var(--btn-secondary-bg);
+ border-radius: 30px;
+ padding: 15px;
+ justify-content: center;
+ align-items: center;
+
+}
+
+.don:hover {
+ background-color: var(--btn-secondary-hover-bg);
+}
+
+.don a {
+ color: var(--light-color);
+ text-decoration: none;
+}
+
+.don:hover a {
+ color: var(--light-color);
+}
+
+.navbar a {
+ color: var(--heading-color);
+ text-decoration: none;
+ font-weight: bold;
+ display: flex;
+ align-items: center;
+}
+
+li a:hover {
+ color: var(--accent-color);
+}
+
+
+
+main {
+ width: 100%;
+ background-color: var(--light-color);
+}
+
+.background-img {
+ height: 350px;
+ width: 100%;
+ object-fit: cover;
+}
+
+.header-home {
+ position: relative;
+ height: 520px;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ @media screen and (min-width:768px) {
+ height: 390px;
+
+ }
+}
+
+.search-bar {
+ position: absolute;
+ bottom: 0px;
+ display: flex;
+ justify-content: space-around;
+ width: 60%;
+ align-items: center;
+ padding: 10px;
+ background-color: var(--primary-color);
+ box-shadow: var(--shadow-xl);
+ align-items: end;
+ border-radius: 8px;
+}
+
+.volunteer-form h2 {
+ font-family: var(--font-family-heading);
+ font-size: 2.5rem;
+}
+
+.presentation {
+ position: absolute;
+ top: 130px;
+ width: 90%;
+ text-align: center;
+ color: var(--light-color);
+
+ @media screen and (min-width:768px) {
+ width: 45%;
+
+ }
+}
+
+h1 {
+ font-family: var(--font-family-heading);
+ margin-bottom: 30px;
+ font-size: 2rem;
+}
+
+.intro,
+.how {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ margin: 30px 0;
+ width: 100%;
+}
+
+.make-difference {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ text-align: center;
+ width: 100%;
+ padding: 0 10px;
+}
+
+.intro p,
+.how>p,
+.make-difference>p {
+ color: var(--heading-color);
+ width: 45%;
+}
+
+.how {
+ background-color: white;
+}
+
+.visite {
+ background-color: var(--btn-primary-bg);
+ padding: 15px;
+ border-radius: 30px;
+}
+
+.visite:hover {
+ background-color: var(--btn-primary-hover-bg);
+}
+
+.visite a {
+ color: var(--light-color);
+ text-decoration: none;
+}
+
+.cards {
+ display: grid;
+ grid-template-columns: 1fr;
+
+ @media screen and (min-width:380px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media screen and (min-width: 768px) {
+
+ grid-template-columns: repeat(4, 1fr);
+ }
+}
+
+.card {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin: 10px;
+ padding: 20px;
+ border-radius: 10px;
+ background-color: var(--light-color);
+ box-shadow: var(--shadow-xl);
+}
+
+.card h2 {
+ margin: 20px 0;
+}
+
+.links {
+ display: flex;
+ margin: 30px;
+ align-items: center;
+ gap: 2rem;
+ flex-direction: column;
+
+ @media screen and (min-width:768px) {
+ flex-direction: row;
+
+ }
+}
+
+
+.volunteer {
+ background-color: var(--btn-accent-bg);
+ padding: 15px;
+ border-radius: 30px;
+}
+
+.volunteer a {
+ text-decoration: none;
+ color: var(--light-color);
+}
+
+.visite-header {
+ position: relative;
+ height: 240px;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin-bottom: 20px;
+
+ @media screen and (min-width:768px) {
+ height: 150px;
+
+ }
+}
+
+.users {
+ display: grid;
+ grid-template-columns: repeat(1, 1fr);
+ width: 100%;
+ grid-gap: 30px;
+ padding: 20px;
+ justify-content: center;
+
+ @media screen and (min-width:768px) {
+ grid-template-columns: repeat(2, 1fr);
+ }
+
+ @media screen and (min-width:1200px) {
+ grid-template-columns: repeat(4, 1fr);
+ }
+}
+
+.user-card {
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ border-radius: 8px;
+ box-shadow: var(--shadow-md);
+
+}
+
+.user-card p,
+.user-card h3 {
+ padding: 10px 20px;
+}
+
+.user-card img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 8px 8px 0 0;
+}
+
+h3 {
+ color: var(--accent-color);
+}
+
+.moment {
+ color: var(--light-color);
+ background-color: #333;
+ padding: 15px;
+ width: fit-content;
+ border-radius: 30px;
+ margin: 10px auto;
+ text-align: center;
+ cursor: pointer;
+}
+
+.moment:hover {
+ background-color: var(--accent-color);
+}
+
+.image-holder {
+ height: 250px;
+
+ @media screen and (min-width:1200px) {
+ height: 200px;
+
+ }
+}
+
+.pagination {
+ display: flex;
+ justify-content: center;
+ gap: 0.5rem;
+ margin: 2rem 0
+}
+
+.pagination button {
+ padding: 0.4rem 0.8rem;
+ border: none;
+ cursor: pointer;
+ color: var(--btn-secondary-bg);
+ border-radius: 4px;
+}
+
+.pagination button.active {
+ background-color: var(--btn-secondary-bg);
+ color: white;
+ font-weight: bold;
+}
+
+.hide {
+ opacity: 0;
+ pointer-events: none;
+}
+
+.previous-next {
+ display: none;
+
+ @media screen and (min-width:768px) {
+ display: block;
+
+ }
+}
+
+.labeled {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+
+ width: 100%;
+
+}
+
+.testimony {
+ text-align: center;
+
+}
+
+li .disabled {
+ pointer-events: none;
+ color: var(--accent-color);
+}
\ No newline at end of file
diff --git a/app/styles/navbar.css b/app/styles/navbar.css
new file mode 100644
index 0000000..ac3ed60
--- /dev/null
+++ b/app/styles/navbar.css
@@ -0,0 +1,54 @@
+
+.don-desktop {
+ display: block;
+}
+
+.burger {
+ display: none;
+ border: none;
+ border-radius: 5px;
+ background-color: var(--btn-secondary-bg);
+ cursor: pointer;
+ color: #fafafa;
+ z-index: 100;
+ position: fixed;
+ left: 5%;
+}
+
+.don-mobile {
+ display: none;
+}
+
+@media (max-width: 768px) {
+ .burger {
+ display: block;
+ }
+
+ .nav-links {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ background: white;
+ flex-direction: column;
+ align-items: center;
+ padding: 1rem 0;
+ transform: translateY(-150%);
+ transition: transform 0.3s ease-in-out;
+ box-shadow: 0 4px 8px rgba(0,0,0,0.1);
+ z-index: 50;
+ }
+
+ .open {
+ transform: translateY(0);
+ }
+
+ .don-desktop {
+ display: none;
+ }
+
+ .don-mobile {
+ display: block;
+ margin-top: 1rem;
+ }
+}
\ No newline at end of file
diff --git a/app/styles/photo-grid.css b/app/styles/photo-grid.css
new file mode 100644
index 0000000..8a87ccf
--- /dev/null
+++ b/app/styles/photo-grid.css
@@ -0,0 +1,33 @@
+.photo-grid {
+ display: grid;
+
+ grid-template-areas:
+ "img1 img2"
+ "img1 img6"
+ "img5 img6"
+ "img3 img4"
+ "img3 img8"
+ "img7 img8";
+ gap: 10px;
+ padding: 20px 40px ;
+
+ @media screen and (min-width:768px) {
+ grid-template-areas:
+ "img1 img2 img3 img4"
+ "img1 img6 img3 img8"
+ "img5 img6 img7 img8";
+ }
+}
+
+.photo-item {
+ overflow: hidden;
+ border-radius: 8px;
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
+}
+.photo-item img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ border-radius: 8px;
+ display: block;
+}
diff --git a/app/styles/search-bar.css b/app/styles/search-bar.css
new file mode 100644
index 0000000..6457942
--- /dev/null
+++ b/app/styles/search-bar.css
@@ -0,0 +1,70 @@
+.search-bar {
+ display: flex;
+ flex-direction: column;
+ width: 90%;
+ align-items: center;
+ @media screen and (min-width:768px) {
+ width: 70%;
+ }
+}
+
+.up-search-bar {
+ gap: 1rem;
+ display: flex;
+ margin-top: 1rem;
+ width: 100%;
+ align-items: center;
+ justify-content: space-between;
+ flex-direction: column;
+ @media screen and (min-width:768px) {
+ flex-direction: row;;
+ align-items: flex-end;
+
+ }
+}
+
+
+
+.search-bar label {
+ font-weight: 600;
+ margin-bottom: 0.25rem;
+ margin-right: 3rem;
+}
+
+.up-search-bar select,
+.up-search-bar input[type="text"] {
+ padding: 0.5rem 1rem;
+ border: 1px solid #ccc;
+ border-radius: 8px;
+ font-size: 1rem;
+ width: 100%;
+}
+
+.up-search-bar input[type="submit"] {
+ background-color: #333;
+ color: #fafafa;
+ border: none;
+ width: auto;
+ padding: 0.75rem;
+ font-weight: 600;
+ border-radius: 9999px;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+}
+
+.up-search-bar input[type="submit"]:hover {
+ background-color: #e74c3c;
+}
+
+.results {
+ width: 100%;
+
+ display: flex;
+ justify-content: space-between;
+}
+
+.refresh {
+ color: #e74c3c;
+ text-decoration: underline;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/app/styles/volunteer-form.css b/app/styles/volunteer-form.css
new file mode 100644
index 0000000..8f478db
--- /dev/null
+++ b/app/styles/volunteer-form.css
@@ -0,0 +1,104 @@
+.volunteer-form {
+ position: absolute;
+ bottom: 0px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: space-around;
+ width: 90%;
+ padding: 10px;
+ background-color: var(--primary-color);
+ box-shadow: var(--shadow-xl);
+ border-radius: 8px;
+ @media screen and (min-width:768px) {
+ bottom: 40px;
+ width: 60%;
+
+ }
+}
+
+.volunteer-form p,
+.volunteer-form h2 {
+ text-align: center;
+}
+
+
+.volunteer-form>div {
+ margin: 20px;
+ width: 100%;
+
+}
+
+.name,
+.adress {
+ display: flex;
+ justify-content: space-evenly;
+ gap: 1rem;
+ flex-direction: column;
+ @media screen and (min-width:768px) {
+ flex-direction: row;
+
+ }
+}
+
+/* .name div,
+.adress div {
+ width: 50%;
+} */
+
+select,
+input[type="text"],
+textarea {
+ padding: 0.5rem 1rem;
+ border: 1px solid #ccc;
+ border-radius: 8px;
+ font-size: 1rem;
+ width: 100%;
+}
+
+textarea {
+ resize: none;
+}
+
+span {
+ color: red;
+}
+
+label {
+ font-weight: 600;
+ margin-bottom: 0.25rem;
+ width: 60%;
+}
+
+input[type="submit"] {
+ background-color: #ffc412;
+ color: #fafafa;
+ border: none;
+ width: 30%;
+ padding: 0.75rem 0;
+ font-weight: 600;
+ border-radius: 9999px;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+}
+
+input[type="submit"]:hover {
+ background-color: #e74c3c;
+}
+
+.header-volunteer {
+ height: 1320px;
+ position: relative;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ @media screen and (min-width:768px) {
+ height: 1120px;
+
+ }
+}
+.header-volunteer .presentation {
+ width: 80%;
+}
\ No newline at end of file
diff --git a/app/visite/page.js b/app/visite/page.js
new file mode 100644
index 0000000..c0aa9e9
--- /dev/null
+++ b/app/visite/page.js
@@ -0,0 +1,98 @@
+"use client"
+import '../styles/globals.css';
+import Searchbar from '../components/search-bar';
+import Users from '../components/users';
+import { useState, useRef, useEffect, Suspense } from 'react';
+
+export default function Visite() {
+ const usersPerPage = 8;
+ const usersRef = useRef();
+
+ const [filters, setFilters] = useState({
+ moment: '',
+ localisation: ''
+ });
+
+ const [users, setUsers] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [page, setPage] = useState(1);
+
+ const fetchUsers = (moment, localisation) => {
+ setLoading(true);
+ const queryParams = new URLSearchParams();
+
+ if (moment) queryParams.append('moment', moment);
+ if (localisation) queryParams.append('localisation', localisation);
+
+ fetch(`https://myapp-wlng.onrender.com/elders?${queryParams.toString()}`)
+ .then(res => res.json())
+ .then(data => {
+ setUsers(data);
+ setLoading(false);
+ })
+ .catch(err => {
+ console.error('Erreur lors du fetch :', err);
+ setLoading(false);
+ });
+ };
+
+ useEffect(() => {
+ const searchParams = new URLSearchParams(window.location.search);
+ const moment = searchParams.get("moment") || '';
+ const localisation = searchParams.get("localisation") || '';
+ setFilters({ moment, localisation });
+ fetchUsers(moment, localisation);
+ }, []);
+
+ const handleFilterChange = (newFilters) => {
+ setFilters(newFilters);
+ setPage(1);
+ fetchUsers(newFilters.moment, newFilters.localisation);
+ };
+
+ const maxPage = Math.ceil(users.length / usersPerPage);
+ const pagedUsers = users.slice((page - 1) * usersPerPage, page * usersPerPage);
+ const pages = Array.from({ length: maxPage }, (_, i) => i + 1);
+
+ const handlePageChange = (newPage) => {
+ setPage(newPage);
+ usersRef.current?.scrollIntoView({
+ behavior: 'smooth',
+ });
+ };
+
+ if (loading) return Chargement...
;
+
+ return (
+
+
+
+
+ handlePageChange(page - 1)} className={page === 1 ? "hide previous-next" : "previous-next"}>
+ {"<< Précédent"}
+
+
+ {pages.map((p) => (
+ handlePageChange(p)}
+ >
+ {p}
+
+ ))}
+
+ handlePageChange(page + 1)} className={page === maxPage ? "hide previous-next" : "previous-next"}>
+ {"Suivant >>"}
+
+
+
+ );
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..21aac42
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1703 @@
+{
+ "name": "projet-front-end-conception-de-base-de-donn-es-VictorLpr",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "express": "^5.1.0",
+ "lucide-react": "^0.503.0",
+ "next": "^15.3.1",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0"
+ }
+ },
+ "node_modules/@emnapi/runtime": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz",
+ "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
+ }
+ },
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz",
+ "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
+ "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz",
+ "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz",
+ "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz",
+ "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz",
+ "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz",
+ "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz",
+ "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz",
+ "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz",
+ "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz",
+ "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
+ "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
+ "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
+ "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
+ "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
+ "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
+ "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0"
+ }
+ },
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
+ "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
+ "cpu": [
+ "wasm32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/runtime": "^1.4.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
+ "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
+ "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@next/env": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.1.tgz",
+ "integrity": "sha512-cwK27QdzrMblHSn9DZRV+DQscHXRuJv6MydlJRpFSqJWZrTYMLzKDeyueJNN9MGd8NNiUKzDQADAf+dMLXX7YQ==",
+ "license": "MIT"
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.1.tgz",
+ "integrity": "sha512-hjDw4f4/nla+6wysBL07z52Gs55Gttp5Bsk5/8AncQLJoisvTBP0pRIBK/B16/KqQyH+uN4Ww8KkcAqJODYH3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.1.tgz",
+ "integrity": "sha512-q+aw+cJ2ooVYdCEqZVk+T4Ni10jF6Fo5DfpEV51OupMaV5XL6pf3GCzrk6kSSZBsMKZtVC1Zm/xaNBFpA6bJ2g==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.1.tgz",
+ "integrity": "sha512-wBQ+jGUI3N0QZyWmmvRHjXjTWFy8o+zPFLSOyAyGFI94oJi+kK/LIZFJXeykvgXUk1NLDAEFDZw/NVINhdk9FQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.1.tgz",
+ "integrity": "sha512-IIxXEXRti/AulO9lWRHiCpUUR8AR/ZYLPALgiIg/9ENzMzLn3l0NSxVdva7R/VDcuSEBo0eGVCe3evSIHNz0Hg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.1.tgz",
+ "integrity": "sha512-bfI4AMhySJbyXQIKH5rmLJ5/BP7bPwuxauTvVEiJ/ADoddaA9fgyNNCcsbu9SlqfHDoZmfI6g2EjzLwbsVTr5A==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-musl": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.1.tgz",
+ "integrity": "sha512-FeAbR7FYMWR+Z+M5iSGytVryKHiAsc0x3Nc3J+FD5NVbD5Mqz7fTSy8CYliXinn7T26nDMbpExRUI/4ekTvoiA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.1.tgz",
+ "integrity": "sha512-yP7FueWjphQEPpJQ2oKmshk/ppOt+0/bB8JC8svPUZNy0Pi3KbPx2Llkzv1p8CoQa+D2wknINlJpHf3vtChVBw==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.1.tgz",
+ "integrity": "sha512-3PMvF2zRJAifcRNni9uMk/gulWfWS+qVI/pagd+4yLF5bcXPZPPH2xlYRYOsUjmCJOXSTAC2PjRzbhsRzR2fDQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@swc/counter": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
+ "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@swc/helpers": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz",
+ "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.8.0"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.0",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.6.3",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.0",
+ "raw-body": "^3.0.0",
+ "type-is": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/busboy": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+ "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+ "dependencies": {
+ "streamsearch": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=10.16.0"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001715",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz",
+ "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/client-only": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
+ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
+ "license": "MIT"
+ },
+ "node_modules/color": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
+ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-convert": "^2.0.1",
+ "color-string": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=12.5.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
+ "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
+ "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
+ "node_modules/lucide-react": {
+ "version": "0.503.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.503.0.tgz",
+ "integrity": "sha512-HGGkdlPWQ0vTF8jJ5TdIqhQXZi6uh3LnNgfZ8MHiuxFfX3RZeA79r2MW2tHAZKlAVfoNE8esm3p+O6VkIvpj6w==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/next": {
+ "version": "15.3.1",
+ "resolved": "https://registry.npmjs.org/next/-/next-15.3.1.tgz",
+ "integrity": "sha512-8+dDV0xNLOgHlyBxP1GwHGVaNXsmp+2NhZEYrXr24GWLHtt27YrBPbPuHvzlhi7kZNYjeJNR93IF5zfFu5UL0g==",
+ "license": "MIT",
+ "dependencies": {
+ "@next/env": "15.3.1",
+ "@swc/counter": "0.1.3",
+ "@swc/helpers": "0.5.15",
+ "busboy": "1.6.0",
+ "caniuse-lite": "^1.0.30001579",
+ "postcss": "8.4.31",
+ "styled-jsx": "5.1.6"
+ },
+ "bin": {
+ "next": "dist/bin/next"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
+ },
+ "optionalDependencies": {
+ "@next/swc-darwin-arm64": "15.3.1",
+ "@next/swc-darwin-x64": "15.3.1",
+ "@next/swc-linux-arm64-gnu": "15.3.1",
+ "@next/swc-linux-arm64-musl": "15.3.1",
+ "@next/swc-linux-x64-gnu": "15.3.1",
+ "@next/swc-linux-x64-musl": "15.3.1",
+ "@next/swc-win32-arm64-msvc": "15.3.1",
+ "@next/swc-win32-x64-msvc": "15.3.1",
+ "sharp": "^0.34.1"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.1.0",
+ "@playwright/test": "^1.41.2",
+ "babel-plugin-react-compiler": "*",
+ "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0",
+ "sass": "^1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@playwright/test": {
+ "optional": true
+ },
+ "babel-plugin-react-compiler": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz",
+ "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz",
+ "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
+ "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "19.1.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
+ "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.26.0"
+ },
+ "peerDependencies": {
+ "react": "^19.1.0"
+ }
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/scheduler": {
+ "version": "0.26.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
+ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/sharp": {
+ "version": "0.34.1",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
+ "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "dependencies": {
+ "color": "^4.2.3",
+ "detect-libc": "^2.0.3",
+ "semver": "^7.7.1"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.1",
+ "@img/sharp-darwin-x64": "0.34.1",
+ "@img/sharp-libvips-darwin-arm64": "1.1.0",
+ "@img/sharp-libvips-darwin-x64": "1.1.0",
+ "@img/sharp-libvips-linux-arm": "1.1.0",
+ "@img/sharp-libvips-linux-arm64": "1.1.0",
+ "@img/sharp-libvips-linux-ppc64": "1.1.0",
+ "@img/sharp-libvips-linux-s390x": "1.1.0",
+ "@img/sharp-libvips-linux-x64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
+ "@img/sharp-libvips-linuxmusl-x64": "1.1.0",
+ "@img/sharp-linux-arm": "0.34.1",
+ "@img/sharp-linux-arm64": "0.34.1",
+ "@img/sharp-linux-s390x": "0.34.1",
+ "@img/sharp-linux-x64": "0.34.1",
+ "@img/sharp-linuxmusl-arm64": "0.34.1",
+ "@img/sharp-linuxmusl-x64": "0.34.1",
+ "@img/sharp-wasm32": "0.34.1",
+ "@img/sharp-win32-ia32": "0.34.1",
+ "@img/sharp-win32-x64": "0.34.1"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/streamsearch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+ "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/styled-jsx": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
+ "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==",
+ "license": "MIT",
+ "dependencies": {
+ "client-only": "0.0.1"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ },
+ "peerDependenciesMeta": {
+ "@babel/core": {
+ "optional": true
+ },
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..142b78a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+ "scripts": {
+ "dev": "next dev"
+ },
+ "dependencies": {
+ "express": "^5.1.0",
+ "lucide-react": "^0.503.0",
+ "next": "^15.3.1",
+ "react": "^19.1.0",
+ "react-dom": "^19.1.0"
+ }
+}
diff --git a/public/data/users.js b/public/data/users.js
new file mode 100644
index 0000000..36550e3
--- /dev/null
+++ b/public/data/users.js
@@ -0,0 +1,562 @@
+export const users = [
+ {
+ "firstname": "Franco",
+ "age": 95,
+ "job": "Ouvrier d'usine",
+ "city": "Saint-Étienne",
+ "zipcode": "42000",
+ "description": "Franco adore raconter ses souvenirs de l’usine et partager un bon café avec les jeunes du quartier.",
+ "imageUrl": "/images/danie-franco-ClHY-KyvI1M-unsplash.jpg",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Soares",
+ "age": 84,
+ "job": "Puéricultrice",
+ "city": "Angers",
+ "zipcode": "49000",
+ "description": "Soares a consacré sa vie aux tout-petits et aime aujourd’hui transmettre tendresse et conseils de vie.",
+ "imageUrl": "/images/vladimir-soares-z_8Jqe0Cc-s-unsplash.jpg",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Tim",
+ "age": 80,
+ "job": "Facteur",
+ "city": "Aurillac",
+ "zipcode": "15000",
+ "description": "Ancien facteur, Tim connaît chaque recoin de sa ville et adore les longues balades en bonne compagnie.",
+ "imageUrl": "/images/tim-mossholder-FRPbQvAwY10-unsplash.jpg",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Shimo",
+ "age": 94,
+ "job": "Professeure",
+ "city": "Besançon",
+ "zipcode": "25000",
+ "description": "Shimo a le cœur sur la main et des tas d’histoires passionnantes à raconter sur ses années d’enseignement.",
+ "imageUrl": "/images/shimo-yann-7nTFrV1xQGE-unsplash.jpg",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Zanon",
+ "age": 86,
+ "job": "Journaliste",
+ "city": "Paris",
+ "zipcode": "75011",
+ "description": "Zanon est curieuse du monde et adore échanger autour d’un bon livre ou d’un article d’actualité.",
+ "imageUrl": "/images/tatiana-zanon-MMhazsT2wtM-unsplash.jpg",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Matveev",
+ "age": 77,
+ "job": "Pilote d'avion",
+ "city": "Toulouse",
+ "zipcode": "31000",
+ "description": "Pilote à la retraite, Matveev a mille anecdotes à partager sur ses voyages aux quatre coins du monde.",
+ "imageUrl": "/images/michael-matveev-Bk8zT4gLLt0-unsplash.jpg",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Mahe",
+ "age": 93,
+ "job": "Mécanicienne",
+ "city": "Le Mans",
+ "zipcode": "72000",
+ "description": "Mahe a les mains d’or et le sourire généreux. Elle aime parler de mécanique, mais surtout de lien humain.",
+ "imageUrl": "/images/quentin-mahe-a6jCS61X1Hg-unsplash.jpg",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Samir",
+ "age": 82,
+ "job": "Musicien",
+ "city": "Lyon",
+ "zipcode": "69007",
+ "description": "Musicien passionné, Samir aime improviser quelques notes et créer des moments chaleureux avec les jeunes.",
+ "imageUrl": "/images/mohammad-samir-huHXKc_usoA-unsplash.jpg",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Marcel",
+ "age": 87,
+ "job": "Charpentier",
+ "city": "Limoges",
+ "zipcode": "87000",
+ "description": "Marcel a construit des charpentes pendant 45 ans et adore partager son savoir-faire et ses astuces de menuiserie.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Solange",
+ "age": 79,
+ "job": "Infirmière",
+ "city": "Grenoble",
+ "zipcode": "38000",
+ "description": "Solange a soigné des milliers de personnes et trouve toujours les mots justes pour réconforter et conseiller.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Roger",
+ "age": 91,
+ "job": "Agriculteur",
+ "city": "Amiens",
+ "zipcode": "80000",
+ "description": "Roger connaît les secrets de la terre et partage volontiers ses anecdotes sur l'évolution du monde rural.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Jacqueline",
+ "age": 84,
+ "job": "Postière",
+ "city": "Caen",
+ "zipcode": "14000",
+ "description": "Jacqueline a rencontré tous les habitants de sa ville et adore échanger des nouvelles autour d'un bon gâteau.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Pierre",
+ "age": 88,
+ "job": "Architecte",
+ "city": "Nancy",
+ "zipcode": "54000",
+ "description": "Pierre observe chaque bâtiment avec passion et raconte l'histoire des monuments avec précision et enthousiasme.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Germaine",
+ "age": 93,
+ "job": "Modiste",
+ "city": "Orléans",
+ "zipcode": "45000",
+ "description": "Germaine a créé des chapeaux pour les plus grandes dames et parle de mode avec élégance et nostalgie.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Paul",
+ "age": 85,
+ "job": "Boucher",
+ "city": "Clermont-Ferrand",
+ "zipcode": "63000",
+ "description": "Paul connaît tous les morceaux et toutes les recettes. Il partage volontiers ses astuces de cuisine traditionnelle.",
+ "imageUrl": "/images/homme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Suzanne",
+ "age": 81,
+ "job": "Secrétaire de mairie",
+ "city": "La Rochelle",
+ "zipcode": "17000",
+ "description": "Suzanne a vu évoluer sa ville pendant des décennies et raconte avec passion les petites histoires locales.",
+ "imageUrl": "/images/femme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Lucien",
+ "age": 90,
+ "job": "Horticulteur",
+ "city": "Avignon",
+ "zipcode": "84000",
+ "description": "Lucien a les mains vertes et partage ses connaissances sur les plantes avec poésie et précision.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Madeleine",
+ "age": 86,
+ "job": "Cuisinière",
+ "city": "Perpignan",
+ "zipcode": "66000",
+ "description": "Madeleine connaît mille recettes traditionnelles et adore transmettre ses secrets culinaires aux plus jeunes.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Victor",
+ "age": 82,
+ "job": "Forgeron",
+ "city": "Rouen",
+ "zipcode": "76000",
+ "description": "Victor raconte avec passion le travail du métal et l'importance des artisans dans notre société moderne.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Paulette",
+ "age": 89,
+ "job": "Tricoteuse",
+ "city": "Mulhouse",
+ "zipcode": "68200",
+ "description": "Paulette a des doigts agiles et un cœur généreux, elle aime partager sa passion pour le tricot et la laine.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Fernand",
+ "age": 94,
+ "job": "Ébéniste",
+ "city": "Aix-en-Provence",
+ "zipcode": "13100",
+ "description": "Fernand a façonné les plus beaux meubles de la région et parle du bois comme d'un ami de longue date.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Marguerite",
+ "age": 78,
+ "job": "Libraire",
+ "city": "Poitiers",
+ "zipcode": "86000",
+ "description": "Marguerite a lu des milliers de livres et trouve toujours la recommandation parfaite pour chaque lecteur.",
+ "imageUrl": "/images/femme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "René",
+ "age": 83,
+ "job": "Pêcheur",
+ "city": "Bayonne",
+ "zipcode": "64100",
+ "description": "René connaît tous les cours d'eau de la région et partage ses techniques de pêche avec patience et humour.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Yvonne",
+ "age": 92,
+ "job": "Institutrice",
+ "city": "Valence",
+ "zipcode": "26000",
+ "description": "Yvonne a enseigné pendant 40 ans et prend plaisir à écouter les jeunes générations avec bienveillance.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Gaston",
+ "age": 87,
+ "job": "Garagiste",
+ "city": "Béziers",
+ "zipcode": "34500",
+ "description": "Gaston peut identifier un problème moteur rien qu'au bruit et raconte l'évolution de l'automobile avec passion.",
+ "imageUrl": "/images/homme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Bernadette",
+ "age": 77,
+ "job": "Couturière",
+ "city": "Metz",
+ "zipcode": "57000",
+ "description": "Bernadette a habillé des générations entières et partage ses astuces de couture avec générosité.",
+ "imageUrl": "/images/femme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Léon",
+ "age": 89,
+ "job": "Cordonnier",
+ "city": "Le Havre",
+ "zipcode": "76600",
+ "description": "Léon connaît l'art du cuir comme personne et raconte l'histoire des chaussures avec humour et précision.",
+ "imageUrl": "/images/homme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Thérèse",
+ "age": 85,
+ "job": "Fleuriste",
+ "city": "Reims",
+ "zipcode": "51100",
+ "description": "Thérèse compose des bouquets magnifiques et partage le langage des fleurs avec poésie et délicatesse.",
+ "imageUrl": "/images/femme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Émile",
+ "age": 91,
+ "job": "Électricien",
+ "city": "Toulon",
+ "zipcode": "83000",
+ "description": "Émile a éclairé des centaines de foyers et explique les mystères de l'électricité avec simplicité.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Denise",
+ "age": 83,
+ "job": "Vendeuse",
+ "city": "Versailles",
+ "zipcode": "78000",
+ "description": "Denise a le sens du commerce et de l'écoute. Elle adore les conversations animées et les bonnes histoires.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Armand",
+ "age": 96,
+ "job": "Imprimeur",
+ "city": "Nîmes",
+ "zipcode": "30000",
+ "description": "Armand a vu l'évolution de l'imprimerie et raconte avec passion l'histoire de la presse et des livres.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Gisèle",
+ "age": 79,
+ "job": "Coiffeuse",
+ "city": "Pau",
+ "zipcode": "64000",
+ "description": "Gisèle a coiffé plusieurs générations et adore discuter des modes capillaires d'hier et d'aujourd'hui.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Louis",
+ "age": 88,
+ "job": "Jardinier",
+ "city": "Colmar",
+ "zipcode": "68000",
+ "description": "Louis connaît toutes les plantes par leur nom latin et prodigue des conseils précieux pour jardiner naturellement.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Henriette",
+ "age": 82,
+ "job": "Comptable",
+ "city": "Boulogne-sur-Mer",
+ "zipcode": "62200",
+ "description": "Henriette a le sens des chiffres et explique l'économie avec clarté. Elle aime les discussions profondes.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Gilbert",
+ "age": 92,
+ "job": "Conducteur de train",
+ "city": "Angoulême",
+ "zipcode": "16000",
+ "description": "Gilbert a parcouru des milliers de kilomètres et raconte les paysages de France avec poésie et précision.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Josette",
+ "age": 86,
+ "job": "Sage-femme",
+ "city": "Montauban",
+ "zipcode": "82000",
+ "description": "Josette a aidé des centaines d'enfants à venir au monde et partage sa sagesse avec bienveillance.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Robert",
+ "age": 90,
+ "job": "Plombier",
+ "city": "Arles",
+ "zipcode": "13200",
+ "description": "Robert a résolu des milliers de problèmes techniques et trouve toujours une solution avec ingéniosité.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Colette",
+ "age": 78,
+ "job": "Journaliste",
+ "city": "Cannes",
+ "zipcode": "06400",
+ "description": "Colette a couvert les grands événements du siècle et raconte l'actualité avec recul et perspicacité.",
+ "imageUrl": "/images/femme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Joseph",
+ "age": 84,
+ "job": "Maçon",
+ "city": "Troyes",
+ "zipcode": "10000",
+ "description": "Joseph a bâti de nombreuses maisons et partage sa connaissance des matériaux avec expertise.",
+ "imageUrl": "/images/homme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Renée",
+ "age": 89,
+ "job": "Pharmacienne",
+ "city": "Chambéry",
+ "zipcode": "73000",
+ "description": "Renée connaît tous les remèdes de grand-mère et conseille avec sagesse sur les questions de santé.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Ernest",
+ "age": 93,
+ "job": "Bûcheron",
+ "city": "Épinal",
+ "zipcode": "88000",
+ "description": "Ernest a passé sa vie dans les forêts vosgiennes et raconte la nature avec respect et émerveillement.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Monique",
+ "age": 81,
+ "job": "Serveuse",
+ "city": "Vannes",
+ "zipcode": "56000",
+ "description": "Monique a servi des milliers de clients et adore les conversations animées autour d'un bon verre.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Eugène",
+ "age": 87,
+ "job": "Artisan verrier",
+ "city": "Vichy",
+ "zipcode": "03200",
+ "description": "Eugène transforme le verre en œuvres d'art et partage sa passion avec émerveillement et patience.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Juliette",
+ "age": 94,
+ "job": "Violoniste",
+ "city": "Antibes",
+ "zipcode": "06600",
+ "description": "Juliette joue toujours quelques morceaux et raconte l'histoire de la musique avec passion et émotion.",
+ "imageUrl": "/images/femme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Auguste",
+ "age": 80,
+ "job": "Facteur d'orgues",
+ "city": "Chartres",
+ "zipcode": "28000",
+ "description": "Auguste a construit et restauré des orgues dans toute la France et parle de musique avec ferveur.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Georgette",
+ "age": 85,
+ "job": "Concierge",
+ "city": "Paris",
+ "zipcode": "75018",
+ "description": "Georgette connaît tous les secrets du quartier et accueille les visiteurs avec chaleur et bienveillance.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Antoine",
+ "age": 89,
+ "job": "Cordier",
+ "city": "Douarnenez",
+ "zipcode": "29100",
+ "description": "Antoine a fabriqué des cordages pour les bateaux et raconte la vie maritime avec nostalgie et précision.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Lucienne",
+ "age": 91,
+ "job": "Institutrice",
+ "city": "Brive-la-Gaillarde",
+ "zipcode": "19100",
+ "description": "Lucienne a enseigné pendant plus de 40 ans et aime toujours apprendre et partager ses connaissances.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Ferdinand",
+ "age": 86,
+ "job": "Apiculteur",
+ "city": "Gap",
+ "zipcode": "05000",
+ "description": "Ferdinand connaît tout sur les abeilles et partage sa passion pour le miel et la nature avec enthousiasme.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Raymonde",
+ "age": 82,
+ "job": "Téléphoniste",
+ "city": "Belfort",
+ "zipcode": "90000",
+ "description": "Raymonde a connecté des milliers de conversations et adore échanger sur l'évolution des communications.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Édouard",
+ "age": 94,
+ "job": "Menuisier",
+ "city": "Albi",
+ "zipcode": "81000",
+ "description": "Édouard a façonné le bois toute sa vie et partage son amour pour l'artisanat avec passion et minutie.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une promenade"
+ },
+ {
+ "firstname": "Marthe",
+ "age": 88,
+ "job": "Couturière",
+ "city": "Arcachon",
+ "zipcode": "33120",
+ "description": "Marthe a habillé des générations de familles et raconte l'évolution de la mode avec nostalgie et humour.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un repas"
+ },
+ {
+ "firstname": "Gustave",
+ "age": 92,
+ "job": "Pâtissier",
+ "city": "Carcassonne",
+ "zipcode": "11000",
+ "description": "Gustave connaît des centaines de recettes par cœur et partage ses secrets de pâtisserie avec générosité.",
+ "imageUrl": "/images/homme.png",
+ "type": "Une sortie culturelle"
+ },
+ {
+ "firstname": "Charlotte",
+ "age": 83,
+ "job": "Lingère",
+ "city": "Cognac",
+ "zipcode": "16100",
+ "description": "Charlotte a travaillé pour les plus grandes maisons et raconte ses souvenirs avec élégance et discrétion.",
+ "imageUrl": "/images/femme.png",
+ "type": "Un café/thé"
+ },
+ {
+ "firstname": "Félix",
+ "age": 89,
+ "job": "Horloger",
+ "city": "Besançon",
+ "zipcode": "25000",
+ "description": "Félix répare les montres avec précision et partage sa fascination pour le temps qui passe avec philosophie.",
+ "imageUrl": "/images/homme.png",
+ "type": "Autre activité"
+ },
+ {
+ "firstname": "Hélène",
+ "age": 80,
+ "job": "Bibliothécaire",
+ "city": "Arras",
+ "zipcode": "62000",
+ "description": "Hélène a lu des milliers de livres et recommande toujours l'ouvrage parfait avec finesse et pertinence.",
+ "imageUrl": "/images/femme.png",
+ "type": "Une sortie culturelle"
+ }
+]
\ No newline at end of file
diff --git a/public/images/.DS_Store b/public/images/.DS_Store
new file mode 100644
index 0000000..5008ddf
Binary files /dev/null and b/public/images/.DS_Store differ
diff --git a/public/images/anil-sharma-vssw0Ad6TFg-unsplash.jpg b/public/images/anil-sharma-vssw0Ad6TFg-unsplash.jpg
new file mode 100644
index 0000000..8f16d1d
Binary files /dev/null and b/public/images/anil-sharma-vssw0Ad6TFg-unsplash.jpg differ
diff --git a/public/images/brain.png b/public/images/brain.png
new file mode 100644
index 0000000..6b55aa6
Binary files /dev/null and b/public/images/brain.png differ
diff --git a/public/images/bust.png b/public/images/bust.png
new file mode 100644
index 0000000..d5d2c78
Binary files /dev/null and b/public/images/bust.png differ
diff --git a/public/images/danie-franco-ClHY-KyvI1M-unsplash.jpg b/public/images/danie-franco-ClHY-KyvI1M-unsplash.jpg
new file mode 100644
index 0000000..d7ece1b
Binary files /dev/null and b/public/images/danie-franco-ClHY-KyvI1M-unsplash.jpg differ
diff --git a/public/images/diego-hernandez-MSepzbKFz10-unsplash.jpg b/public/images/diego-hernandez-MSepzbKFz10-unsplash.jpg
new file mode 100644
index 0000000..9727e12
Binary files /dev/null and b/public/images/diego-hernandez-MSepzbKFz10-unsplash.jpg differ
diff --git a/public/images/favicon.ico b/public/images/favicon.ico
new file mode 100644
index 0000000..55ffae4
Binary files /dev/null and b/public/images/favicon.ico differ
diff --git a/public/images/femme.png b/public/images/femme.png
new file mode 100644
index 0000000..b0cb503
Binary files /dev/null and b/public/images/femme.png differ
diff --git a/public/images/fiqih-pradana-qm-SgY--sVg-unsplash.jpg b/public/images/fiqih-pradana-qm-SgY--sVg-unsplash.jpg
new file mode 100644
index 0000000..ff0d08f
Binary files /dev/null and b/public/images/fiqih-pradana-qm-SgY--sVg-unsplash.jpg differ
diff --git a/public/images/hannah-busing-Zyx1bK9mqmA-unsplash.jpg b/public/images/hannah-busing-Zyx1bK9mqmA-unsplash.jpg
new file mode 100644
index 0000000..f284559
Binary files /dev/null and b/public/images/hannah-busing-Zyx1bK9mqmA-unsplash.jpg differ
diff --git a/public/images/heart.png b/public/images/heart.png
new file mode 100644
index 0000000..c776d43
Binary files /dev/null and b/public/images/heart.png differ
diff --git a/public/images/homme.png b/public/images/homme.png
new file mode 100644
index 0000000..416b532
Binary files /dev/null and b/public/images/homme.png differ
diff --git a/public/images/leaf.png b/public/images/leaf.png
new file mode 100644
index 0000000..ff77af1
Binary files /dev/null and b/public/images/leaf.png differ
diff --git a/public/images/loupe.png b/public/images/loupe.png
new file mode 100644
index 0000000..3dc5c90
Binary files /dev/null and b/public/images/loupe.png differ
diff --git a/public/images/maksym-mazur-aJgAB_693_U-unsplash.jpg b/public/images/maksym-mazur-aJgAB_693_U-unsplash.jpg
new file mode 100644
index 0000000..2c5a823
Binary files /dev/null and b/public/images/maksym-mazur-aJgAB_693_U-unsplash.jpg differ
diff --git a/public/images/memo.png b/public/images/memo.png
new file mode 100644
index 0000000..f2fbbcd
Binary files /dev/null and b/public/images/memo.png differ
diff --git a/public/images/michael-matveev-Bk8zT4gLLt0-unsplash.jpg b/public/images/michael-matveev-Bk8zT4gLLt0-unsplash.jpg
new file mode 100644
index 0000000..38094f8
Binary files /dev/null and b/public/images/michael-matveev-Bk8zT4gLLt0-unsplash.jpg differ
diff --git a/public/images/mohammad-samir-huHXKc_usoA-unsplash.jpg b/public/images/mohammad-samir-huHXKc_usoA-unsplash.jpg
new file mode 100644
index 0000000..e4b92f9
Binary files /dev/null and b/public/images/mohammad-samir-huHXKc_usoA-unsplash.jpg differ
diff --git a/public/images/quentin-mahe-a6jCS61X1Hg-unsplash.jpg b/public/images/quentin-mahe-a6jCS61X1Hg-unsplash.jpg
new file mode 100644
index 0000000..a03618d
Binary files /dev/null and b/public/images/quentin-mahe-a6jCS61X1Hg-unsplash.jpg differ
diff --git a/public/images/shimo-yann-7nTFrV1xQGE-unsplash.jpg b/public/images/shimo-yann-7nTFrV1xQGE-unsplash.jpg
new file mode 100644
index 0000000..e68201a
Binary files /dev/null and b/public/images/shimo-yann-7nTFrV1xQGE-unsplash.jpg differ
diff --git a/public/images/star.png b/public/images/star.png
new file mode 100644
index 0000000..e4e6b85
Binary files /dev/null and b/public/images/star.png differ
diff --git a/public/images/tatiana-zanon-MMhazsT2wtM-unsplash.jpg b/public/images/tatiana-zanon-MMhazsT2wtM-unsplash.jpg
new file mode 100644
index 0000000..c459030
Binary files /dev/null and b/public/images/tatiana-zanon-MMhazsT2wtM-unsplash.jpg differ
diff --git a/public/images/tim-mossholder-FRPbQvAwY10-unsplash.jpg b/public/images/tim-mossholder-FRPbQvAwY10-unsplash.jpg
new file mode 100644
index 0000000..d8f2b03
Binary files /dev/null and b/public/images/tim-mossholder-FRPbQvAwY10-unsplash.jpg differ
diff --git a/public/images/vladimir-soares-z_8Jqe0Cc-s-unsplash.jpg b/public/images/vladimir-soares-z_8Jqe0Cc-s-unsplash.jpg
new file mode 100644
index 0000000..593897c
Binary files /dev/null and b/public/images/vladimir-soares-z_8Jqe0Cc-s-unsplash.jpg differ
diff --git a/public/images/waving.png b/public/images/waving.png
new file mode 100644
index 0000000..c2ccceb
Binary files /dev/null and b/public/images/waving.png differ