Compare commits

..

3 commits

Author SHA1 Message Date
0988149c96 feat: ajoute balise Google 2025-03-28 22:53:27 +01:00
4e2ec9b631 feat: amélioration SEO 2025-03-27 01:56:00 +01:00
ebc426840f feat: amélioration page Cantepau 2025-03-26 17:03:10 +01:00
8 changed files with 196 additions and 45 deletions

View file

@ -50,6 +50,7 @@ const appleTouchIcon = await getImage({
<meta charset="utf-8" /> <meta charset="utf-8" />
<meta content={meta} name="description" /> <meta content={meta} name="description" />
<meta name="web_author" content={author} /> <meta name="web_author" content={author} />
<meta name="keywords" content={SITE.keywords} />
<meta <meta
name="viewport" name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, minimum-scale=1.0"

View file

@ -14,7 +14,7 @@ interface Props {
--- ---
<section <section
class="mx-auto mt-10 max-w-[85rem] px-4 py-10 sm:px-6 sm:py-16 lg:px-8 lg:py-14 2xl:max-w-full" class="mx-auto mt-10 max-w-[85rem] px-4 py-5 sm:px-6 sm:py-16 lg:px-8 lg:py-6 2xl:max-w-full"
> >
<div class="max-w-screen-md"> <div class="max-w-screen-md">
<h1 <h1

View file

@ -2,22 +2,23 @@ import ogImageSrc from "@images/vue-de-la-piscine.jpg";
import type { WebPage, WebSite, WithContext } from "schema-dts"; import type { WebPage, WebSite, WithContext } from "schema-dts";
export const SITE = { export const SITE = {
title: "Maison à vendre à Albi", title: "Maison 183m² avec piscine à vendre à Albi",
tagline: "La maison familiale par excellence", tagline: "La maison familiale par excellence",
description: description:
"Belle maison individuelle de 177 m2 dans un écrin de verdure sur un terrain de 980 m2, non-mitoyenne, avec piscine, grande terrasse et garage. Sans vis-à-vis.", "Belle maison individuelle de 183 m2 dans un écrin de verdure à vendre à Albi. Terrain 980 m2 sans vis-à-vis, non-mitoyenne, avec piscine, grande terrasse et garage, proche centre-ville.",
description_short: description_short:
"Belle maison individuelle de 177 m2 dans un écrin de verdure sur un terrain de 980 m2.", "Maison 183m² dans un écrin de verdure avec piscine, 5 chambres sur terrain 980m² sans vis-à-vis à Albi.",
url: "https://achat-maison-albi.fr", url: "https://achat-maison-albi.fr",
author: "Jalil Arfaoui", author: "Jalil Arfaoui",
keywords: "maison à vendre Albi, achat maison piscine Albi, villa 5 chambres Albi, propriété avec jardin Albi, maison avec terrasse Albi, achat-maison-albi",
}; };
export const websiteStructuredDescription = { export const websiteStructuredDescription = {
"@type": "WebSite", "@type": "WebSite",
url: "https://achat-maison-albi.fr", url: "https://achat-maison-albi.fr",
name: "Maison indiduelle de 177m2 à vendre à Albi", name: "Maison individuelle de 183m² avec piscine à vendre à Albi",
description: description:
"Situation idéale : Au calme au fond dune impasse, à moins de 2 km du centre historique, accès rocade à 1 km, tous les commerces, médiathèque et maison de quartier à 500 mètres.", "Situation idéale : Au calme au fond d'une impasse, dans un écrin de verdure, à moins de 2 km du centre historique, accès rocade à 1 km, tous les commerces à proximité.",
} satisfies WebSite; } satisfies WebSite;
const defaultStructuredData = { const defaultStructuredData = {
@ -49,4 +50,4 @@ export const OG = {
title: `${SITE.title}`, title: `${SITE.title}`,
description: `${SITE.description}`, description: `${SITE.description}`,
image: ogImageSrc, image: ogImageSrc,
}; };

View file

@ -1,15 +1,12 @@
--- ---
// Importing necessary components
import Meta from "@components/Meta.astro"; import Meta from "@components/Meta.astro";
import Navbar from "@components/sections/navbar&footer/Navbar.astro"; import Navbar from "@components/sections/navbar&footer/Navbar.astro";
import FooterSection from "@components/sections/navbar&footer/FooterSection.astro"; import FooterSection from "@components/sections/navbar&footer/FooterSection.astro";
import { SITE } from "@data/constants"; import { SITE } from "@data/constants";
import type { Thing, WithContext } from "schema-dts"; import type { Thing, WithContext } from "schema-dts";
// Setting expected props
const { title = SITE.title, meta, structuredData, lang = "fr" } = Astro.props; const { title = SITE.title, meta, structuredData, lang = "fr" } = Astro.props;
// Interface to type-check the properties
interface Props { interface Props {
title?: string; title?: string;
meta?: string; meta?: string;
@ -18,18 +15,11 @@ interface Props {
} }
--- ---
<!--
This is the main structure for the page.
We set the language of the page to English and add classes for scrollbar and scroll behavior.
-->
<html lang={lang} class="scrollbar-hide lenis lenis-smooth scroll-pt-16"> <html lang={lang} class="scrollbar-hide lenis lenis-smooth scroll-pt-16">
<head> <head>
<!-- Adding metadata to the HTML document -->
<Meta meta={meta} structuredData={structuredData} /> <Meta meta={meta} structuredData={structuredData} />
<!-- Define the title of the page -->
<title>{title}</title> <title>{title}</title>
<script is:inline> <script is:inline>
// Script to handle dark mode. It will check if the theme is stored in localStorage or if dark theme is preferred by system settings
if ( if (
localStorage.getItem("hs_theme") === "dark" || localStorage.getItem("hs_theme") === "dark" ||
(!("hs_theme" in localStorage) && (!("hs_theme" in localStorage) &&
@ -44,14 +34,11 @@ We set the language of the page to English and add classes for scrollbar and scr
import "@scripts/lenisSmoothScroll.js"; import "@scripts/lenisSmoothScroll.js";
</script> </script>
<script is:inline defer data-domain="achat-maison-albi.fr" src="https://plausible.io/js/script.outbound-links.js"></script> <script is:inline defer data-domain="achat-maison-albi.fr" src="https://plausible.io/js/script.outbound-links.js"></script>
<script is:inline async src="https://www.googletagmanager.com/gtag/js?id=AW-16961312227"></script>
</head> </head>
<body <body
class="bg-neutral-200 selection:bg-yellow-400 selection:text-neutral-700 dark:bg-neutral-800" class="bg-neutral-200 selection:bg-yellow-400 selection:text-neutral-700 dark:bg-neutral-800"
> >
<!--
Setting up the main structure of the page.
The Navbar is placed at the top, with a slot for the main content and FooterSection at the bottom.
-->
<div class="mx-auto max-w-screen-2xl px-4 sm:px-6 lg:px-8"> <div class="mx-auto max-w-screen-2xl px-4 sm:px-6 lg:px-8">
<Navbar /> <Navbar />
<main> <main>
@ -72,3 +59,11 @@ We set the language of the page to English and add classes for scrollbar and scr
</style> </style>
</body> </body>
</html> </html>
<script is:inline>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-16961312227');
</script>

View file

@ -1,6 +1,6 @@
--- ---
import { websiteStructuredDescription } from "../data_files/constants"; import { websiteStructuredDescription } from "../data_files/constants";
import type {WebPage, WithContext } from "schema-dts"; import type { RealEstateListing, WithContext } from "schema-dts";
import MainLayout from "@/layouts/MainLayout.astro"; import MainLayout from "@/layouts/MainLayout.astro";
import HeroSection from "@components/sections/landing/HeroSection.astro"; import HeroSection from "@components/sections/landing/HeroSection.astro";
import HeroSectionAlt from "@components/sections/landing/HeroSectionAlt.astro"; import HeroSectionAlt from "@components/sections/landing/HeroSectionAlt.astro";
@ -21,16 +21,123 @@ import PrimaryCTA from "../components/ui/buttons/PrimaryCTA.astro";
const structuredDescription = { const structuredDescription = {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "WebPage", "@type": "RealEstateListing",
"@id": "https://achat-maison-albi.fr/", "@id": "https://achat-maison-albi.fr/",
"url": "https://achat-maison-albi.fr/", "url": "https://achat-maison-albi.fr/",
"name": "Belle maison individuelle de 183 m2 à vendre à Albi", "name": "Belle maison individuelle de 183 m2 avec piscine à vendre à Albi",
"description": "description":
"Belle maison individuelle de 183 m2 dans un écrin de verdure sur un terrain de 980 m2, non-mitoyenne, avec piscine, grande terrasse et garage. Sans vis-à-vis.", "Belle maison individuelle de 183 m2 dans un écrin de verdure sur un terrain de 980 m2, non-mitoyenne, avec piscine, grande terrasse et garage. Sans vis-à-vis.",
image: photoVuePiscine as unknown as string, "image": photoVuePiscine as unknown as string,
"isPartOf": websiteStructuredDescription, "isPartOf": websiteStructuredDescription,
"inLanguage": "fr-FR" "inLanguage": "fr-FR",
} satisfies WithContext<WebPage> "author": {
"@type": "Person",
"name": "Jalil Arfaoui"
},
"datePosted": "2024-03-27",
"about": {
"@type": "House",
"name": "Maison individuelle",
"description": "Belle maison individuelle de 183 m2 dans un écrin de verdure sur un terrain de 980 m2, non-mitoyenne, avec piscine, grande terrasse et garage. Sans vis-à-vis.",
"floorSize": {
"@type": "QuantitativeValue",
"value": 183,
"unitCode": "MTK"
},
"numberOfRooms": 8,
"numberOfBedrooms": 5,
"numberOfBathroomsTotal": 3,
"yearBuilt": "1977",
"accommodationCategory": "Maison",
"additionalProperty": [
{
"@type": "PropertyValue",
"name": "Surface du terrain",
"value": "980 m²"
},
{
"@type": "PropertyValue",
"name": "Type de chauffage",
"value": "Électrique et cheminée"
},
{
"@type": "PropertyValue",
"name": "Exposition",
"value": "Sud"
},
{
"@type": "PropertyValue",
"name": "Non-mitoyenne",
"value": "Oui"
},
{
"@type": "PropertyValue",
"name": "Taille de la piscine",
"value": "4m x 8m (50m³)"
}
],
"amenityFeature": [
{
"@type": "LocationFeatureSpecification",
"name": "Piscine",
"value": true,
"description": "Piscine de 4m x 8m (50m³)"
},
{
"@type": "LocationFeatureSpecification",
"name": "Terrasse",
"value": true,
"description": "Grande terrasse exposée plein sud sans vis-à-vis"
},
{
"@type": "LocationFeatureSpecification",
"name": "Garage",
"value": true,
"description": "Grand garage pour 2 voitures avec espace de rangement"
},
{
"@type": "LocationFeatureSpecification",
"name": "Jardin",
"value": true,
"description": "Jardin arboré de 980m² permettant de faire le tour de la maison"
},
{
"@type": "LocationFeatureSpecification",
"name": "Cheminée",
"value": true,
"description": "Cheminée fonctionnelle dans le salon"
},
{
"@type": "LocationFeatureSpecification",
"name": "Bureau équipé",
"value": true,
"description": "Grand bureau équipé, connecté et sécurisé"
},
{
"@type": "LocationFeatureSpecification",
"name": "Salle de jeux",
"value": true
},
{
"@type": "LocationFeatureSpecification",
"name": "Suite indépendante",
"value": true,
"description": "Suite avec salle d'eau, conçue pour héberger un couple avec enfants"
},
{
"@type": "LocationFeatureSpecification",
"name": "Buanderie",
"value": true
}
]
},
"offers": {
"@type": "Offer",
"price": "365000",
"priceCurrency": "EUR",
"availability": "https://schema.org/InStock"
}
} satisfies WithContext<RealEstateListing>
--- ---

View file

@ -39,7 +39,7 @@ export const GET: APIRoute = async () => {
const manifest = { const manifest = {
short_name: "Achat maison Albi", short_name: "Achat maison Albi",
name: "Maison indiduelle de 177m2 à vendre à Albi", name: "Maison 183m² avec piscine à vendre à Albi",
icons, icons,
display: "minimal-ui", display: "minimal-ui",
id: "/", id: "/",

View file

@ -4,16 +4,15 @@ import MainLayout from "@/layouts/MainLayout.astro";
import type { WebPage, WithContext } from "schema-dts"; import type { WebPage, WithContext } from "schema-dts";
import MainSection from "../components/ui/blocks/MainSection.astro"; import MainSection from "../components/ui/blocks/MainSection.astro";
import GrandePhotoCentrale from "../components/GrandePhotoCentrale.astro"; import GrandePhotoCentrale from "../components/GrandePhotoCentrale.astro";
import vueCathedrale from "@images/vue-albi-cathedrale-sainte-cecile.jpg" import vueCathedrale from "@images/vue-albi-cathedrale-sainte-cecile.jpg";
import PrimaryCTA from "../components/ui/buttons/PrimaryCTA.astro"; import PrimaryCTA from "../components/ui/buttons/PrimaryCTA.astro";
const structuredDescription = { const structuredDescription = {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "WebPage", "@type": "WebPage",
"@id": "https://achat-maison-albi.fr/quartier-cantepau", "@id": "https://achat-maison-albi.fr/quartier-cantepau",
"url": "https://achat-maison-albi.fr/quartier-cantepau", "url": "https://achat-maison-albi.fr/quartier-cantepau",
"name": "Maison individuelle en fond dimpasse à Cantepau", "name": "Maison individuelle en fond d'impasse à Cantepau",
"description": "Écoles, commerces, médiathèque et maison de quartier à 5 minutes à pied.", "description": "Écoles, commerces, médiathèque et maison de quartier à 5 minutes à pied.",
image: vueCathedrale as unknown as string, image: vueCathedrale as unknown as string,
"isPartOf": websiteStructuredDescription, "isPartOf": websiteStructuredDescription,
@ -23,7 +22,7 @@ const structuredDescription = {
--- ---
<MainLayout <MainLayout
title="Maison individuelle en fond dimpasse à Cantepau" title="Maison individuelle en fond d'impasse à Cantepau"
structuredData={structuredDescription} structuredData={structuredDescription}
> >
<MainSection <MainSection
@ -31,26 +30,65 @@ const structuredDescription = {
subTitle="Le quartier de Cantepau est extrêmement vivant et agréable à vivre, malgré sa réputation. La base de loisirs est située à 5 minutes à pied de la maison. Les commerces de Canteau également, ainsi que la maison de quartier et le terrain de sport. Le quartier de la Madeleine est au bout de la rue, à 15 minutes de marche, et le coeur historique est à 30 minutes." subTitle="Le quartier de Cantepau est extrêmement vivant et agréable à vivre, malgré sa réputation. La base de loisirs est située à 5 minutes à pied de la maison. Les commerces de Canteau également, ainsi que la maison de quartier et le terrain de sport. Le quartier de la Madeleine est au bout de la rue, à 15 minutes de marche, et le coeur historique est à 30 minutes."
> >
<p class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl"> <p class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
Limpasse donne directement accès à un chemin piéton qui longe et dessert les jardins partagés, autre aire de jeux pour nos enfants. L'impasse donne directement accès à un chemin piéton qui longe et dessert les jardins partagés, autre aire de jeux pour nos enfants.
</p> </p>
</MainSection> </MainSection>
<GrandePhotoCentrale src={vueCathedrale} alt="Vue du quartier de Cantepau, avec la maison en bas. À gauche, le Tarn et les jardins partagés, et au fond la Cathédrale dAlbi" /> <GrandePhotoCentrale src={vueCathedrale} alt="Vue du quartier de Cantepau, avec la maison en bas. À gauche, le Tarn et les jardins partagés, et au fond la Cathédrale d'Albi" />
<!-- Section Style de Vie -->
<MainSection
title="Un cadre de vie idéal pour les familles"
subTitle="Profitez d'un quotidien paisible avec tout à proximité"
>
<div class="grid grid-cols-1 gap-8 md:grid-cols-2">
<div class="space-y-4">
<h3 class="text-xl font-semibold text-neutral-800 dark:text-neutral-200">Activités quotidiennes</h3>
<ul class="space-y-2 text-neutral-600 dark:text-neutral-400">
<li>• Promenades le long du Tarn</li>
<li>• Terrains de sport et aires de jeux pour enfants</li>
<li>• Base de loisirs avec activités saisonnières</li>
<li>• Maison de quartier avec activités pour tous âges</li>
<li>• Jardins partagés</li>
</ul>
</div>
<div class="space-y-4">
<h3 class="text-xl font-semibold text-neutral-800 dark:text-neutral-200">Avantages en famille</h3>
<ul class="space-y-2 text-neutral-600 dark:text-neutral-400">
<li>• Impasse calme et sécurisante pour les enfants</li>
<li>• Trajets piétons vers les écoles</li>
<li>• Voisinage familial et convivial</li>
<li>• Pistes cyclables sécurisées vers le centre-ville</li>
</ul>
</div>
</div>
</MainSection>
<MainSection <MainSection
title="Un quartier en pleine transformation" title="Un quartier en pleine transformation"
subTitle="Dans le cadre de la convention de renouvellement “Cantepau demain”, un programme pluriannuel dinterventions conséquent est prévu sur la période 2019-2025." subTitle="Dans le cadre de la convention de renouvellement «Cantepau demain», un programme pluriannuel d'interventions conséquent est prévu sur la période 2019-2025."
> >
<p class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
De nouvelles infrastructures sont en train dêtre créées afin de développer le cadre et la qualité de vie des habitants :
</p>
<ul class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl"> <ul class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
<li>- la maison France services Albi Rive Droite</li> <li>- Une maison de quartier et une médiathèque fraichement rénovées (ouverture au 1er semestre 2025)</li>
<li>- la halte-garderie à la Négrouillère</li> <li>- La maison France services Albi Rive Droite</li>
<li>- la maison de quartier-centre social</li> <li>- Requalification du square Bonaparte avec espaces verts étendus</li>
<li>- une médiathèque (ouverture au 1er semestre 2025)</li> <li>- Nouveaux passages piétons</li>
</ul> </ul>
</MainSection> </MainSection>
<MainSection
title="Le moment idéal pour investir à Cantepau"
subTitle="Les experts immobiliers s'accordent: investir dans un quartier en transformation génère une plus-value significative sur le moyen terme"
>
<p class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
Plus de
<a class="font-medium text-orange-600 dark:text-orange-500 hover:underline" href="https://www.grand-albigeois.fr/projet/renovation-urbaine-cantepau-demain/" target="_blank">
70 millions deuros
</a>
investis pour de nouvelles infrastructures afin de développer le cadre et la qualité de vie des habitants :
</p>
</MainSection>
<div class="mb-8"> <div class="mb-8">
Vous voulez en savoir plus ? Vous voulez en savoir plus ?

View file

@ -2,16 +2,25 @@
import type { APIRoute } from "astro"; import type { APIRoute } from "astro";
const robotsTxt = ` const robotsTxt = `
User-agent: *
Allow: /
User-agent: Googlebot User-agent: Googlebot
Disallow: Allow: /
User-agent: Bingbot
Allow: /
User-agent: DuckDuckBot
Allow: / Allow: /
User-agent: Yandex User-agent: Yandex
Disallow: Allow: /
User-agent: Baiduspider
Allow: / Allow: /
User-agent: archive.org_bot User-agent: archive.org_bot
Disallow:
Allow: / Allow: /
Sitemap: ${new URL("sitemap-index.xml", import.meta.env.SITE).href} Sitemap: ${new URL("sitemap-index.xml", import.meta.env.SITE).href}