13 Commits

Author SHA1 Message Date
3c9c30249b Add src/app/products/page.tsx 2026-03-12 12:44:45 +00:00
d19059e2b7 Update src/app/page.tsx 2026-03-12 12:44:45 +00:00
b5c52fc95d Update src/app/contact/page.tsx 2026-03-12 12:44:44 +00:00
80e90d0d24 Update src/app/about/page.tsx 2026-03-12 12:44:44 +00:00
68428d69b5 Merge version_8 into main
Merge version_8 into main
2026-03-12 12:38:02 +00:00
fc281504eb Update src/app/portfolio/page.tsx 2026-03-12 12:37:58 +00:00
ed2a9e4072 Merge version_8 into main
Merge version_8 into main
2026-03-12 12:37:16 +00:00
cb70d0e5e9 Update src/app/portfolio/page.tsx 2026-03-12 12:37:12 +00:00
c1e0019a5e Merge version_7 into main
Merge version_7 into main
2026-03-12 12:26:43 +00:00
f67a04ed63 Update src/app/portfolio/page.tsx 2026-03-12 12:26:39 +00:00
0dcfa33f04 Merge version_6 into main
Merge version_6 into main
2026-03-12 12:10:49 +00:00
7da2934daa Update src/app/portfolio/page.tsx 2026-03-12 12:10:45 +00:00
882b5fb286 Merge version_5 into main
Merge version_5 into main
2026-03-12 12:06:18 +00:00
5 changed files with 388 additions and 243 deletions

View File

@@ -11,17 +11,17 @@ import { CheckCircle } from "lucide-react";
export default function AboutPage() {
const navItems = [
{ name: "Accueil", id: "home" },
{ name: "Services", id: "services" },
{ name: "Réalisations", id: "portfolio" },
{ name: "À propos", id: "about" },
{ name: "Contact", id: "contact" },
{ name: "Accueil", id: "/" },
{ name: "Services", id: "/services" },
{ name: "Produits", id: "/products" },
{ name: "Réalisations", id: "/portfolio" },
{ name: "À propos", id: "/about" },
{ name: "Contact", id: "/contact" },
];
const footerColumns = [
{
title: "Services",
items: [
title: "Services", items: [
{ label: "Rénovation", href: "/#services" },
{ label: "Construction", href: "/#services" },
{ label: "Maçonnerie", href: "/#services" },
@@ -29,8 +29,7 @@ export default function AboutPage() {
],
},
{
title: "Entreprise",
items: [
title: "Entreprise", items: [
{ label: "À propos", href: "/about" },
{ label: "Nos Réalisations", href: "/portfolio" },
{ label: "Avis Clients", href: "/#testimonials" },
@@ -38,8 +37,7 @@ export default function AboutPage() {
],
},
{
title: "Contact",
items: [
title: "Contact", items: [
{ label: "Téléphone: +32 (0) 2 123 45 67", href: "tel:+32212345678" },
{ label: "Email: info@webild.be", href: "mailto:info@webild.be" },
{ label: "Belgique", href: "#" },
@@ -47,8 +45,7 @@ export default function AboutPage() {
],
},
{
title: "Légal",
items: [
title: "Légal", items: [
{ label: "Politique de Confidentialité", href: "#" },
{ label: "Conditions d'Utilisation", href: "#" },
{ label: "Mentions Légales", href: "#" },
@@ -74,9 +71,7 @@ export default function AboutPage() {
<NavbarStyleCentered
navItems={navItems}
button={{
text: "Demander un devis",
href: "#contact",
}}
text: "Demander un devis", href: "#contact"}}
brandName="Webild Construction"
/>
</div>
@@ -90,25 +85,17 @@ export default function AboutPage() {
background={{ variant: "plain" }}
mediaItems={[
{
imageSrc: "http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=3",
imageAlt: "Équipe professionnelle sur un chantier",
},
imageSrc: "http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=3", imageAlt: "Équipe professionnelle sur un chantier"},
{
imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=3",
imageAlt: "Construction de qualité en cours",
},
imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=3", imageAlt: "Construction de qualité en cours"},
]}
rating={5}
ratingText="Plus de 20 années de confiance"
buttons={[
{
text: "Voir Nos Réalisations",
href: "/portfolio",
},
text: "Voir Nos Réalisations", href: "/portfolio"},
{
text: "Nous Contacter",
href: "#contact",
},
text: "Nous Contacter", href: "#contact"},
]}
tagAnimation="slide-up"
buttonAnimation="slide-up"
@@ -125,22 +112,11 @@ export default function AboutPage() {
tagIcon={CheckCircle}
negativeCard={{
items: [
"Approche générique et impersonnelle",
"Manque de transparence",
"Travail précipité et sans qualité",
"Aucune responsabilité",
"Service client inexistant",
],
"Approche générique et impersonnelle", "Manque de transparence", "Travail précipité et sans qualité", "Aucune responsabilité", "Service client inexistant"],
}}
positiveCard={{
items: [
"✔ Approche personnalisée pour chaque client",
"✔ Transparence totale dans chaque démarche",
"✔ Excellence et soin dans chaque détail",
"✔ Responsabilité complète et garanties",
"✔ Service client réactif et professionnel",
"✔ Éthique professionnelle irréprochable",
],
"✔ Approche personnalisée pour chaque client", "✔ Transparence totale dans chaque démarche", "✔ Excellence et soin dans chaque détail", "✔ Responsabilité complète et garanties", "✔ Service client réactif et professionnel", "✔ Éthique professionnelle irréprochable"],
}}
animationType="slide-up"
textboxLayout="default"
@@ -158,13 +134,9 @@ export default function AboutPage() {
useInvertedBackground={false}
buttons={[
{
text: "Demander un Devis",
href: "#",
},
text: "Demander un Devis", href: "#"},
{
text: "Consultation Gratuite",
href: "tel:+32123456789",
},
text: "Consultation Gratuite", href: "tel:+32123456789"},
]}
/>
</div>
@@ -179,4 +151,4 @@ export default function AboutPage() {
</div>
</ThemeProvider>
);
}
}

View File

@@ -8,17 +8,17 @@ import Link from "next/link";
export default function ContactPage() {
const navItems = [
{ name: "Accueil", id: "home" },
{ name: "Services", id: "services" },
{ name: "Réalisations", id: "portfolio" },
{ name: "À propos", id: "about" },
{ name: "Contact", id: "contact" },
{ name: "Accueil", id: "/" },
{ name: "Services", id: "/services" },
{ name: "Produits", id: "/products" },
{ name: "Réalisations", id: "/portfolio" },
{ name: "À propos", id: "/about" },
{ name: "Contact", id: "/contact" },
];
const footerColumns = [
{
title: "Services",
items: [
title: "Services", items: [
{ label: "Rénovation", href: "/services" },
{ label: "Construction", href: "/services" },
{ label: "Maçonnerie", href: "/services" },
@@ -26,8 +26,7 @@ export default function ContactPage() {
],
},
{
title: "Entreprise",
items: [
title: "Entreprise", items: [
{ label: "À propos", href: "/about" },
{ label: "Nos Réalisations", href: "/portfolio" },
{ label: "Avis Clients", href: "/" },
@@ -35,8 +34,7 @@ export default function ContactPage() {
],
},
{
title: "Contact",
items: [
title: "Contact", items: [
{ label: "Téléphone: +32 (0) 2 123 45 67", href: "tel:+32212345678" },
{ label: "Email: info@webild.be", href: "mailto:info@webild.be" },
{ label: "Belgique", href: "#" },
@@ -44,8 +42,7 @@ export default function ContactPage() {
],
},
{
title: "Légal",
items: [
title: "Légal", items: [
{ label: "Politique de Confidentialité", href: "#" },
{ label: "Conditions d'Utilisation", href: "#" },
{ label: "Mentions Légales", href: "#" },
@@ -96,4 +93,4 @@ export default function ContactPage() {
</div>
</ThemeProvider>
);
}
}

View File

@@ -21,11 +21,12 @@ export default function HomePage() {
testimonial: ""});
const navItems = [
{ name: "Accueil", id: "home" },
{ name: "Services", id: "services" },
{ name: "Réalisations", id: "portfolio" },
{ name: "À propos", id: "about" },
{ name: "Contact", id: "contact" },
{ name: "Accueil", id: "/" },
{ name: "Services", id: "/services" },
{ name: "Produits", id: "/products" },
{ name: "Réalisations", id: "/portfolio" },
{ name: "À propos", id: "/about" },
{ name: "Contact", id: "/contact" },
];
const footerColumns = [
@@ -62,7 +63,11 @@ export default function HomePage() {
},
];
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => {
const handleInputChange = (
e: React.ChangeEvent<
HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement
>
) => {
const { name, value } = e.target;
setFormData((prev) => ({
...prev,
@@ -74,13 +79,20 @@ export default function HomePage() {
e.preventDefault();
setReviewError("");
if (!formData.name.trim() || !formData.testimonial.trim() || !formData.role.trim() || !formData.company.trim()) {
if (
!formData.name.trim() ||
!formData.testimonial.trim() ||
!formData.role.trim() ||
!formData.company.trim()
) {
setReviewError("Tous les champs sont obligatoires.");
return;
}
if (formData.testimonial.length < 10) {
setReviewError("Veuillez écrire au moins 10 caractères pour votre avis.");
setReviewError(
"Veuillez écrire au moins 10 caractères pour votre avis."
);
return;
}
@@ -124,9 +136,11 @@ export default function HomePage() {
background={{ variant: "plain" }}
mediaItems={[
{
imageSrc: "http://img.b2bpic.net/free-photo/young-man-civil-engineer-safety-hat_185193-108529.jpg", imageAlt: "Chantier de construction professionnel"},
imageSrc:
"http://img.b2bpic.net/free-photo/young-man-civil-engineer-safety-hat_185193-108529.jpg", imageAlt: "Chantier de construction professionnel"},
{
imageSrc: "http://img.b2bpic.net/free-photo/full-shot-woman-holding-placard_23-2149366672.jpg", imageAlt: "Réalisation de qualité en construction"},
imageSrc:
"http://img.b2bpic.net/free-photo/full-shot-woman-holding-placard_23-2149366672.jpg", imageAlt: "Réalisation de qualité en construction"},
]}
rating={5}
ratingText="Confiance des clients depuis 20 ans"
@@ -148,19 +162,26 @@ export default function HomePage() {
tagIcon={Wrench}
products={[
{
id: "1", name: "Rénovation Maison", price: "À partir de 900€/m²", imageSrc: "http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1", imageAlt: "Rénovation complète de maison"},
id: "1", name: "Rénovation Maison", price: "À partir de 900€/m²", imageSrc:
"http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1", imageAlt: "Rénovation complète de maison"},
{
id: "2", name: "Construction Neuve", price: "Sur devis", imageSrc: "http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=1", imageAlt: "Construction neuve moderne"},
id: "2", name: "Construction Neuve", price: "Sur devis", imageSrc:
"http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=1", imageAlt: "Construction neuve moderne"},
{
id: "3", name: "Maçonnerie", price: "Sur devis", imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1", imageAlt: "Travaux de maçonnerie professionnels"},
id: "3", name: "Maçonnerie", price: "Sur devis", imageSrc:
"http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1", imageAlt: "Travaux de maçonnerie professionnels"},
{
id: "4", name: "Terrasse", price: "Sur devis", imageSrc: "http://img.b2bpic.net/free-photo/empty-table-chair-dining-set-nearly-sea-ocean-beach-white-cloud-blue-sky_74190-9983.jpg?_wi=1", imageAlt: "Construction de terrasse extérieure"},
id: "4", name: "Terrasse", price: "Sur devis", imageSrc:
"http://img.b2bpic.net/free-photo/empty-table-chair-dining-set-nearly-sea-ocean-beach-white-cloud-blue-sky_74190-9983.jpg?_wi=1", imageAlt: "Construction de terrasse extérieure"},
{
id: "5", name: "Toiture", price: "Sur devis", imageSrc: "http://img.b2bpic.net/free-photo/man-with-helmet-sitting-roof-full-shot_23-2149343712.jpg?_wi=1", imageAlt: "Travaux de toiture de qualité"},
id: "5", name: "Toiture", price: "Sur devis", imageSrc:
"http://img.b2bpic.net/free-photo/man-with-helmet-sitting-roof-full-shot_23-2149343712.jpg?_wi=1", imageAlt: "Travaux de toiture de qualité"},
{
id: "6", name: "Extension Maison", price: "Sur devis", imageSrc: "http://img.b2bpic.net/free-photo/side-view-family-sitting-table_23-2150231683.jpg?_wi=1", imageAlt: "Extension résidentielle moderne"},
id: "6", name: "Extension Maison", price: "Sur devis", imageSrc:
"http://img.b2bpic.net/free-photo/side-view-family-sitting-table_23-2150231683.jpg?_wi=1", imageAlt: "Extension résidentielle moderne"},
{
id: "7", name: "Aménagement Extérieur", price: "Sur devis", imageSrc: "http://img.b2bpic.net/free-photo/senior-man-working-field-with-chest-vegetables_329181-12449.jpg?_wi=1", imageAlt: "Aménagement paysager professionnel"},
id: "7", name: "Aménagement Extérieur", price: "Sur devis", imageSrc:
"http://img.b2bpic.net/free-photo/senior-man-working-field-with-chest-vegetables_329181-12449.jpg?_wi=1", imageAlt: "Aménagement paysager professionnel"},
]}
gridVariant="three-columns-all-equal-width"
animationType="slide-up"
@@ -200,12 +221,14 @@ export default function HomePage() {
tagIcon={Euro}
plans={[
{
id: "renovation-complete", title: "Rénovation Complète", price: "900", period: "€/m²", imageSrc: "http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1", imageAlt: "Rénovation complète avec matériaux", button: { text: "Demander un Devis", href: "/contact" },
id: "renovation-complete", title: "Rénovation Complète", price: "900", period: "€/m²", imageSrc:
"http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1", imageAlt: "Rénovation complète avec matériaux", button: { text: "Demander un Devis", href: "/contact" },
features: [
"✔ Matériaux de qualité inclus", "✔ Main d'œuvre professionnelle", "✔ Garantie de 5 ans", "✔ Suivi de chantier régulier", "✔ Nettoyage et finitions"],
},
{
id: "renovation-standard", title: "Rénovation Partielle", price: "Sur devis", period: "", imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1", imageAlt: "Rénovation partielle", button: { text: "Contacter", href: "/contact" },
id: "renovation-standard", title: "Rénovation Partielle", price: "Sur devis", period: "", imageSrc:
"http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1", imageAlt: "Rénovation partielle", button: { text: "Contacter", href: "/contact" },
features: [
"✔ Devis personnalisé", "✔ Choix des matériaux", "✔ Travaux ciblés", "✔ Flexibilité de budget", "✔ Équipe expérimentée"],
},
@@ -227,16 +250,20 @@ export default function HomePage() {
testimonials={[
{
id: "1", name: "Rénovation Complète", handle: "Appartement - Bruxelles", testimonial: "Projet de rénovation complète intérieur", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=1"},
imageSrc:
"http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=1"},
{
id: "2", name: "Extension Résidentielle", handle: "Addition 50m² - Liège", testimonial: "Extension moderne de 50 mètres carrés", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1"},
imageSrc:
"http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1"},
{
id: "3", name: "Terrasse Extérieure", handle: "Piscine & Terrasse - Namur", testimonial: "Création d'espace extérieur avec piscine", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/outdoor-swimming-pool_1203-2669.jpg?_wi=1"},
imageSrc:
"http://img.b2bpic.net/free-photo/outdoor-swimming-pool_1203-2669.jpg?_wi=1"},
{
id: "4", name: "Construction Neuve", handle: "Maison moderne 150m² - Charleroi", testimonial: "Construction neuve maison individuelle", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1"},
imageSrc:
"http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1"},
]}
showRating={true}
animationType="slide-up"
@@ -255,21 +282,29 @@ export default function HomePage() {
<Star size={16} />
<span className="text-sm font-medium">Témoignages</span>
</div>
<h2 className="text-3xl md:text-5xl font-bold mb-4 text-[var(--foreground)]">Avis de Nos Clients</h2>
<h2 className="text-3xl md:text-5xl font-bold mb-4 text-[var(--foreground)]"
>Avis de Nos Clients</h2>
<p className="text-lg text-[var(--foreground)] opacity-75 max-w-2xl mx-auto">
Partagez votre expérience avec Webild Construction. Vos avis nous aident à continuer à améliorer nos services.
Partagez votre expérience avec Webild Construction. Vos avis nous aident à
continuer à améliorer nos services.
</p>
</div>
<div className="grid md:grid-cols-2 gap-12">
{/* Review Form */}
<div className="bg-[var(--card)] rounded-2xl p-8 border border-[var(--accent)] border-opacity-20">
<h3 className="text-2xl font-bold mb-6 text-[var(--foreground)]">Soumettre un Avis</h3>
<h3 className="text-2xl font-bold mb-6 text-[var(--foreground)]"
>Soumettre un Avis</h3>
{reviewSubmitted ? (
<div className="bg-green-50 border border-green-200 rounded-lg p-6 text-center">
<p className="text-green-800 font-semibold mb-2"> Merci pour votre avis!</p>
<p className="text-green-700 text-sm">Votre témoignage a é reçu avec succès. Nous l'examinerons avant de le publier.</p>
<p className="text-green-800 font-semibold mb-2">
Merci pour votre avis!
</p>
<p className="text-green-700 text-sm">
Votre témoignage a é reçu avec succès. Nous l'examinerons avant de
le publier.
</p>
</div>
) : (
<form onSubmit={handleSubmitReview} className="space-y-4">
@@ -371,45 +406,74 @@ export default function HomePage() {
{/* Testimonials Display */}
<div className="space-y-6">
<h3 className="text-2xl font-bold text-[var(--foreground)] mb-6">Témoignages Récents</h3>
<h3 className="text-2xl font-bold text-[var(--foreground)] mb-6">
Témoignages Récents
</h3>
<div className="space-y-4">
<div className="bg-[var(--card)] rounded-lg p-6 border border-[var(--accent)] border-opacity-20">
<div className="flex gap-1 mb-3">
{[...Array(5)].map((_, i) => (
<Star key={i} size={16} className="fill-yellow-400 text-yellow-400" />
<Star
key={i}
size={16}
className="fill-yellow-400 text-yellow-400"
/>
))}
</div>
<p className="text-[var(--foreground)] mb-4">
"Excellent travail! L'équipe Webild a complètement transformé notre maison. Professionnels, à l'écoute et respectueux des délais."
"Excellent travail! L'équipe Webild a complètement transformé notre
maison. Professionnels, à l'écoute et respectueux des délais."
</p>
<p className="font-semibold text-[var(--foreground)]">
Marc Dupont
</p>
<p className="text-sm text-[var(--foreground)] opacity-60">
Propriétaire, Bruxelles
</p>
<p className="font-semibold text-[var(--foreground)]">Marc Dupont</p>
<p className="text-sm text-[var(--foreground)] opacity-60">Propriétaire, Bruxelles</p>
</div>
<div className="bg-[var(--card)] rounded-lg p-6 border border-[var(--accent)] border-opacity-20">
<div className="flex gap-1 mb-3">
{[...Array(5)].map((_, i) => (
<Star key={i} size={16} className="fill-yellow-400 text-yellow-400" />
<Star
key={i}
size={16}
className="fill-yellow-400 text-yellow-400"
/>
))}
</div>
<p className="text-[var(--foreground)] mb-4">
"Nous recommandons vivement Webild Construction. Devis clair, communication excellente et résultat final impeccable."
"Nous recommandons vivement Webild Construction. Devis clair,
communication excellente et résultat final impeccable."
</p>
<p className="font-semibold text-[var(--foreground)]">
Sophie Bernard
</p>
<p className="text-sm text-[var(--foreground)] opacity-60">
Chef de projet, Liège
</p>
<p className="font-semibold text-[var(--foreground)]">Sophie Bernard</p>
<p className="text-sm text-[var(--foreground)] opacity-60">Chef de projet, Liège</p>
</div>
<div className="bg-[var(--card)] rounded-lg p-6 border border-[var(--accent)] border-opacity-20">
<div className="flex gap-1 mb-3">
{[...Array(5)].map((_, i) => (
<Star key={i} size={16} className="fill-yellow-400 text-yellow-400" />
<Star
key={i}
size={16}
className="fill-yellow-400 text-yellow-400"
/>
))}
</div>
<p className="text-[var(--foreground)] mb-4">
"Service impeccable du début à la fin. L'équipe est très professionnelle et attentive au détail. Nous sommes très satisfaits."
"Service impeccable du début à la fin. L'équipe est très
professionnelle et attentive au détail. Nous sommes très satisfaits."
</p>
<p className="font-semibold text-[var(--foreground)]">
Jean-Pierre Martin
</p>
<p className="text-sm text-[var(--foreground)] opacity-60">
Propriétaire, Namur
</p>
<p className="font-semibold text-[var(--foreground)]">Jean-Pierre Martin</p>
<p className="text-sm text-[var(--foreground)] opacity-60">Propriétaire, Namur</p>
</div>
</div>
</div>
@@ -440,4 +504,4 @@ export default function HomePage() {
</div>
</ThemeProvider>
);
}
}

View File

@@ -3,10 +3,10 @@
import Link from "next/link";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from "@/components/navbar/NavbarStyleCentered/NavbarStyleCentered";
import TestimonialCardOne from "@/components/sections/testimonial/TestimonialCardOne";
import FeatureCardOne from "@/components/sections/feature/FeatureCardOne";
import ContactText from "@/components/sections/contact/ContactText";
import FooterBaseCard from "@/components/sections/footer/FooterBaseCard";
import { Camera, Upload, Trash2 } from "lucide-react";
import { Camera, Upload, Trash2, Play, Maximize2 } from "lucide-react";
import { useState } from "react";
export default function PortfolioPage() {
@@ -104,6 +104,13 @@ export default function PortfolioPage() {
setUploadedMedia((prev) => prev.filter((media) => media.id !== id));
};
const featureItems = uploadedMedia.map((media) => ({
id: media.id,
title: media.name,
description: media.type === "photo" ? "📷 Photo du projet" : "🎥 Vidéo du projet", imageSrc: media.src,
imageAlt: media.name,
}));
return (
<ThemeProvider
defaultButtonVariant="directional-hover"
@@ -127,74 +134,40 @@ export default function PortfolioPage() {
/>
</div>
{/* Portfolio Projects Section */}
<div id="portfolio" data-section="portfolio">
<TestimonialCardOne
title="Nos Réalisations"
description="Découvrez tous nos projets réussis et les transformations que nous avons accomplies pour nos clients en Belgique. Nos réalisations incluent des photos et vidéos de chantiers."
tag="Portfolio Complet"
tagIcon={Camera}
testimonials={[
{
id: "1", name: "Rénovation Complète", role: "Maison - Bruxelles", company: "2024", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-people-watching-smartphone-office_23-2147668943.jpg?_wi=2", imageAlt: "Rénovation complète intérieur maison bruxelles"},
{
id: "2", name: "Extension Résidentielle", role: "Addition 50m² - Liège", company: "2024", rating: 5,
videoSrc: "https://www.youtube.com/embed/dQw4w9WgXcQ?_wi=2", videoAriaLabel: "Vidéo extension résidentielle Liège"},
{
id: "3", name: "Terrasse Extérieure", role: "Piscine & Terrasse - Namur", company: "2023", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/outdoor-swimming-pool_1203-2669.jpg?_wi=2", imageAlt: "Terrasse piscine extérieur namur belgique"},
{
id: "4", name: "Construction Neuve", role: "Maison moderne 150m² - Charleroi", company: "2023", rating: 5,
videoSrc: "https://www.youtube.com/embed/jNQXAC9IVRw?_wi=2", videoAriaLabel: "Vidéo construction maison neuve Charleroi"},
{
id: "5", name: "Rénovation Toiture", role: "Toiture complète - Anvers", company: "2023", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/man-working-outdoors-high-angle_23-2149714277.jpg?_wi=2", imageAlt: "rénovation toiture ardoise anvers belgique"},
{
id: "6", name: "Aménagement Extérieur", role: "Jardin paysager - Mons", company: "2023", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/table-chair-with-white-umbrella-outdoor-patio_74190-1917.jpg?_wi=2", imageAlt: "jardin paysager aménagement mons belgique"},
]}
gridVariant="three-columns-all-equal-width"
animationType="slide-up"
textboxLayout="default"
useInvertedBackground={false}
tagAnimation="slide-up"
/>
</div>
{/* Media Upload and Management Section */}
<div id="media-manager" data-section="media-manager">
{/* Media Upload Section */}
<div id="media-upload" data-section="media-upload">
<div className="w-full py-20 px-4 md:px-8">
<div className="max-w-6xl mx-auto">
<div className="max-w-7xl mx-auto">
{/* Header */}
<div className="text-center mb-16">
<div className="inline-flex items-center gap-2 mb-4 px-4 py-2 rounded-full bg-[var(--accent)] text-[var(--background)]">
<Upload size={16} />
<span className="text-sm font-medium">Gestion des Médias</span>
<Camera size={16} />
<span className="text-sm font-medium">Galerie Projets Complétés</span>
</div>
<h2 className="text-3xl md:text-5xl font-bold mb-4 text-[var(--foreground)]">
Galerie des Projets Réalisés
Photos & Vidéos de Nos Réalisations
</h2>
<p className="text-lg text-[var(--foreground)] opacity-75 max-w-2xl mx-auto">
Téléchargez et gérez les photos et vidéos de vos projets complétés. Présentez votre portefeuille aux clients potentiels.
Découvrez nos projets complétés en grand format. Visualisez la qualité de notre travail et les transformations que nous avons accomplies pour nos clients.
</p>
</div>
<div className="grid md:grid-cols-3 gap-8">
{/* Upload Section */}
<div className="md:col-span-1 space-y-6">
{/* Photo Upload */}
<div className="bg-[var(--card)] rounded-2xl p-8 border border-[var(--accent)] border-opacity-20">
<h3 className="text-lg font-bold mb-4 text-[var(--foreground)] flex items-center gap-2">
<Camera size={20} />
Télécharger des Photos
<div className="grid grid-cols-1 lg:grid-cols-3 gap-8">
{/* Upload Controls - Sidebar */}
<div className="lg:col-span-1 space-y-6">
{/* Upload Controls */}
<div className="bg-[var(--card)] rounded-3xl p-6 border border-[var(--accent)] border-opacity-20 shadow-lg space-y-4">
<h3 className="text-lg font-bold text-[var(--foreground)] flex items-center gap-2">
<Upload size={20} />
Ajouter Médias
</h3>
<label className="flex flex-col items-center justify-center w-full h-32 border-2 border-dashed border-[var(--accent)] border-opacity-40 rounded-lg cursor-pointer hover:border-opacity-60 transition-all">
<div className="flex flex-col items-center justify-center pt-5 pb-6">
<Upload size={24} className="text-[var(--primary-cta)] mb-2" />
<p className="text-sm text-[var(--foreground)] opacity-75 text-center">
Cliquez pour télécharger<br />
<span className="text-xs">(JPG, PNG, WebP)</span>
{/* Photo Upload */}
<label className="flex flex-col items-center justify-center w-full h-24 border-2 border-dashed border-[var(--accent)] border-opacity-40 rounded-xl cursor-pointer hover:border-opacity-60 transition-all bg-[var(--background)] bg-opacity-50">
<div className="flex flex-col items-center justify-center">
<Camera size={20} className="text-[var(--primary-cta)] mb-1" />
<p className="text-xs font-medium text-[var(--foreground)] text-center">
Ajouter Photos
</p>
</div>
<input
@@ -206,20 +179,13 @@ export default function PortfolioPage() {
aria-label="Télécharger des photos"
/>
</label>
</div>
{/* Video Upload */}
<div className="bg-[var(--card)] rounded-2xl p-8 border border-[var(--accent)] border-opacity-20">
<h3 className="text-lg font-bold mb-4 text-[var(--foreground)] flex items-center gap-2">
<Camera size={20} />
Télécharger des Vidéos
</h3>
<label className="flex flex-col items-center justify-center w-full h-32 border-2 border-dashed border-[var(--accent)] border-opacity-40 rounded-lg cursor-pointer hover:border-opacity-60 transition-all">
<div className="flex flex-col items-center justify-center pt-5 pb-6">
<Upload size={24} className="text-[var(--primary-cta)] mb-2" />
<p className="text-sm text-[var(--foreground)] opacity-75 text-center">
Cliquez pour télécharger<br />
<span className="text-xs">(MP4, WebM, OGG)</span>
{/* Video Upload */}
<label className="flex flex-col items-center justify-center w-full h-24 border-2 border-dashed border-[var(--accent)] border-opacity-40 rounded-xl cursor-pointer hover:border-opacity-60 transition-all bg-[var(--background)] bg-opacity-50">
<div className="flex flex-col items-center justify-center">
<Play size={20} className="text-[var(--primary-cta)] mb-1" />
<p className="text-xs font-medium text-[var(--foreground)] text-center">
Ajouter Vidéos
</p>
</div>
<input
@@ -231,79 +197,62 @@ export default function PortfolioPage() {
aria-label="Télécharger des vidéos"
/>
</label>
</div>
{/* Feedback Messages */}
{uploadError && (
<div className="bg-red-50 border border-red-200 rounded-lg p-4">
<p className="text-red-800 text-sm">{uploadError}</p>
</div>
)}
{uploadSuccess && (
<div className="bg-green-50 border border-green-200 rounded-lg p-4">
<p className="text-green-800 text-sm font-semibold"> Fichier uploadé avec succès!</p>
</div>
)}
</div>
{/* Media Gallery */}
<div className="md:col-span-2">
<div className="bg-[var(--card)] rounded-2xl p-8 border border-[var(--accent)] border-opacity-20">
<h3 className="text-2xl font-bold mb-6 text-[var(--foreground)]">
Galerie ({uploadedMedia.length})
</h3>
{uploadedMedia.length === 0 ? (
<div className="text-center py-12">
<Camera size={48} className="mx-auto text-[var(--accent)] opacity-30 mb-4" />
<p className="text-[var(--foreground)] opacity-60">
Aucun média téléchargé. Commencez par ajouter des photos ou des vidéos de vos projets.
</p>
{/* Feedback Messages */}
{uploadError && (
<div className="bg-red-50 border border-red-200 rounded-lg p-3">
<p className="text-red-800 text-xs">{uploadError}</p>
</div>
) : (
<div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
{uploadedMedia.map((media) => (
<div
key={media.id}
className="relative group rounded-lg overflow-hidden border border-[var(--accent)] border-opacity-20"
>
{media.type === "photo" ? (
<img
src={media.src}
alt={media.name}
className="w-full h-48 object-cover group-hover:scale-105 transition-transform duration-300"
/>
) : (
<video
src={media.src}
controls
className="w-full h-48 object-cover bg-black"
aria-label={media.name}
/>
)}
<div className="absolute inset-0 bg-black opacity-0 group-hover:opacity-40 transition-opacity duration-300" />
{/* Delete Button */}
<button
onClick={() => handleDeleteMedia(media.id)}
className="absolute top-2 right-2 p-2 bg-red-500 hover:bg-red-600 text-white rounded-lg opacity-0 group-hover:opacity-100 transition-opacity duration-300"
aria-label={`Supprimer ${media.name}`}
>
<Trash2 size={16} />
</button>
{/* File Info */}
<div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black to-transparent p-4 text-white opacity-0 group-hover:opacity-100 transition-opacity duration-300">
<p className="text-sm font-semibold truncate">{media.name}</p>
<p className="text-xs opacity-75">
{media.type === "photo" ? "Photo" : "Vidéo"}
</p>
</div>
</div>
))}
)}
{uploadSuccess && (
<div className="bg-green-50 border border-green-200 rounded-lg p-3">
<p className="text-green-800 text-xs font-semibold"> Uploadé avec succès!</p>
</div>
)}
</div>
{/* Media Count */}
<div className="bg-[var(--card)] rounded-3xl p-6 border border-[var(--accent)] border-opacity-20 shadow-lg">
<div className="text-center">
<p className="text-3xl font-bold text-[var(--primary-cta)] mb-2">
{uploadedMedia.length}
</p>
<p className="text-sm text-[var(--foreground)] opacity-60">
{uploadedMedia.length === 1 ? "Média" : "Médias"} ajoutés
</p>
{uploadedMedia.length > 0 && (
<p className="text-xs text-[var(--foreground)] opacity-40 mt-3">
{uploadedMedia.filter((m) => m.type === "photo").length}📷 {uploadedMedia.filter((m) => m.type === "video").length}🎥
</p>
)}
</div>
</div>
</div>
{/* Feature Card Gallery - Takes 2 columns */}
<div className="lg:col-span-2">
{featureItems.length > 0 ? (
<FeatureCardOne
features={featureItems}
title="Vos Réalisations"
description="Galerie complète de vos projets de construction et rénovation"
tag="Projets"
animationType="slide-up"
textboxLayout="default"
useInvertedBackground={false}
gridVariant="uniform-all-items-equal"
/>
) : (
<div className="bg-[var(--card)] rounded-3xl p-12 border border-[var(--accent)] border-opacity-20 shadow-lg text-center">
<Camera size={48} className="mx-auto text-[var(--accent)] opacity-20 mb-4" />
<p className="text-[var(--foreground)] opacity-60 text-lg">
Aucun média ajouté pour le moment
</p>
<p className="text-[var(--foreground)] opacity-40 text-sm mt-2">
Commencez à ajouter des photos et vidéos de vos projets ci-contre
</p>
</div>
)}
</div>
</div>
</div>

163
src/app/products/page.tsx Normal file
View File

@@ -0,0 +1,163 @@
"use client";
import Link from "next/link";
import { ThemeProvider } from "@/providers/themeProvider/ThemeProvider";
import NavbarStyleCentered from "@/components/navbar/NavbarStyleCentered/NavbarStyleCentered";
import HeroSplitDualMedia from "@/components/sections/hero/HeroSplitDualMedia";
import ProductCardOne from "@/components/sections/product/ProductCardOne";
import ContactText from "@/components/sections/contact/ContactText";
import FooterBaseCard from "@/components/sections/footer/FooterBaseCard";
import { Package, ShoppingCart } from "lucide-react";
export default function ProductsPage() {
const navItems = [
{ name: "Accueil", id: "/" },
{ name: "Services", id: "/services" },
{ name: "Produits", id: "/products" },
{ name: "Réalisations", id: "/portfolio" },
{ name: "À propos", id: "/about" },
{ name: "Contact", id: "/contact" },
];
const footerColumns = [
{
title: "Services", items: [
{ label: "Rénovation", href: "/services" },
{ label: "Construction", href: "/services" },
{ label: "Maçonnerie", href: "/services" },
{ label: "Toiture", href: "/services" },
],
},
{
title: "Entreprise", items: [
{ label: "À propos", href: "/about" },
{ label: "Nos Réalisations", href: "/portfolio" },
{ label: "Avis Clients", href: "/" },
{ label: "Contactez-nous", href: "/contact" },
],
},
{
title: "Contact", items: [
{ label: "Téléphone: +32 (0) 2 123 45 67", href: "tel:+32212345678" },
{ label: "Email: info@webild.be", href: "mailto:info@webild.be" },
{ label: "Belgique", href: "#" },
{ label: "WhatsApp", href: "https://wa.me/32212345678" },
],
},
{
title: "Légal", items: [
{ label: "Politique de Confidentialité", href: "#" },
{ label: "Conditions d'Utilisation", href: "#" },
{ label: "Mentions Légales", href: "#" },
],
},
];
return (
<ThemeProvider
defaultButtonVariant="directional-hover"
defaultTextAnimation="background-highlight"
borderRadius="pill"
contentWidth="medium"
sizing="largeSmall"
background="circleGradient"
cardStyle="inset"
primaryButtonStyle="flat"
secondaryButtonStyle="glass"
headingFontWeight="extrabold"
>
{/* Navbar */}
<div id="nav" data-section="nav">
<NavbarStyleCentered
navItems={navItems}
button={{
text: "Demander un devis", href: "/contact"}}
brandName="Webild Construction"
/>
</div>
{/* Products Hero Section */}
<div id="hero" data-section="hero">
<HeroSplitDualMedia
tag="Nos Produits"
tagIcon={Package}
title="Produits et Matériaux de Construction de Qualité"
description="Découvrez notre sélection complète de produits et matériaux de construction. Nous proposons uniquement des produits de qualité supérieure pour garantir l'excellence de vos projets."
background={{ variant: "plain" }}
mediaItems={[
{
imageSrc: "http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=3", imageAlt: "Matériaux de construction professionnels"},
{
imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=3", imageAlt: "Produits de qualité premium"},
]}
rating={5}
ratingText="Produits certifiés et garantis"
buttons={[
{
text: "Parcourir les Produits", href: "#products"},
{
text: "Commander Maintenant", href: "#contact"},
]}
tagAnimation="slide-up"
buttonAnimation="slide-up"
mediaAnimation="slide-up"
/>
</div>
{/* Products Section */}
<div id="products" data-section="products">
<ProductCardOne
title="Notre Catalogue de Produits"
description="Une gamme complète de matériaux et produits pour tous vos projets de construction et rénovation."
tag="Produits Disponibles"
tagIcon={ShoppingCart}
products={[
{
id: "1", name: "Ciment Portland Premium", price: "45€/sac", imageSrc: "http://img.b2bpic.net/free-photo/unfinished-brick-structure-with-view-lush-greenery_632498-60860.jpg?_wi=1", imageAlt: "Ciment de qualité professionnelle"},
{
id: "2", name: "Briques de Construction", price: "0.80€/pièce", imageSrc: "http://img.b2bpic.net/free-photo/vintage-architecture-classical-facade-building_158595-6439.jpg?_wi=1", imageAlt: "Briques rouges standard"},
{
id: "3", name: "Acier de Renforcement", price: "800€/tonne", imageSrc: "http://img.b2bpic.net/free-photo/long-shot-men-working-roof_23-2149343678.jpg?_wi=1", imageAlt: "Barres d'acier renforcé"},
{
id: "4", name: "Tuiles de Toiture", price: "25€/m²", imageSrc: "http://img.b2bpic.net/free-photo/man-with-helmet-sitting-roof-full-shot_23-2149343712.jpg?_wi=1", imageAlt: "Tuiles en céramique"},
{
id: "5", name: "Mortier de Joint", price: "12€/sac", imageSrc: "http://img.b2bpic.net/free-photo/empty-table-chair-dining-set-nearly-sea-ocean-beach-white-cloud-blue-sky_74190-9983.jpg?_wi=1", imageAlt: "Mortier professionnel"},
{
id: "6", name: "Peinture Façade", price: "35€/litre", imageSrc: "http://img.b2bpic.net/free-photo/side-view-family-sitting-table_23-2150231683.jpg?_wi=1", imageAlt: "Peinture résistante aux intempéries"},
]}
gridVariant="three-columns-all-equal-width"
animationType="slide-up"
textboxLayout="default"
useInvertedBackground={false}
tagAnimation="slide-up"
buttonAnimation="slide-up"
/>
</div>
{/* CTA Section */}
<div id="cta" data-section="cta">
<ContactText
text="Intéressé par nos produits? Contactez notre équipe commerciale pour des devis personnalisés et des conditions spéciales pour les gros volumes."
animationType="entrance-slide"
background={{ variant: "plain" }}
useInvertedBackground={false}
buttons={[
{
text: "Demander un Devis", href: "/contact"},
{
text: "Nous Appeler", href: "tel:+32123456789"},
]}
/>
</div>
{/* Footer */}
<div id="footer" data-section="footer">
<FooterBaseCard
logoText="Webild Construction"
columns={footerColumns}
copyrightText="© 2024 Webild Construction. Tous droits réservés."
/>
</div>
</ThemeProvider>
);
}