157
package-lock.json
generated
@@ -27,6 +27,7 @@
|
||||
"react": "^19.2.4",
|
||||
"react-dom": "^19.2.4",
|
||||
"react-hook-form": "^7.72.0",
|
||||
"react-social-media-embed": "^2.5.18",
|
||||
"shadcn": "^4.0.5",
|
||||
"tailwind-merge": "^3.5.0",
|
||||
"tailwindcss": "^4.2.1",
|
||||
@@ -4684,6 +4685,12 @@
|
||||
"integrity": "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/youtube-player": {
|
||||
"version": "5.5.11",
|
||||
"resolved": "https://registry.npmjs.org/@types/youtube-player/-/youtube-player-5.5.11.tgz",
|
||||
"integrity": "sha512-pM41CDBqJqBmTeJWnF7NOGz82IQoYOhqzMYXv5vKCXBqGiYSLldxMtpCk6KAEtADTy49S45AriYaCaZyeUX38Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@ungap/structured-clone": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
|
||||
@@ -5258,6 +5265,12 @@
|
||||
"url": "https://polar.sh/cva"
|
||||
}
|
||||
},
|
||||
"node_modules/classnames": {
|
||||
"version": "2.5.1",
|
||||
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
|
||||
"integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/cli-cursor": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
|
||||
@@ -7690,6 +7703,12 @@
|
||||
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/load-script": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz",
|
||||
"integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/log-symbols": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
|
||||
@@ -7728,6 +7747,18 @@
|
||||
"url": "https://github.com/sponsors/wooorm"
|
||||
}
|
||||
},
|
||||
"node_modules/loose-envify": {
|
||||
"version": "1.4.0",
|
||||
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
|
||||
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"js-tokens": "^3.0.0 || ^4.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"loose-envify": "cli.js"
|
||||
}
|
||||
},
|
||||
"node_modules/lru-cache": {
|
||||
"version": "11.2.7",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz",
|
||||
@@ -9421,6 +9452,17 @@
|
||||
"node": ">= 6"
|
||||
}
|
||||
},
|
||||
"node_modules/prop-types": {
|
||||
"version": "15.8.1",
|
||||
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
|
||||
"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"loose-envify": "^1.4.0",
|
||||
"object-assign": "^4.1.1",
|
||||
"react-is": "^16.13.1"
|
||||
}
|
||||
},
|
||||
"node_modules/property-information": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
|
||||
@@ -9625,6 +9667,22 @@
|
||||
"react": "^16.8.0 || ^17 || ^18 || ^19"
|
||||
}
|
||||
},
|
||||
"node_modules/react-html-props": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/react-html-props/-/react-html-props-2.1.1.tgz",
|
||||
"integrity": "sha512-tM+YCYlr90m3JontKUAa+gNVU2zkyprlCS7OQ9aa3z2MfyJjAioJzrSmi1Vef/+UCTE6CQlPqLX4ebdLIJDKxw==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
|
||||
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-is": {
|
||||
"version": "16.13.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/react-refresh": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
|
||||
@@ -9681,6 +9739,40 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-social-media-embed": {
|
||||
"version": "2.5.18",
|
||||
"resolved": "https://registry.npmjs.org/react-social-media-embed/-/react-social-media-embed-2.5.18.tgz",
|
||||
"integrity": "sha512-+PkzLRGAwnySkxKajaiK5VD+EjOhlFsh/vjNxgHsDfKBTseDpFxPrMXXQWkk6BRCwFBNVWX+V1HZ9AU0y54Wgw==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@types/youtube-player": "^5.5.5",
|
||||
"classnames": "^2.5.1",
|
||||
"react-html-props": "^2.0.3",
|
||||
"react-sub-unsub": "^2.2.1",
|
||||
"react-twitter-embed": "^4.0.4",
|
||||
"react-youtube": "^10.1.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
|
||||
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-social-media-embed/node_modules/react-twitter-embed": {
|
||||
"version": "4.0.4",
|
||||
"resolved": "https://registry.npmjs.org/react-twitter-embed/-/react-twitter-embed-4.0.4.tgz",
|
||||
"integrity": "sha512-2JIL7qF+U62zRzpsh6SZDXNI3hRNVYf5vOZ1WRcMvwKouw+xC00PuFaD0aEp2wlyGaZ+f4x2VvX+uDadFQ3HVA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"scriptjs": "^2.5.9"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.0.0 || ^17.0.0 || ^18.0.0",
|
||||
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-style-singleton": {
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz",
|
||||
@@ -9703,6 +9795,33 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-sub-unsub": {
|
||||
"version": "2.2.8",
|
||||
"resolved": "https://registry.npmjs.org/react-sub-unsub/-/react-sub-unsub-2.2.8.tgz",
|
||||
"integrity": "sha512-o3tmiOOZPdQUCmRhkdCHXRFLOHnCwdz/N3QZ1JQ14fQGA2HysKMF0kWu56ERnQUCK7wYVCQzI8pFbnivAYNQ+A==",
|
||||
"license": "MIT",
|
||||
"peerDependencies": {
|
||||
"react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0",
|
||||
"react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 || ^22.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-youtube": {
|
||||
"version": "10.1.0",
|
||||
"resolved": "https://registry.npmjs.org/react-youtube/-/react-youtube-10.1.0.tgz",
|
||||
"integrity": "sha512-ZfGtcVpk0SSZtWCSTYOQKhfx5/1cfyEW1JN/mugGNfAxT3rmVJeMbGpA9+e78yG21ls5nc/5uZJETE3cm3knBg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fast-deep-equal": "3.1.3",
|
||||
"prop-types": "15.8.1",
|
||||
"youtube-player": "5.5.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 14.x"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=0.14.1"
|
||||
}
|
||||
},
|
||||
"node_modules/readdirp": {
|
||||
"version": "5.0.0",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz",
|
||||
@@ -10145,6 +10264,12 @@
|
||||
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/scriptjs": {
|
||||
"version": "2.5.9",
|
||||
"resolved": "https://registry.npmjs.org/scriptjs/-/scriptjs-2.5.9.tgz",
|
||||
"integrity": "sha512-qGVDoreyYiP1pkQnbnFAUIS5AjenNwwQBdl7zeos9etl+hYKWahjRTfzAZZYBv5xNHx7vNKCmaLDQZ6Fr2AEXg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "7.7.4",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
|
||||
@@ -10456,6 +10581,12 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/sister": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/sister/-/sister-3.0.2.tgz",
|
||||
"integrity": "sha512-p19rtTs+NksBRKW9qn0UhZ8/TUI9BPw9lmtHny+Y3TinWlOa9jWh9xB0AtPSdmOy49NJJJSSe0Ey4C7h0TrcYA==",
|
||||
"license": "BSD-3-Clause"
|
||||
},
|
||||
"node_modules/sisteransi": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
|
||||
@@ -11644,6 +11775,32 @@
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/youtube-player": {
|
||||
"version": "5.5.2",
|
||||
"resolved": "https://registry.npmjs.org/youtube-player/-/youtube-player-5.5.2.tgz",
|
||||
"integrity": "sha512-ZGtsemSpXnDky2AUYWgxjaopgB+shFHgXVpiJFeNB5nWEugpW1KWYDaHKuLqh2b67r24GtP6HoSW5swvf0fFIQ==",
|
||||
"license": "BSD-3-Clause",
|
||||
"dependencies": {
|
||||
"debug": "^2.6.6",
|
||||
"load-script": "^1.0.0",
|
||||
"sister": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/youtube-player/node_modules/debug": {
|
||||
"version": "2.6.9",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/youtube-player/node_modules/ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/zod": {
|
||||
"version": "4.3.6",
|
||||
"resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz",
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
"react": "^19.2.4",
|
||||
"react-dom": "^19.2.4",
|
||||
"react-hook-form": "^7.72.0",
|
||||
"react-social-media-embed": "^2.5.18",
|
||||
"shadcn": "^4.0.5",
|
||||
"tailwind-merge": "^3.5.0",
|
||||
"tailwindcss": "^4.2.1",
|
||||
|
||||
@@ -347,7 +347,6 @@ collections:
|
||||
fields:
|
||||
- { name: "key", label: "Identifiant unique", widget: "string" }
|
||||
- { name: "src", label: "URL du post Facebook (embed)", widget: "string" }
|
||||
- { name: "height", label: "Hauteur de l'iframe (px)", widget: "number" }
|
||||
|
||||
- name: "settings"
|
||||
label: "Paramètres du site"
|
||||
|
||||
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 525 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 287 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 164 KiB After Width: | Height: | Size: 227 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 223 KiB |
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 138 KiB |
|
Before Width: | Height: | Size: 202 KiB After Width: | Height: | Size: 134 KiB |
@@ -1,11 +1,12 @@
|
||||
|
||||
|
||||
import { motion } from "motion/react";
|
||||
import { FacebookEmbed } from 'react-social-media-embed';
|
||||
|
||||
interface TestimonialItem {
|
||||
key: string;
|
||||
src: string;
|
||||
height: number;
|
||||
}
|
||||
|
||||
import { motion } from "motion/react";
|
||||
|
||||
interface Props {
|
||||
sectionLabel: string;
|
||||
title: string;
|
||||
@@ -19,7 +20,6 @@ const iframeProps = {
|
||||
allowFullScreen: true,
|
||||
allow: 'autoplay; clipboard-write; encrypted-media; picture-in-picture; web-share',
|
||||
style: { border: 'none', overflow: 'hidden' } as React.CSSProperties,
|
||||
className: 'w-full rounded-2xl',
|
||||
}
|
||||
|
||||
const fadeUp = (delay: number) => ({
|
||||
@@ -92,9 +92,10 @@ export default function Grid({ sectionLabel, title, items }: Props) {
|
||||
<div className="mx-auto mt-16 grid max-w-2xl grid-cols-1 grid-rows-1 gap-8 text-sm/6 text-gray-900 sm:mt-20 sm:grid-cols-2 xl:mx-0 xl:max-w-none xl:grid-flow-col xl:grid-cols-4 dark:text-gray-100">
|
||||
<motion.figure
|
||||
{...slideUp(0.05)}
|
||||
className="rounded-2xl bg-white shadow-lg ring-1 ring-gray-900/5 sm:col-span-2 xl:col-start-2 xl:row-end-1 dark:bg-gray-800/75 dark:shadow-none dark:ring-white/10"
|
||||
className="overflow-hidden rounded-2xl bg-white shadow-lg ring-1 ring-gray-900/5 sm:col-span-2 xl:col-start-2 xl:row-end-1 dark:bg-gray-800/75 dark:shadow-none dark:ring-white/10"
|
||||
>
|
||||
<iframe {...iframeProps} src={featured.src} height={featured.height} />
|
||||
<FacebookEmbed url={featured.src} width="100%" />
|
||||
|
||||
</motion.figure>
|
||||
{groups.map((group, groupIdx) => (
|
||||
<div key={groupIdx} className="space-y-8 xl:contents xl:space-y-0">
|
||||
@@ -109,9 +110,10 @@ export default function Grid({ sectionLabel, title, items }: Props) {
|
||||
>
|
||||
<motion.figure
|
||||
{...slideUp(delay)}
|
||||
className="rounded-2xl bg-white shadow-lg ring-1 ring-gray-900/5 dark:bg-gray-800/75 dark:shadow-none dark:ring-white/10"
|
||||
className={`rounded-2xl bg-white shadow-lg ring-1 ring-gray-900/5 dark:bg-gray-800/75 dark:shadow-none dark:ring-white/10 overflow-hidden`}
|
||||
>
|
||||
<iframe {...iframeProps} src={t.src} height={t.height} />
|
||||
|
||||
<FacebookEmbed url={t.src} width="100%" />
|
||||
</motion.figure>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -14,6 +14,8 @@ type Props = {
|
||||
footer: {
|
||||
tagline: string;
|
||||
facebookLabel: string;
|
||||
servicesTitle: string;
|
||||
serviceLinks: { label: string; href: string }[];
|
||||
serviceAreasTitle: string;
|
||||
serviceAreas: string[];
|
||||
navTitle: string;
|
||||
@@ -61,7 +63,7 @@ export default function FooterAnimated({
|
||||
whileInView="whileInView"
|
||||
viewport={{ amount: 0.2, once: false }}
|
||||
>
|
||||
<div className="container-site grid grid-cols-1 gap-7 pb-12 min-[541px]:grid-cols-2 min-[541px]:gap-8 min-[901px]:grid-cols-[1.5fr_2fr_1fr_1fr] min-[901px]:gap-10">
|
||||
<div className="container-site grid grid-cols-1 gap-7 pb-12 min-[541px]:grid-cols-2 min-[541px]:gap-8 min-[901px]:grid-cols-[1.5fr_1fr_1fr_1fr] min-[901px]:gap-10">
|
||||
<motion.div {...fadeUp(0)}>
|
||||
<motion.a {...hoverPop} href="/" aria-label={siteName}>
|
||||
<img
|
||||
@@ -163,15 +165,18 @@ export default function FooterAnimated({
|
||||
|
||||
<motion.div {...fadeUp(0.08)}>
|
||||
<h3 className="mb-[1.125rem] font-[family-name:var(--font-body)] text-[0.8125rem] font-bold uppercase tracking-[0.08em] text-white/50">
|
||||
{footer.serviceAreasTitle}
|
||||
{footer.servicesTitle}
|
||||
</h3>
|
||||
<ul className="m-0 list-none columns-2 gap-x-6 p-0 [&>li]:mb-2">
|
||||
{footer.serviceAreas.map((area) => (
|
||||
<li
|
||||
key={area}
|
||||
className="text-[0.875rem] text-white/70 break-inside-avoid"
|
||||
<ul className="m-0 flex list-none flex-col gap-2.5 p-0">
|
||||
{footer.serviceLinks.map((item, idx) => (
|
||||
<li key={`${item.label}-${idx}`}>
|
||||
<motion.a
|
||||
{...hoverPop}
|
||||
href="/#services"
|
||||
className="inline-flex text-[0.9375rem] text-white/80 transition-colors hover:text-white"
|
||||
>
|
||||
{area}
|
||||
{item.label}
|
||||
</motion.a>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
@@ -264,6 +269,24 @@ export default function FooterAnimated({
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
<div className="container-site border-t border-white/15 pb-12 pt-10 min-[901px]:pt-12">
|
||||
<motion.div {...fadeUp(0.12)}>
|
||||
<h3 className="mb-[1.125rem] font-[family-name:var(--font-body)] text-[0.8125rem] font-bold uppercase tracking-[0.08em] text-white/50">
|
||||
{footer.serviceAreasTitle}
|
||||
</h3>
|
||||
<ul className="m-0 list-none columns-2 gap-x-6 p-0 sm:columns-3 lg:columns-5 [&>li]:mb-2">
|
||||
{footer.serviceAreas.map((area) => (
|
||||
<li
|
||||
key={area}
|
||||
className="text-[0.875rem] text-white/70 break-inside-avoid"
|
||||
>
|
||||
{area}
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
</motion.div>
|
||||
</div>
|
||||
|
||||
<motion.div {...fadeUp(0.1)} className="border-t border-white/15 py-[1.125rem]">
|
||||
<div className="container-site flex flex-wrap items-center justify-between gap-4 max-[540px]:flex-col max-[540px]:items-start max-[540px]:gap-2">
|
||||
<p className="text-[0.8125rem] text-white/50">{legalNotice}</p>
|
||||
|
||||
@@ -209,7 +209,6 @@ const testimonials = defineCollection({
|
||||
z.object({
|
||||
key: z.string(),
|
||||
src: z.string().url(),
|
||||
height: z.number(),
|
||||
}),
|
||||
),
|
||||
}),
|
||||
|
||||
@@ -9,29 +9,85 @@
|
||||
"neq": "NEQ : 9500-5609",
|
||||
"facebookLabel": "Facebook",
|
||||
"serviceLinks": [
|
||||
{ "label": "Peinture intérieure", "href": "/services#peinture-interieure" },
|
||||
{ "label": "Peinture extérieure", "href": "/services#peinture-exterieure" },
|
||||
{ "label": "Peinture commerciale", "href": "/services#peinture-commerciale" },
|
||||
{ "label": "Décoration intérieure", "href": "/services#decoration-interieure" }
|
||||
{ "label": "Peinture intérieure", "href": "/#services" },
|
||||
{ "label": "Peinture extérieure", "href": "/#services" },
|
||||
{ "label": "Peinture commerciale", "href": "/#services" },
|
||||
{ "label": "Solutions clef en main", "href": "/#services" },
|
||||
{ "label": "Finitions de luxe", "href": "/#services" }
|
||||
],
|
||||
"serviceAreas": [
|
||||
"Saint-Basile-le-Grand",
|
||||
"Longueuil",
|
||||
"Brossard",
|
||||
"Saint-Hubert",
|
||||
"Saint-Lambert",
|
||||
"Saint-Bruno-de-Montarville",
|
||||
"Beloeil",
|
||||
"Mont-Saint-Hilaire",
|
||||
"Sainte-Julie",
|
||||
"Montréal (Ville-centre, avec 19 arrondissements)",
|
||||
"Baie-D'Urfé",
|
||||
"Beaconsfield",
|
||||
"Côte-Saint-Luc",
|
||||
"Dollard-des-Ormeaux",
|
||||
"Dorval",
|
||||
"Hampstead",
|
||||
"Kirkland",
|
||||
"L'Île-Dorval",
|
||||
"Mont-Royal (Ville de Mont-Royal)",
|
||||
"Montréal-Est",
|
||||
"Montréal-Ouest",
|
||||
"Pointe-Claire",
|
||||
"Sainte-Anne-de-Bellevue",
|
||||
"Senneville",
|
||||
"Westmount",
|
||||
"Belœil",
|
||||
"Boucherville",
|
||||
"La Prairie",
|
||||
"Carignan",
|
||||
"Brossard",
|
||||
"Candiac",
|
||||
"McMasterville",
|
||||
"Otterburn Park",
|
||||
"Carignan",
|
||||
"Chambly",
|
||||
"Partout sur la Rive-Sud",
|
||||
"Montréal"
|
||||
"Châteauguay",
|
||||
"Delson",
|
||||
"La Prairie",
|
||||
"Longueuil",
|
||||
"Greenfield Park",
|
||||
"Saint-Hubert",
|
||||
"Vieux-Longueuil",
|
||||
"McMasterville",
|
||||
"Mont-Saint-Hilaire",
|
||||
"Otterburn Park",
|
||||
"Saint-Basile-le-Grand",
|
||||
"Saint-Bruno-de-Montarville",
|
||||
"Sainte-Catherine",
|
||||
"Saint-Constant",
|
||||
"Saint-Isidore",
|
||||
"Sainte-Julie",
|
||||
"Saint-Lambert",
|
||||
"Saint-Philippe",
|
||||
"Saint-Jean-sur-Richelieu",
|
||||
"Varennes",
|
||||
"Saint-Mathias",
|
||||
"Beauharnois",
|
||||
"Salaberry-de-Valleyfield",
|
||||
"Saint-Étienne-de-Beauharnois",
|
||||
"Saint-Stanislas-de-Kostka",
|
||||
"Saint-Urbain-Premier",
|
||||
"Sainte-Martine",
|
||||
"Saint-Louis-de-Gonzague",
|
||||
"Coteau-du-Lac",
|
||||
"Hudson",
|
||||
"L'Île-Cadieux",
|
||||
"L'Île-Perrot",
|
||||
"Les Cèdres",
|
||||
"Les Coteaux",
|
||||
"Notre-Dame-de-l'Île-Perrot",
|
||||
"Pincourt",
|
||||
"Pointe-des-Cascades",
|
||||
"Pointe-Fortune",
|
||||
"Rigaud",
|
||||
"Rivière-Beaudette",
|
||||
"Saint-Clet",
|
||||
"Saint-Lazare",
|
||||
"Saint-Polycarpe",
|
||||
"Saint-Télesphore",
|
||||
"Saint-Zotique",
|
||||
"Sainte-Justine-de-Newton",
|
||||
"Sainte-Marthe",
|
||||
"Terrasse-Vaudreuil",
|
||||
"Très-Saint-Rédempteur",
|
||||
"Vaudreuil-Dorion",
|
||||
"Vaudreuil-sur-le-Lac"
|
||||
]
|
||||
}
|
||||
|
||||
7
src/content/services/fr/clef-en-main.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
title: Solutions clef en main
|
||||
description: De la réparation de plâtre au ménage, nous proposons une variété de solutions pour faciliter le processus de rénovation. Nous proposons également des options pour sélectionner la couleur et l'agencement de vos espaces intérieurs afin de les adapter à vos besoins en décoration. Contactez-nous avec les détails de votre projet pour une soumission gratuite!
|
||||
icon: renovation
|
||||
order: 5
|
||||
featured: false
|
||||
---
|
||||
@@ -1,25 +0,0 @@
|
||||
---
|
||||
title: Décoration intérieure
|
||||
description: Conseils personnalisés en couleur et décoration. Nos experts vous aident à créer l'ambiance parfaite pour chaque pièce de votre maison.
|
||||
icon: decoration
|
||||
order: 4
|
||||
featured: false
|
||||
---
|
||||
|
||||
Au-delà de la peinture, nos peintres décorateurs apportent leur expertise en design pour vous aider à créer des espaces qui vous ressemblent.
|
||||
|
||||
## Nos services de décoration
|
||||
|
||||
- Consultation couleur et tendances
|
||||
- Effets décoratifs et textures
|
||||
- Trompe-l'œil et murales
|
||||
- Application de papier peint
|
||||
- Conseil en éclairage et mise en valeur des espaces
|
||||
|
||||
## Techniques spécialisées
|
||||
|
||||
- Badigeon et enduit à la chaux
|
||||
- Effet béton ciré
|
||||
- Patines et vieillissements
|
||||
- Peintures texturées
|
||||
- Finitions métalliques
|
||||
8
src/content/services/fr/finition-de-luxe.md
Normal file
@@ -0,0 +1,8 @@
|
||||
---
|
||||
title: Finitions de luxe
|
||||
description: Pour une personnalisation maximale de vos espaces, nous proposons des enduits à la chaux, des enduits de plâtre vénitien, ainsi que des fresques et des murales.
|
||||
icon: decoration
|
||||
order: 4
|
||||
featured: false
|
||||
---
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
title: Peinture commerciale
|
||||
description: Solutions de peinture pour bureaux, commerces et espaces institutionnels. Travaux réalisés en dehors des heures d'ouverture pour minimiser les perturbations.
|
||||
title: 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
|
||||
featured: true
|
||||
|
||||
@@ -1,25 +1,7 @@
|
||||
---
|
||||
title: Peinture extérieure
|
||||
description: Protection et embellissement de la façade de votre maison. Travaux résistants aux conditions climatiques du Québec pour une durabilité maximale.
|
||||
title: 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
|
||||
featured: true
|
||||
---
|
||||
|
||||
La peinture extérieure protège votre investissement tout en rehaussant l'apparence de votre propriété. Nous utilisons des produits spécialement formulés pour résister aux hivers québécois.
|
||||
|
||||
## Ce qui est inclus
|
||||
|
||||
- Nettoyage haute pression des surfaces
|
||||
- Réparation des fissures et dommages
|
||||
- Application d'apprêt spécialisé
|
||||
- 2 couches de peinture extérieure haute performance
|
||||
- Protection et calfeutrage aux joints
|
||||
|
||||
## Nos spécialités
|
||||
|
||||
- Revêtements en bois, aluminium et vinyle
|
||||
- Briques et stucco
|
||||
- Balcons, vérandas et galeries
|
||||
- Clôtures et cabanons
|
||||
- Portes et fenêtres (cadres et contours)
|
||||
|
||||
@@ -1,25 +1,7 @@
|
||||
---
|
||||
title: Peinture intérieure
|
||||
description: Transformation complète de vos espaces intérieurs. Préparation des surfaces, application soignée et finitions impeccables pour tous types de pièces.
|
||||
title: 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
|
||||
featured: true
|
||||
---
|
||||
|
||||
Nos peintres décorateurs réalisent tous vos projets de peinture intérieure avec professionnalisme et souci du détail. De la préparation minutieuse des surfaces à la finition parfaite, chaque étape est effectuée avec rigueur.
|
||||
|
||||
## Ce qui est inclus
|
||||
|
||||
- Évaluation et préparation des surfaces (rebouchage, sablage, apprêt)
|
||||
- Application de 2 couches de peinture de qualité professionnelle
|
||||
- Protection des planchers, meubles et garnitures
|
||||
- Nettoyage complet après les travaux
|
||||
- Garantie sur la main-d'œuvre
|
||||
|
||||
## Nos spécialités
|
||||
|
||||
- Salons et salles à manger
|
||||
- Chambres à coucher
|
||||
- Cuisines et salles de bain
|
||||
- Sous-sols et espaces récréatifs
|
||||
- Couloirs et entrées
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
---
|
||||
title: Rénovation complète
|
||||
description: Coordination de projets de rénovation résidentielle. De la peinture aux finitions, un seul entrepreneur pour tous vos travaux de décoration.
|
||||
icon: renovation
|
||||
order: 5
|
||||
featured: false
|
||||
---
|
||||
|
||||
Pour les projets de rénovation importants, Cachet Peintres Décorateurs coordonne l'ensemble des travaux de finition, vous offrant un interlocuteur unique pour simplifier votre projet.
|
||||
|
||||
## Ce qui est inclus
|
||||
|
||||
- Évaluation complète du projet
|
||||
- Coordination des corps de métier
|
||||
- Peinture intérieure et extérieure
|
||||
- Travaux de finition et moulures
|
||||
- Supervision et contrôle qualité
|
||||
|
||||
## Projets réalisés
|
||||
|
||||
- Rénovations complètes de condos
|
||||
- Mises à jour de maisons avant vente
|
||||
- Rénovations post-construction
|
||||
- Remises en état locatives
|
||||
@@ -11,7 +11,7 @@
|
||||
"fromAddressSubmission": "Cachet Peintres Décorateurs <notifications@mbcubeconsulting.ca>",
|
||||
"toAddressSubmission": "mouad@mbcubeconsulting.ca",
|
||||
"address": "Sainte Catherine, Québec",
|
||||
"serviceArea": "Laval, Rive-Nord, Montréal",
|
||||
"serviceArea": "Rive sud et Le Grand Montréal",
|
||||
"facebook": "https://www.facebook.com/cachetdecor/",
|
||||
"instagram": "https://www.instagram.com/cachet.deco/",
|
||||
"linkedin": "",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"defaultTitle": "Cachet Peintres Décorateurs | Laval & Rive-Nord",
|
||||
"defaultTitle": "Cachet Peintres Décorateurs | Rive sud et Le Grand Montréal",
|
||||
"titleTemplate": "%s | Cachet Peintres Décorateurs",
|
||||
"defaultDescription": "Peintres décorateurs professionnels à Laval et sur la Rive-Nord. Peinture résidentielle et commerciale, décoration intérieure et extérieure. RBQ 5839 8736 01. Soumission gratuite.",
|
||||
"keywords": "peintre Laval, peinture résidentielle Laval, peinture commerciale Rive-Nord, décoration intérieure Laval, peintres décorateurs Québec, peinture extérieure Laval, rénovation Rive-Nord, soumission peinture gratuite",
|
||||
"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",
|
||||
"ogImage": "/images/logo-full.webp",
|
||||
"twitterCard": "summary_large_image"
|
||||
}
|
||||
|
||||
@@ -4,28 +4,23 @@
|
||||
"items": [
|
||||
{
|
||||
"key": "sylvie-gauthier",
|
||||
"src": "https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fsylvie.gauthier.73594%2Fposts%2Fpfbid0DHM1833TLKru4cbkTnZq3KLNHrSR8B8rQAgGosGzAbpGMccvLffoNmCLgEo8GUNPl&show_text=true&width=500",
|
||||
"height": 208
|
||||
"src": "https://www.facebook.com/sylvie.gauthier.73594/posts/10220386644130734"
|
||||
},
|
||||
{
|
||||
"key": "jean-christophe-ali",
|
||||
"src": "https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fjean.christophe.ali.2025%2Fposts%2Fpfbid02qsqq2Rn4vRx1gCG3q5e5M2ByPXH6zMux59fWvotfsQxpuWyUh46TZuwCND9iKpwnl&show_text=true&width=500",
|
||||
"height": 194
|
||||
"key": "Dan Beasy",
|
||||
"src": "https://www.facebook.com/dbinpg/posts/10151893154834955"
|
||||
},
|
||||
{
|
||||
"key": "charlotte-lafrance",
|
||||
"src": "https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fcharlotte.lafrance.CL%2Fposts%2Fpfbid026Jw7aer2r84q27kgcZ1PKg8q2sqKgZc6nJspP42CTEAU6ac8FF4Ptj8ap8XGh6Wl&show_text=true&width=500",
|
||||
"height": 166
|
||||
"src": "https://www.facebook.com/charlotte.lafrance.CL/posts/10166899061800442"
|
||||
},
|
||||
{
|
||||
"key": "colin-griffin",
|
||||
"src": "https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fcolin.griffin.165%2Fposts%2Fpfbid0iCA6hoF5X32gUJSBcDUiXP2hxhxzMmEiC5Att3CDDwFckrHa7yxyGiLBmXQhQBUFl&show_text=true&width=500",
|
||||
"height": 222
|
||||
"src": "https://www.facebook.com/colin.griffin.165/posts/10166940799480355"
|
||||
},
|
||||
{
|
||||
"key": "hollowman-la-rock",
|
||||
"src": "https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fhollowman.la.rock%2Fposts%2Fpfbid0hPR3RpaSLZtZkgpaEzKsNKAF4hUeKbDzkicAZ9jsbCpXKRRsYD63C32rw78uvRoml&show_text=true&width=500",
|
||||
"height": 170
|
||||
"src": "https://www.facebook.com/hollowman.la.rock/posts/1365396367225994"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -94,7 +94,7 @@ const heroContent = {
|
||||
subtitle={nav.servicesSection.subtitle}
|
||||
/>
|
||||
<Testimonials
|
||||
client:load
|
||||
client:only="react"
|
||||
sectionLabel={testimonialsData.sectionLabel}
|
||||
title={testimonialsData.title}
|
||||
items={testimonialsData.items}
|
||||
|
||||