1.01 audrey's edits
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 46s

This commit is contained in:
2026-03-28 15:37:45 -04:00
parent 539e537572
commit 067a151be1
29 changed files with 53 additions and 67 deletions

View File

@@ -27,7 +27,7 @@ export default function Header({
<div className="flex lg:flex-1">
<a
href="/"
className="flex items-center justify-center bg-[white] rounded-full shadow-md p-2"
className="flex items-center justify-center bg-[white] rounded-full shadow-md p-2 lg:translate-y-1.5"
>
<div className="rounded-full ">
<span className="sr-only">{general.siteName}</span>
@@ -70,21 +70,21 @@ export default function Header({
{ctaLabel}
</a> */}
<motion.dl
className="flex gap-x-2 items-center justify-center text-xl font-semibold bg-white rounded-full p-2"
className="m-0 inline-flex items-center gap-1.5 rounded-full bg-white px-3 py-2 text-xl font-semibold font-[family-name:var(--font-body)]"
whileHover={{ scale: 1.05 }}
transition={{ type: "spring", stiffness: 400, damping: 25 }}
>
<dt className="flex-none">
<dt className="m-0 flex shrink-0 items-center">
<span className="sr-only">Telephone</span>
<PhoneIcon
aria-hidden="true"
className="h-8 w-8 text-brand-600 "
className="h-8 w-8 text-brand-600"
/>
</dt>
<dd>
<dd className="m-0 flex min-w-0 items-center justify-center">
<a
href={phoneHref}
className="text-brand-600 hover:text-brand-700 "
className="whitespace-nowrap tabular-nums tracking-tight text-brand-600 hover:text-brand-700"
>
{general.phone}
</a>

View File

@@ -44,11 +44,11 @@ export default function WithAlternatingSections({
<div className="mx-auto max-w-3xl text-center">
<motion.h2
{...fadeUp}
className="text-4xl font-bold tracking-tight text-brand-600 sm:text-5xl"
className="text-4xl font-bold tracking-tight text-brand-600 sm:text-5xl lg:text-4xl"
>
{title}
</motion.h2>
<motion.p {...fadeUp} className="mt-4 text-lg text-brand-500">
<motion.p {...fadeUp} className="mt-4 text-lg text-brand-500 lg:text-base">
{subtitle}
</motion.p>
</div>
@@ -67,11 +67,11 @@ export default function WithAlternatingSections({
>
<motion.h3
{...fadeUp}
className="text-4xl font-semibold tracking-tight text-brand-600"
className="text-4xl font-semibold tracking-tight text-brand-600 lg:text-3xl"
>
{feature.name}
</motion.h3>
<motion.p {...fadeUp} className="mt-2 text-base text-brand-800">
<motion.p {...fadeUp} className="mt-2 text-base text-brand-800 lg:text-[0.9375rem] lg:leading-relaxed font-[family-name:var(--font-body)]">
{feature.description}
</motion.p>
</div>

View File

@@ -84,7 +84,7 @@ export default function Grid({ sectionLabel, title, items }: Props) {
</motion.h2>
<motion.p
{...fadeUp(0.1)}
className="mt-2 text-4xl font-semibold tracking-tight text-balance text-brand-600 sm:text-5xl dark:text-white"
className="mt-2 text-4xl font-semibold tracking-tight text-balance text-brand-600 sm:text-5xl lg:text-4xl dark:text-white"
>
{title}
</motion.p>

View File

@@ -75,7 +75,7 @@ export default function WithTieredImages({
</motion.h2>
<motion.p
{...fadeUp(0.1)}
className="mt-2 text-4xl font-bold tracking-tight text-white sm:text-5xl"
className="mt-2 text-4xl font-bold tracking-tight text-white sm:text-5xl lg:text-4xl"
>
{subtitle}
</motion.p>
@@ -121,8 +121,8 @@ export default function WithTieredImages({
</svg>
</div>
<div>
<dt className="text-base font-medium text-white">{card.title}</dt>
<dd className="mt-3 text-base text-white/90">{card.description}</dd>
<dt className="text-base font-medium text-white lg:text-[0.9375rem]">{card.title}</dt>
<dd className="mt-3 text-base text-white/90 lg:text-[0.9375rem] lg:leading-relaxed font-[family-name:var(--font-body)]">{card.description}</dd>
</div>
</motion.div>
))}

View File

@@ -47,7 +47,7 @@ const structuredData = {
email: general.email,
address: {
'@type': 'PostalAddress',
addressLocality: 'Laval',
addressLocality: 'Sainte-Catherine',
addressRegion: 'QC',
addressCountry: 'CA',
},

View File

@@ -53,11 +53,11 @@ export default function FullWidthWithBackgroundImageAndLargeContent({
<motion.h2
{...fadeUp(0)}
id="cta-heading"
className="text-3xl font-bold tracking-tight text-brand-50 sm:text-4xl lg:text-5xl"
className="text-3xl font-bold tracking-tight text-brand-50 sm:text-4xl lg:text-4xl"
>
{title}
</motion.h2>
<motion.p {...fadeUp(0.1)} className="mt-4 text-lg text-brand-50/95 sm:text-xl">
<motion.p {...fadeUp(0.1)} className="mt-4 text-lg text-brand-50/95 sm:text-xl lg:text-lg font-[family-name:var(--font-body)]">
{subtitle}
</motion.p>
<motion.a

View File

@@ -21,7 +21,6 @@ type Props = {
navTitle: string;
contactTitle: string;
rbq: string;
neq: string;
};
navLinks: NavLink[];
legalNotice: string;
@@ -302,10 +301,8 @@ export default function FooterAnimated({
MBCube Consulting
</motion.a>
</motion.p>
<p className="flex items-center gap-2.5 text-xs tracking-[0.02em] text-white/40">
<p className="text-xs tracking-[0.02em] text-white/40">
<span>{footer.rbq}</span>
<span aria-hidden="true">·</span>
<span>{footer.neq}</span>
</p>
</div>
</motion.div>

View File

@@ -49,7 +49,7 @@ export default function Hero({ content }: { content: HeroContent }) {
return (
<div className="bg-white dark:bg-gray-900">
<div className="relative isolate overflow-hidden h-screen min-h-[600px]">
<div className="relative isolate overflow-hidden h-screen min-h-[800px]">
<Carousel
className="absolute inset-0 -z-10 size-full [&_[data-slot='carousel-content']]:h-full"
opts={{ loop: true, dragFree: false }}
@@ -63,22 +63,15 @@ export default function Hero({ content }: { content: HeroContent }) {
alt={slide.alt}
className="size-full object-cover"
/>
<div className="absolute inset-0 bg-black/50" />
<div className="absolute inset-0 bg-gradient-to-b from-black/00 via-black/35 to-black/60" />
</CarouselItem>
))}
</CarouselContent>
</Carousel>
<div className="relative z-10 mx-auto max-w-7xl px-6 lg:px-8 h-full flex items-center justify-center pt-14">
<div className="mx-auto max-w-4xl text-center">
<div className="mx-auto max-w-4xl text-center lg:mt-20">
<div className="relative rounded-lg px-6 py-2">
<motion.div
className="absolute inset-0 rounded-lg bg-brand-50"
initial={{ opacity: 0, scaleY: 0 }}
animate={{ opacity: 1, scaleY: 1 }}
style={{ originY: "50%" }}
transition={{ delay: 0.85, duration: 1, ease: [0.22, 1, 0.36, 1] }}
/>
<svg
className="relative"
viewBox="0 0 1390 500"
@@ -89,7 +82,8 @@ export default function Hero({ content }: { content: HeroContent }) {
y="312"
fontFamily="Cocogoose"
fontSize="350"
className="fill-brand-600"
className="fill-brand-600
[text-shadow:0_1px_0_white,0_-1px_0_white,1px_0_0_white,-1px_0_0_white,1px_1px_0_white,-1px_-1px_0_white,1px_-1px_0_white,-1px_1px_0_white]"
{...fadeUp(1.05)}
>
CACHET
@@ -98,7 +92,8 @@ export default function Hero({ content }: { content: HeroContent }) {
id="Rectangle"
fill="#b0b0ac"
fillRule="evenodd"
stroke="none"
stroke="white"
strokeWidth="2"
d="M 228 360 L 1161 360 L 1161 334 L 228 334 Z"
initial={{ scaleX: 0 }}
animate={{ scaleX: 1 }}
@@ -119,9 +114,8 @@ export default function Hero({ content }: { content: HeroContent }) {
fontFamily="Geoform"
fontSize="72"
fontWeight="700"
className="fill-graphite-600"
className="fill-graphite-600 [text-shadow:0_1px_0_white,0_-1px_0_white,1px_0_0_white,-1px_0_0_white,1px_1px_0_white,-1px_-1px_0_white,1px_-1px_0_white,-1px_1px_0_white]"
{...fadeUp(1.05)}
>
PEINTRES DECORATEURS
</motion.text>
@@ -130,7 +124,7 @@ export default function Hero({ content }: { content: HeroContent }) {
<motion.p
{...fadeUp(1.15)}
className="p-4 mt-8 text-lg font-medium text-pretty text-white sm:text-xl/8 lg:text-2xl/8"
className="p-4 text-lg font-medium font-[family-name:var(--font-body)] text-pretty text-white sm:text-xl/8 lg:text-2xl/8"
>
{subtitle}
</motion.p>

View File

@@ -44,13 +44,13 @@ const fadeUp = (delay: number) => ({
<motion.h2
{...fadeUp(0.15)}
id="sale-heading"
className="text-4xl font-bold tracking-tight text-white sm:text-5xl lg:text-6xl"
className="text-4xl font-bold tracking-tight text-white sm:text-5xl lg:text-5xl"
>
{title}
</motion.h2>
<motion.p
{...fadeUp(0.3)}
className="mx-auto mt-4 max-w-xl text-xl text-white"
className="mx-auto mt-4 max-w-xl text-xl text-white lg:text-xl font-[family-name:var(--font-body)]"
>
{subtitle}
</motion.p>

View File

@@ -88,7 +88,7 @@ const contact = defineCollection({
}),
breadcrumbHome: z.string(),
rbq: z.string(),
neq: z.string(),
neq: z.string().optional(),
}),
});
@@ -164,7 +164,7 @@ const footer = defineCollection({
serviceAreasTitle: z.string(),
legal: z.string(),
rbq: z.string(),
neq: z.string(),
neq: z.string().optional(),
facebookLabel: z.string(),
serviceLinks: z.array(
z.object({

View File

@@ -15,7 +15,7 @@
"facebookCta": "Suivez-nous sur Facebook",
"map": {
"title": "Notre territoire de service",
"region": "Laval & Rive-Nord, Québec",
"region": "Rive Sud & Grand Montréal, Québec",
"mapsButton": "Voir sur Google Maps"
},
"ctaCard": {
@@ -24,6 +24,5 @@
"button": "Soumission gratuite"
},
"breadcrumbHome": "Accueil",
"rbq": "RBQ : ",
"neq": "NEQ : "
"rbq": "RBQ : "
}

View File

@@ -4,9 +4,8 @@
"servicesTitle": "Nos services",
"contactTitle": "Contact",
"serviceAreasTitle": "Zone de service",
"legal": "© {year} 9500-5609 Québec Inc. Tous droits réservés.",
"legal": "© {year} CACHETDECO. Tous droits réservés.",
"rbq": "RBQ : 5839 8736 01",
"neq": "NEQ : 9500-5609",
"facebookLabel": "Facebook",
"serviceLinks": [
{ "label": "Peinture intérieure", "href": "/#services" },

View File

@@ -1,7 +1,7 @@
{
"title": "CACHET",
"title2": "PEINTRES DÉCORATEURS",
"subtitle": "Travaux de peinture résidentielle et commerciale, décoration intérieure et extérieure. Qualité professionnelle sur la Rive-Nord et Laval.",
"subtitle": "Travaux de peinture résidentielle et commerciale pour l'intérieur et l'extérieur. Qualité professionnelle dans le Grand Montréal et sur la Rive Sud.",
"cta": "Contactez-nous",
"ctaHref": "/contact"
}

View File

@@ -25,7 +25,7 @@
{
"icon": "location",
"title": "Localisation",
"description": "Nous sommes situés à Laval et sur la Rive-Nord. Nous pouvons vous accompagner dans vos projets de peinture et décoration."
"description": "Nous sommes situés sur la Rive Sud et dans le Grand Montréal. Nous pouvons vous accompagner dans vos projets de peinture et décoration."
},
{
"icon": "star",

View File

@@ -1,5 +1,5 @@
---
title: Commerciale
title: Peinture commerciale
description: Solutions de peinture adaptées aux besoins des bureaux, des commerces et des institutions. Nos partenaires certifiés par la Commission de la Construction du Québec seront là pour vous guider dans un large éventail de projets.
icon: commercial
order: 3

View File

@@ -1,5 +1,5 @@
---
title: Extérieure
title: Peinture extérieure
description: Préservez et embellissez vos espaces extérieurs! Réfection d'espaces extérieurs tels que les terrasses, les balcons, les rambardes, les rampes et les garde-corps. Des travaux qui peuvent résister aux conditions climatiques du Québec pour une durabilité maximale.
icon: exterior
order: 2

View File

@@ -1,5 +1,5 @@
---
title: Intérieure
title: Peinture intérieure
description: Réaménagement complet de votre espace intérieur. Nous nous chargeons de préparer les surfaces, d'appliquer soigneusement et de finaliser de manière impeccable tous les types de pièces.
icon: interior
order: 1

View File

@@ -1,7 +1,7 @@
{
"brandName": "Cachet",
"siteName": "Cachet Peintres Décorateurs",
"legalName": "9500-5609 Québec Inc",
"legalName": "CACHETDECO",
"tagline": "Peintres Décorateurs professionnels",
"taglineHero": "Qualité et expertise en peinture résidentielle et commerciale",
"phone": "(514) 552-1049",
@@ -11,11 +11,10 @@
"fromAddressSubmission": "Cachet Peintres Décorateurs <notifications@mbcubeconsulting.ca>",
"toAddressSubmission": "mouad@mbcubeconsulting.ca",
"address": "Sainte Catherine, Québec",
"serviceArea": "Rive sud et Le Grand Montréal",
"serviceArea": "Rive Sud et Grand Montréal",
"facebook": "https://www.facebook.com/cachetdecor/",
"instagram": "https://www.instagram.com/cachet.deco/",
"linkedin": "",
"rbq": "5839 8736 01",
"neq": "9500-5609",
"carouselDelay": 2500
"carouselDelay": 4000
}

View File

@@ -1,8 +1,8 @@
{
"defaultTitle": "Cachet Peintres Décorateurs | Rive sud et Le Grand Montréal",
"defaultTitle": "Cachet Peintres Décorateurs | Rive Sud et Grand Montréal",
"titleTemplate": "%s | Cachet Peintres Décorateurs",
"defaultDescription": "Peintres décorateurs professionnels à Rive sud et Le Grand Montréal. Peinture résidentielle et commerciale, décoration intérieure et extérieure. RBQ 5839 8736 01. Soumission gratuite.",
"keywords": "peintre Rive sud, peintre Montréal, peinture résidentielle Rive sud, peinture résidentielle Montréal, peinture commerciale Rive sud, peinture commerciale Montréal, décoration intérieure Rive sud, décoration intérieure Montréal, peintres décorateurs Rive sud, peintres décorateurs Montréal, peinture extérieure Rive sud, peinture extérieure Montréal, rénovation Rive sud, rénovation Montréal, soumission peinture gratuite Rive sud, soumission peinture gratuite Montréal",
"defaultDescription": "Peintres décorateurs professionnels sur la Rive Sud et dans le Grand Montréal. Peinture résidentielle et commerciale, intérieur et extérieur. RBQ 5839 8736 01. Soumission gratuite.",
"keywords": "peintre Rive Sud, peintre Grand Montréal, peinture résidentielle Rive Sud, peinture résidentielle Montréal, peinture commerciale Rive Sud, peinture commerciale Montréal, peintres décorateurs Rive Sud, peintres décorateurs Montréal, peinture extérieure Rive Sud, peinture extérieure Montréal, rénovation Rive Sud, rénovation Montréal, soumission peinture gratuite Rive Sud, soumission peinture gratuite Montréal",
"ogImage": "/images/logo-full.webp",
"twitterCard": "summary_large_image"
}

View File

@@ -11,7 +11,7 @@
"phoneLabel": "Téléphone",
"phonePlaceholder": "(450) 555-1234",
"workAddressLabel": "Adresse des travaux",
"workAddressPlaceholder": "123 rue Principale, Laval, QC",
"workAddressPlaceholder": "123 rue Principale, Sainte-Catherine, QC",
"serviceTypeLabel": "Type de service",
"serviceTypePlaceholder": "Sélectionnez un service",
"serviceTypeOptions": {

View File

@@ -63,7 +63,7 @@ function buildContactNotificationHtml(data: ContactBody): string {
</div>
</div>
<p style="margin:24px 0 0;text-align:center;font-size:11px;color:#999">
Cachet Peintres Décorateurs · 9500-5609 Québec Inc · RBQ 5839 8736 01
Cachet Peintres Décorateurs · CACHETDECO · RBQ 5839 8736 01
</p>
</div>
</body>

View File

@@ -137,7 +137,7 @@ function buildNotificationHtml(data: SubmissionPayload, attachmentNames: string[
</div>
</div>
<p style="margin:24px 0 0;text-align:center;font-size:11px;color:#999">
Cachet Peintres Décorateurs · 9500-5609 Québec Inc · RBQ 5839 8736 01
Cachet Peintres Décorateurs · RBQ 5839 8736 01
</p>
</div>
</body>

View File

@@ -16,7 +16,7 @@ const contact = contactEntry.data;
<Layout
title={contact.title}
description={`Contactez Cachet Peintres Décorateurs — ${general.phone} — ${general.email}. Nous servons Laval, la Rive-Nord et les environs.`}
description={`Contactez Cachet Peintres Décorateurs — ${general.phone} — ${general.email}. Nous servons la Rive Sud, le Grand Montréal et les environs.`}
canonical="/contact"
>
<ShortHero

View File

@@ -82,7 +82,7 @@ const heroContent = {
<Layout
title={seo.defaultTitle}
description={`${general.siteName} — Peintres décorateurs professionnels à Laval et sur la Rive-Nord. Peinture résidentielle et commerciale, décoration intérieure et extérieure. Soumission gratuite.`}
description={`${general.siteName} — Peintres décorateurs professionnels sur la Rive Sud et dans le Grand Montréal. Peinture résidentielle et commerciale, intérieur et extérieur. Soumission gratuite.`}
canonical="/"
>
<Hero client:load content={heroContent} />

View File

@@ -16,7 +16,7 @@ const submissionPage = submissionEntry.data;
<Layout
title={submissionPage.title}
description={`Contactez Cachet Peintres Décorateurs — ${general.phone} — ${general.email}. Nous servons Laval, la Rive-Nord et les environs.`}
description={`Contactez Cachet Peintres Décorateurs — ${general.phone} — ${general.email}. Nous servons la Rive Sud, le Grand Montréal et les environs.`}
canonical="/submission"
>
<ShortHero

View File

@@ -1,7 +1,6 @@
@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
@import "@fontsource-variable/geist";
@custom-variant dark (&:is(.dark *));
@@ -187,7 +186,7 @@
}
@theme inline {
--font-sans: 'Geist Variable', sans-serif;
--font-sans: 'Cocogoose', sans-serif;
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);