Repository Public
1// Auteur : Simon-Pierre Boucher — contact@spboucher.ai2import type { Metadata, Viewport } from "next";3import { Inter, JetBrains_Mono, Space_Grotesk } from "next/font/google";4import "./globals.css";5import { LangProvider, LangToggle } from "@/components/LangContext";6import AccountButton from "@/components/AccountButton";7import CookieConsent from "@/components/CookieConsent";8import FooterNav from "@/components/FooterNav";9import HeaderNav from "@/components/HeaderNav";10import GroupeKaBadge from "@/ka/GroupeKaBadge";11import KaFooter from "@/ka/KaFooter";12import Link from "next/link";13import { SITE_URL } from "@/lib/seo";1415const inter = Inter({ subsets: ["latin"], variable: "--font-inter" });16const spaceGrotesk = Space_Grotesk({17 subsets: ["latin"],18 variable: "--font-space-grotesk",19});20const jetbrains = JetBrains_Mono({21 subsets: ["latin"],22 variable: "--font-jetbrains",23});2425export const metadata: Metadata = {26 metadataBase: new URL(SITE_URL),27 title: {28 default: "Vrai-Prix — Un service Groupe KA",29 template: "%s | Vrai-Prix",30 },31 description:32 "Estimation immobilière transparente pour le Québec : modèle hédonique + comparables réels, fourchette honnête et indice de confiance. 3,7 millions de propriétés, 1 100 municipalités.",33 applicationName: "Vrai-Prix",34 icons: { icon: "/favicon.svg", apple: "/apple-touch-icon.png" },35 openGraph: {36 type: "website",37 siteName: "Vrai-Prix",38 locale: "fr_CA",39 url: SITE_URL,40 title: "Vrai-Prix — Un service Groupe KA",41 description:42 "Estimation immobilière transparente pour le Québec : modèle hédonique + comparables réels, fourchette honnête et indice de confiance.",43 images: [44 { url: "https://www.vrai-prix.com/og.png", width: 1200, height: 630 },45 ],46 },47 twitter: {48 card: "summary_large_image",49 images: [50 { url: "https://www.vrai-prix.com/og.png", width: 1200, height: 630 },51 ],52 title: "Vrai-Prix — Un service Groupe KA",53 description:54 "Estimation immobilière transparente pour le Québec : 3,7 millions de propriétés estimées, calcul montré en entier.",55 },56 formatDetection: { telephone: false },57};5859/** Viewport mobile : viewport-fit=cover pour les encoches iOS (safe-area). */60export const viewport: Viewport = {61 width: "device-width",62 initialScale: 1,63 viewportFit: "cover",64};6566/** JSON-LD global : l'organisation et le site (entités schema.org). */67const ORG_JSONLD = {68 "@context": "https://schema.org",69 "@graph": [70 {71 "@type": "Organization",72 "@id": `${SITE_URL}/#org`,73 name: "Vrai-Prix",74 url: SITE_URL,75 email: "contact@spboucher.ai",76 founder: { "@type": "Person", name: "Simon-Pierre Boucher" },77 areaServed: { "@type": "AdministrativeArea", name: "Québec, Canada" },78 },79 {80 "@type": "WebSite",81 "@id": `${SITE_URL}/#site`,82 name: "Vrai-Prix",83 url: SITE_URL,84 inLanguage: "fr-CA",85 publisher: { "@id": `${SITE_URL}/#org` },86 description:87 "Estimation immobilière transparente pour le Québec : modèle hédonique + comparables réels, fourchette honnête et indice de confiance.",88 },89 ],90};9192const TICKER = [93 "3 747 008 unités d'évaluation",94 "745 119 ventes réelles 2021-2026",95 "22 M d'estimations calculées",96 "Fourchette honnête P10-P90",97 "Indice de confiance A-D",98 "Zéro boîte noire — le calcul est montré",99 "1 100 municipalités couvertes",100 "Erreur médiane 11 %",101];102103export default function RootLayout({ children }: LayoutProps<"/">) {104 return (105 <html lang="fr-CA">106 <body107 className={`${inter.variable} ${spaceGrotesk.variable} ${jetbrains.variable}`}108 >109 <script110 type="application/ld+json"111 dangerouslySetInnerHTML={{ __html: JSON.stringify(ORG_JSONLD) }}112 />113 <LangProvider>114 {/* header opaque (standard header/menu KA 2026-08-22) */}115 <header className="sticky top-0 z-[var(--z-header,500)] border-b-2 border-ink bg-paper">116 <div className="relative mx-auto flex h-16 max-w-6xl items-center gap-5 px-4 sm:px-6">117 <Link118 href="/"119 className="vp-display group relative flex items-center text-[22px] font-bold leading-none tracking-[-0.04em] after:absolute after:-inset-2 after:content-[''] sm:text-[26px]"120 >121 Vrai122 <span className="ml-1 rotate-[-2deg] rounded-md bg-ink px-[7px] pb-1 pt-[2px] text-lime transition-transform duration-200 group-hover:rotate-0">123 Prix124 </span>125 </Link>126 {/* badge Groupe KA — desktop seulement (l'espace manque sous xl ;127 le menu mobile porte sa propre entrée) */}128 <span className="hidden xl:inline-flex">129 <GroupeKaBadge />130 </span>131 <div className="ml-auto flex items-center gap-2">132 <HeaderNav />133 <AccountButton />134 <LangToggle />135 </div>136 </div>137 </header>138 <div className="ticker" aria-hidden="true">139 <div className="ticker-track">140 {[...TICKER, ...TICKER].map((s, i) => (141 <span key={i}>{s}</span>142 ))}143 </div>144 </div>145 <main className="mx-auto max-w-6xl px-4 pb-16 sm:px-6">{children}</main>146 {/* rangée locale (papier) : marque + liens de navigation du site,147 puis le bloc encre final = KaFooter (commun Groupe KA) */}148 <div className="mx-auto max-w-6xl px-4 sm:px-6">149 <div className="border-t-2 border-ink pt-7 text-[13px] text-ink-2">150 <p className="vp-display mb-3 text-[26px] font-bold tracking-[-0.04em] text-ink">151 Vrai152 <span className="ml-1 inline-block rotate-[-2deg] rounded-md bg-ink px-[6px] pb-[3px] pt-[1px] text-lime">153 Prix154 </span>155 </p>156 <p className="max-w-2xl">157 Estimations bâties sur les rôles d'évaluation foncière du158 Québec (MAMH, données ouvertes) et 745 119 transactions réelles.159 Modèle hédonique + comparables ajustés, calcul montré en entier.160 Estimation statistique à titre indicatif.161 </p>162 <FooterNav />163 </div>164 </div>165 <KaFooter166 siteId="vrai-prix"167 localLegal={[168 { label: "Conditions", href: "/conditions" },169 { label: "Confidentialité", href: "/confidentialite" },170 { label: "Méthodologie", href: "/methodologie" },171 ]}172 />173 <CookieConsent />174 <script175 dangerouslySetInnerHTML={{176 __html: 'window.KA_AGENT={site:"vrai-prix"}',177 }}178 />179 <script src="/ka-agent.js" defer />180 </LangProvider>181 </body>182 </html>183 );184}185