Merge version_1 into main #2

Merged
bender merged 2 commits from version_1 into main 2026-03-11 15:27:55 +00:00
2 changed files with 54 additions and 125 deletions

View File

@@ -20,8 +20,7 @@ export default function RealizationsPage() {
const footerColumns = [
{
title: "Entreprise",
items: [
title: "Entreprise", items: [
{ label: "À Propos", href: "/about" },
{ label: "Services", href: "/services" },
{ label: "Réalisations", href: "/realizations" },
@@ -29,8 +28,7 @@ export default function RealizationsPage() {
],
},
{
title: "Services",
items: [
title: "Services", items: [
{ label: "Terrassement", href: "/services" },
{ label: "Aménagement Extérieur", href: "/services" },
{ label: "Béton Désactivé", href: "/services" },
@@ -38,8 +36,7 @@ export default function RealizationsPage() {
],
},
{
title: "Contact",
items: [
title: "Contact", items: [
{ label: "Téléphone", href: "#" },
{ label: "Email", href: "#" },
{ label: "Annecy, Haute-Savoie", href: "#" },
@@ -69,9 +66,7 @@ export default function RealizationsPage() {
id: item.id,
}))}
button={{
text: "Devis Gratuit",
href: "/contact",
}}
text: "Devis Gratuit", href: "/contact"}}
/>
</div>
@@ -82,47 +77,17 @@ export default function RealizationsPage() {
tag="Portfolio"
products={[
{
id: "terrasse-01",
name: "Terrasse Béton Haut de Gamme",
price: "Annecy",
imageSrc: "http://img.b2bpic.net/free-photo/exterior-modern-buildings_1112-1995.jpg?_wi=3",
imageAlt: "Terrasse béton finition premium",
},
id: "terrasse-01", name: "Terrasse Béton Haut de Gamme", price: "Annecy", imageSrc: "http://img.b2bpic.net/free-photo/exterior-modern-buildings_1112-1995.jpg", imageAlt: "Terrasse béton finition premium"},
{
id: "allees-01",
name: "Allées Pavées Accès Maison",
price: "Cran-Gevrier",
imageSrc: "http://img.b2bpic.net/free-photo/bike-ride-sunset_1137-245.jpg?_wi=3",
imageAlt: "Allées pavées professionnelles",
},
id: "allees-01", name: "Allées Pavées Accès Maison", price: "Cran-Gevrier", imageSrc: "http://img.b2bpic.net/free-photo/bike-ride-sunset_1137-245.jpg", imageAlt: "Allées pavées professionnelles"},
{
id: "beton-01",
name: "Béton Désactivé Moderne",
price: "Meythet",
imageSrc: "http://img.b2bpic.net/free-photo/colorful-pebbles-surface_23-2148978398.jpg?_wi=3",
imageAlt: "Béton désactivé finition propre",
},
id: "beton-01", name: "Béton Désactivé Moderne", price: "Meythet", imageSrc: "http://img.b2bpic.net/free-photo/colorful-pebbles-surface_23-2148978398.jpg", imageAlt: "Béton désactivé finition propre"},
{
id: "murets-01",
name: "Murets Maçonnerie Paysagère",
price: "Seynod",
imageSrc: "http://img.b2bpic.net/free-photo/high-angle-shot-empty-park-with-blooming-green-trees-walls_181624-19632.jpg?_wi=2",
imageAlt: "Murets de soutènement",
},
id: "murets-01", name: "Murets Maçonnerie Paysagère", price: "Seynod", imageSrc: "http://img.b2bpic.net/free-photo/high-angle-shot-empty-park-with-blooming-green-trees-walls_181624-19632.jpg", imageAlt: "Murets de soutènement"},
{
id: "cours-01",
name: "Aménagement Complet Cour",
price: "Pringy",
imageSrc: "http://img.b2bpic.net/free-photo/long-corridor-showcase_1127-3442.jpg?_wi=2",
imageAlt: "Aménagement extérieur complet",
},
id: "cours-01", name: "Aménagement Complet Cour", price: "Pringy", imageSrc: "http://img.b2bpic.net/free-photo/long-corridor-showcase_1127-3442.jpg", imageAlt: "Aménagement extérieur complet"},
{
id: "terrain-01",
name: "Préparation Terrain Extension",
price: "Annecy-le-Vieux",
imageSrc: "http://img.b2bpic.net/free-photo/construction-site-with-barrow-filled-with-tools_23-2148254079.jpg?_wi=2",
imageAlt: "Préparation terrain professionnelle",
},
id: "terrain-01", name: "Préparation Terrain Extension", price: "Annecy-le-Vieux", imageSrc: "http://img.b2bpic.net/free-photo/construction-site-with-barrow-filled-with-tools_23-2148254079.jpg", imageAlt: "Préparation terrain professionnelle"},
]}
gridVariant="three-columns-all-equal-width"
animationType="slide-up"
@@ -137,26 +102,15 @@ export default function RealizationsPage() {
tag="Performance"
metrics={[
{
id: "1",
value: "5/5",
description: "Note moyenne Google reviews - Avis clients vérifiés et récents",
},
id: "1", value: "5/5", description: "Note moyenne Google reviews - Avis clients vérifiés et récents"},
{
id: "2",
value: "+100",
description: "Projets réussis depuis 2021 - Terrasses, allées, aménagements",
},
id: "2", value: "+100", description: "Projets réussis depuis 2021 - Terrasses, allées, aménagements"},
{
id: "3",
value: "2021",
description: "Création de l'entreprise - Expertise en croissance continue",
},
id: "3", value: "2021", description: "Création de l'entreprise - Expertise en croissance continue"},
{
id: "4",
value: "Annecy",
description: "Base locale Haute-Savoie - Interventions région Annecy et alentours",
},
id: "4", value: "Annecy", description: "Base locale Haute-Savoie - Interventions région Annecy et alentours"},
]}
metricsAnimation="slide-up"
useInvertedBackground={false}
/>
</div>
@@ -169,51 +123,27 @@ export default function RealizationsPage() {
showRating={true}
testimonials={[
{
id: "1",
name: "Marie Dubois",
handle: "@marie_d",
testimonial: "Travail exceptionnel sur notre terrasse béton. Équipe très professionnelle, chantier propre, et finitions impeccables. Vraiment satisfaits !",
rating: 5,
id: "1", name: "Marie Dubois", handle: "@marie_d", testimonial: "Travail exceptionnel sur notre terrasse béton. Équipe très professionnelle, chantier propre, et finitions impeccables. Vraiment satisfaits !", rating: 5,
icon: User,
},
{
id: "2",
name: "Jean-Paul Martin",
handle: "@jp_martin",
testimonial: "Excellente communication du début à la fin. Les délais ont été respectés, le travail est soigné. Je recommande vivement A2P.",
rating: 5,
id: "2", name: "Jean-Paul Martin", handle: "@jp_martin", testimonial: "Excellente communication du début à la fin. Les délais ont été respectés, le travail est soigné. Je recommande vivement A2P.", rating: 5,
icon: User,
},
{
id: "3",
name: "Sophie Laurent",
handle: "@sophie_l",
testimonial: "Équipe sympathique et très compétente. Nos allées pavées sont magnifiques. Merci pour les bons conseils tout au long du projet !",
rating: 5,
id: "3", name: "Sophie Laurent", handle: "@sophie_l", testimonial: "Équipe sympathique et très compétente. Nos allées pavées sont magnifiques. Merci pour les bons conseils tout au long du projet !", rating: 5,
icon: User,
},
{
id: "4",
name: "Michel Arnould",
handle: "@m_arnould",
testimonial: "Entreprise sérieuse et à taille humaine. Le béton désactivé est parfait. Personnel courtois et professionnel. Hautement recommandé.",
rating: 5,
id: "4", name: "Michel Arnould", handle: "@m_arnould", testimonial: "Entreprise sérieuse et à taille humaine. Le béton désactivé est parfait. Personnel courtois et professionnel. Hautement recommandé.", rating: 5,
icon: User,
},
{
id: "5",
name: "Valérie Rousseau",
handle: "@val_rousseau",
testimonial: "Impressionnée par la qualité du travail et la propreté du chantier. Équipe ponctuelle et efficace. A2P, c'est du sérieux !",
rating: 5,
id: "5", name: "Valérie Rousseau", handle: "@val_rousseau", testimonial: "Impressionnée par la qualité du travail et la propreté du chantier. Équipe ponctuelle et efficace. A2P, c'est du sérieux !", rating: 5,
icon: User,
},
{
id: "6",
name: "Philippe Gillet",
handle: "@p_gillet",
testimonial: "Devis détaillé, conseils de qualité, et exécution impeccable. Notre cours est transformée. Merci pour cette belle réalisation !",
rating: 5,
id: "6", name: "Philippe Gillet", handle: "@p_gillet", testimonial: "Devis détaillé, conseils de qualité, et exécution impeccable. Notre cours est transformée. Merci pour cette belle réalisation !", rating: 5,
icon: User,
},
]}

View File

@@ -1,51 +1,50 @@
"use client";
import { memo } from "react";
import useSvgTextLogo from "./useSvgTextLogo";
import { cls } from "@/lib/utils";
import React from 'react';
interface SvgTextLogoProps {
logoText: string;
adjustHeightFactor?: number;
verticalAlign?: "top" | "center";
text: string;
className?: string;
textClassName?: string;
fontSize?: number;
fontWeight?: number | string;
fontFamily?: string;
fill?: string;
}
const SvgTextLogo = memo<SvgTextLogoProps>(function SvgTextLogo({
logoText,
adjustHeightFactor,
verticalAlign = "top",
className = "",
}) {
const { svgRef, textRef, viewBox, aspectRatio } = useSvgTextLogo(logoText, false, adjustHeightFactor);
const SvgTextLogo: React.FC<SvgTextLogoProps> = ({
text,
className = '',
textClassName = '',
fontSize = 24,
fontWeight = 'bold',
fontFamily = 'system-ui, -apple-system, sans-serif',
fill = 'currentColor',
}) => {
const estimatedWidth = text.length * (fontSize as number) * 0.6;
const estimatedHeight = (fontSize as number) * 1.2;
return (
<svg
ref={svgRef}
viewBox={viewBox}
className={cls("w-full", className)}
style={{ aspectRatio: aspectRatio }}
preserveAspectRatio="none"
width={estimatedWidth}
height={estimatedHeight}
viewBox={`0 0 ${estimatedWidth} ${estimatedHeight}`}
className={className}
role="img"
aria-label={`${logoText} logo`}
aria-label={text}
>
<text
ref={textRef}
x="0"
y={verticalAlign === "center" ? "50%" : "0"}
className="font-bold fill-current"
style={{
fontSize: "20px",
letterSpacing: "-0.02em",
dominantBaseline: verticalAlign === "center" ? "middle" : "text-before-edge"
}}
y={fontSize}
className={textClassName}
fontSize={fontSize}
fontWeight={fontWeight}
fontFamily={fontFamily}
fill={fill}
dominantBaseline="hanging"
>
{logoText}
{text}
</text>
</svg>
);
});
};
SvgTextLogo.displayName = "SvgTextLogo";
export default SvgTextLogo;
export default SvgTextLogo;