SPB Git forge

spb/uqo-eval

Public
55commits 2branches 0releases
134.4 MBsize
maindefault branch
2 h agolast push
TypeScript 90.1% JavaScript 3.2% Python 3.2% CSS 1.8% HTML 1.8%
7.5 KB · 193 lines tsx
Raw Blame History
1// UQO Éval — laboratoire pédagogique d'évaluation immobilière2import type { Metadata, Viewport } from "next";3import { Inter, JetBrains_Mono, Space_Grotesk } from "next/font/google";4import "./globals.css";5import "../ka/ka-tabbar.css";6import { LangProvider, LangToggle } from "@/components/LangContext";7import CookieConsent from "@/components/CookieConsent";8import FooterNav from "@/components/FooterNav";9import MobileTabBar from "@/components/MobileTabBar";10import HeaderNav from "@/components/HeaderNav";11import UqoFooter from "@/components/UqoFooter";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: "UQO Éval — Laboratoire pédagogique d'évaluation immobilière",29    template: "%s | UQO Éval",30  },31  description:32    "Plateforme universitaire pour comprendre comment une propriété est évaluée : modèle hédonique, comparables réels, ajustements montrés en dollars, intervalle de confiance. 3,7 millions de propriétés du Québec, 1 100 municipalités.",33  applicationName: "UQO Éval",34  manifest: "/manifest.webmanifest",35  icons: { icon: "/favicon.svg", apple: "/apple-touch-icon.png" },36  openGraph: {37    type: "website",38    siteName: "UQO Éval",39    locale: "fr_CA",40    url: SITE_URL,41    title: "UQO Éval — Laboratoire pédagogique d'évaluation immobilière",42    description:43      "Comprendre comment une propriété est évaluée : modèle hédonique, comparables réels, ajustements en dollars, intervalle de confiance — le calcul montré en entier.",44    images: [{ url: `${SITE_URL}/og.png`, width: 1200, height: 630 }],45  },46  twitter: {47    card: "summary_large_image",48    images: [{ url: `${SITE_URL}/og.png`, width: 1200, height: 630 }],49    title: "UQO Éval — Laboratoire pédagogique d'évaluation immobilière",50    description:51      "Comprendre comment une propriété est évaluée : 3,7 millions de propriétés du Québec, le calcul montré en entier.",52  },53  formatDetection: { telephone: false },54};5556/** Viewport mobile : viewport-fit=cover pour les encoches iOS (safe-area). */57export const viewport: Viewport = {58  width: "device-width",59  initialScale: 1,60  viewportFit: "cover",61};6263/** JSON-LD global : l'organisation et le site (entités schema.org). */64const ORG_JSONLD = {65  "@context": "https://schema.org",66  "@graph": [67    {68      "@type": "EducationalOrganization",69      "@id": `${SITE_URL}/#org`,70      name: "UQO Éval",71      alternateName: "Laboratoire pédagogique d'évaluation immobilière",72      url: SITE_URL,73      parentOrganization: {74        "@type": "CollegeOrUniversity",75        name: "Université du Québec en Outaouais",76        url: "https://uqo.ca",77      },78      areaServed: { "@type": "AdministrativeArea", name: "Québec, Canada" },79    },80    {81      "@type": "WebSite",82      "@id": `${SITE_URL}/#site`,83      name: "UQO Éval",84      url: SITE_URL,85      inLanguage: "fr-CA",86      publisher: { "@id": `${SITE_URL}/#org` },87      description:88        "Laboratoire pédagogique d'évaluation immobilière : modèle hédonique, comparables réels, intervalle de confiance — le calcul montré en entier.",89    },90  ],91};9293const TICKER = [94  "3 747 008 unités d'évaluation",95  "745 119 ventes réelles 2021-2026",96  "22 M d'estimations calculées",97  "Intervalle de confiance P10-P90",98  "Indice de confiance A-D",99  "Chaque ajustement montré en dollars",100  "1 100 municipalités couvertes",101  "Modèle hédonique — erreur médiane 11 %",102  "Cours IMM1003 · IMM1033 — UQO",103];104105export default function RootLayout({ children }: LayoutProps<"/">) {106  return (107    <html lang="fr-CA">108      <body109        className={`${inter.variable} ${spaceGrotesk.variable} ${jetbrains.variable}`}110      >111        <script112          type="application/ld+json"113          dangerouslySetInnerHTML={{ __html: JSON.stringify(ORG_JSONLD) }}114        />115        <LangProvider>116          {/* header opaque compact — logo officiel UQO + wordmark Éval */}117          <header className="sticky top-0 z-[var(--z-header,500)] border-b border-[var(--line-strong)] bg-paper">118            <div className="relative mx-auto flex h-14 max-w-6xl items-center gap-6 px-4 sm:px-6">119              <Link120                href="/"121                className="relative flex items-end gap-3 after:absolute after:-inset-2 after:content-['']"122                aria-label="UQO Éval — accueil"123              >124                {/* eslint-disable-next-line @next/next/no-img-element */}125                <img126                  src="/uqo/uqo-bleu.png"127                  alt="UQO"128                  className="h-[26px] w-auto"129                />130                <span className="vp-display text-[19px] font-bold leading-none tracking-[-0.04em] text-accent">131                  Éval132                </span>133              </Link>134              {/* sous-titre — desktop large seulement */}135              <span className="vp-mono hidden text-[9.5px] uppercase leading-tight tracking-[0.1em] text-ink-3 xl:inline-block">136                Laboratoire pédagogique137                <br />138                d&apos;évaluation immobilière139              </span>140              <div className="ml-auto flex items-center gap-3 sm:gap-4">141                <HeaderNav />142                <span143                  aria-hidden="true"144                  className="hidden h-4 w-px bg-[var(--line)] lg:inline-block"145                />146                <LangToggle />147              </div>148            </div>149          </header>150          <div className="ticker" aria-hidden="true">151            <div className="ticker-track">152              {[...TICKER, ...TICKER].map((s, i) => (153                <span key={i}>{s}</span>154              ))}155            </div>156          </div>157          <main className="mx-auto max-w-6xl px-4 pb-16 sm:px-6">{children}</main>158          {/* rangée locale (papier) : marque + liens de navigation du site,159              puis le bloc encre final = footer institutionnel UQO Éval */}160          <div className="mx-auto max-w-6xl px-4 sm:px-6">161            <div className="border-t-2 border-ink pt-7 text-[13px] text-ink-2">162              <p className="vp-display mb-3 flex items-baseline gap-2 text-[24px] font-bold tracking-[-0.04em] text-ink">163                UQO&nbsp;Éval164                <span165                  aria-hidden="true"166                  className="inline-block h-[8px] w-[8px] bg-accent"167                />168              </p>169              <p className="max-w-2xl">170                Laboratoire pédagogique d&apos;évaluation immobilière. Estimations171                bâties sur les rôles d&apos;évaluation foncière du Québec (MAMH,172                données ouvertes) et 745 119 transactions réelles. Modèle173                hédonique + comparables ajustés, calcul montré en entier — à des174                fins pédagogiques, universitaires et expérimentales.175              </p>176              <FooterNav />177            </div>178          </div>179          <UqoFooter />180          <MobileTabBar />181          <CookieConsent />182          <script183            dangerouslySetInnerHTML={{184              __html: 'window.KA_AGENT={site:"uqo-eval"}',185            }}186          />187          <script src="/assistant.js" defer />188        </LangProvider>189      </body>190    </html>191  );192}193