Merge version_1 into main #2
@@ -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,
|
||||
},
|
||||
]}
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user