Compare commits

...

10 commits

10 changed files with 222 additions and 65 deletions

View file

@ -37,11 +37,6 @@ const socialImage = structuredData?.image?.src
? (Astro.url.origin + structuredData.image.src)
: Astro.url.origin + socialImageRes.src; // Get the full URL of the image (https://stackoverflow.com/a/9858694)
const languages: { [key: string]: string } = {
en: "",
fr: "fr",
};
function createHref(lang: string, prefix: string, path: string): string {
const hasPrefix = path.startsWith(`/${prefix}/`);

View file

@ -1,7 +1,7 @@
---
import { Image } from "astro:assets";
import { LightboxImage } from "@components/LightboxImage";
import photoBureau from "@images/grand-bureau-tout-equipe.jpg";
import PrimaryCTA from "../ui/buttons/PrimaryCTA.astro";
---
<section
@ -29,8 +29,7 @@ import photoBureau from "@images/grand-bureau-tout-equipe.jpg";
loading="eager"
/>
</a>
<LightboxImage client:idle image={photoBureau}
alt="Grand bureau tout équipé, bois massif, bureau ajustable en hauteur, grande fresque murale">
</LightboxImage>
<div class="my-4 max-w-64 mx-auto">
<PrimaryCTA title="Voir le bureau" url="/avec-un-grand-bureau/" />
</div>
</section>

View file

@ -18,15 +18,17 @@ interface Props {
>
<div class="max-w-screen-md">
<h1
class="mb-4 text-balance text-4xl font-extrabold tracking-tight text-neutral-800 dark:text-neutral-200"
class="text-balance text-4xl font-extrabold tracking-tight text-neutral-800 dark:text-neutral-200"
>
{title}
</h1>
<p
class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl"
>
{subTitle}
</p>
{
subTitle && (
<p class="mt-4 mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
{subTitle}
</p>
)
}
<slot />
{
btnTitle && btnURL ? (

View file

@ -1,7 +1,7 @@
[
{
"heading": "Plein pied",
"content": "Majoritairement de plein pied, la maison est organisée autour de sa grande terrasse orientée plein sud et accessible depuis toutes les pièces de vie, sans vis-à-vis.",
"heading": "Plain-pied",
"content": "Majoritairement de plain-pied, la maison est organisée autour de sa grande terrasse orientée plein sud et accessible depuis toutes les pièces de vie, sans vis-à-vis.",
"svg": "groups"
},
{

View file

@ -7,7 +7,7 @@ import { SITE } from "@data/constants";
import type { Thing, WithContext } from "schema-dts";
// Setting expected props
const { title = SITE.title, meta, structuredData, lang = "en" } = Astro.props;
const { title = SITE.title, meta, structuredData, lang = "fr" } = Astro.props;
// Interface to type-check the properties
interface Props {

View file

@ -1,47 +1,24 @@
---
// Import section components
import MainLayout from "@/layouts/MainLayout.astro";
import Btn404 from "@components/ui/buttons/Btn404.astro";
import { SITE } from "@data/constants";
// Define types for translations
type TranslationKeys = "en" | "fr";
type Translations = {
[key in TranslationKeys]: {
pageTitle: string;
subTitle: string;
content: string;
btnTitle: string;
};
type Texts = {
pageTitle: string;
subTitle: string;
content: string;
btnTitle: string;
};
// Define variables for page content
const defaultLang: TranslationKeys = "en";
const translations: Translations = {
en: {
pageTitle: `Page Not Found | ${SITE.title}`,
subTitle: "Oops, this isn't the tool you were looking for!",
content:
"Don't let this hiccup slow you down. Let's get you back to building your masterpiece.",
btnTitle: "Go Back",
},
fr: {
pageTitle: `Page Non Trouvée | ${SITE.title}`,
subTitle: "Oops, ce n'est pas l'outil que vous recherchiez!",
content:
"Ne laissez pas ce contretemps vous ralentir. Revenons à la construction de votre chef-d'œuvre.",
btnTitle: "Retournez",
},
const texts: Texts = {
pageTitle: `Page Non Trouvée | ${SITE.title}`,
subTitle: "Oops, ce n'est pas l'outil que vous recherchiez!",
content:
"Ne laissez pas ce contretemps vous ralentir. Revenons à la construction de votre chef-d'œuvre.",
btnTitle: "Retournez",
};
// Determine language from the URL
const urlPath = Astro.url.pathname;
const langCodeMatch = urlPath.match(/^\/(en|fr)\//);
const lang: TranslationKeys = langCodeMatch
? (langCodeMatch[1] as TranslationKeys)
: defaultLang;
const { pageTitle, subTitle, content, btnTitle } = translations[lang];
const { pageTitle, subTitle, content, btnTitle } = texts;
---
<MainLayout title={pageTitle}>

View file

@ -0,0 +1,76 @@
---
import { websiteStructuredDescription } from "../data_files/constants";
import MainLayout from "@/layouts/MainLayout.astro";
import type { WebPage, WithContext } from "schema-dts";
import MainSection from "../components/ui/blocks/MainSection.astro";
import GrandePhotoCentrale from "../components/GrandePhotoCentrale.astro";
import photo1 from "@images/suite-du-bas-1.jpg"
import photo2 from "@images/suite-du-bas-2.jpg"
import photoSalleDEau1 from "@images/suite-du-bas-salle-d-eau-1.jpg"
import photoSalleDEau2 from "@images/suite-du-bas-salle-d-eau-2.jpg"
import PrimaryCTA from "../components/ui/buttons/PrimaryCTA.astro";
const structuredDescription = {
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https://achat-maison-albi.fr/avec-une-belle-suite/",
"url": "https://achat-maison-albi.fr/avec-une-belle-suite/",
"name": "Maison individuelle avec une grande suite à Albi",
"description":
"Idéal pour les familles nombreuses ! 5 chambres dont une suite, 3 salles deau dans cette belle maison individuelle de 177 m2.",
"isPartOf": websiteStructuredDescription,
"image": photo1 as unknown as string,
"inLanguage": "fr-FR"
} satisfies WithContext<WebPage>
---
<MainLayout
title="Suite avec salle deau"
structuredData={structuredDescription}
>
<MainSection
title="Suite avec salle deau"
subTitle="Transformée en suite en 2019, cette chambre a été conçue pour héberger de manière très confortable une famille avec enfants."
>
<p class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
Tête de lit sur mesure avec prises de courant, radiateur à grande inertie, sol en revêtement Bolon…
</p>
</MainSection>
<div class="flex gap-4">
<div class="flex-1">
<GrandePhotoCentrale src={photo1} alt="Chambre avec vue sur limpasse" className="w-auto h-full max-h-[500px] object-contain mx-auto"/>
</div>
<div class="flex-1">
<GrandePhotoCentrale src={photo2} alt="Vue sur la salle deau depuis la fenêtre" className="w-auto h-full max-h-[500px] object-contain mx-auto" />
</div>
</div>
<MainSection
title="Salle deau"
subTitle="Nous avons fait réaliser cette salle chambre avec les meilleurs matériaux ! Nous avons fait intervenir des professionnels sérieux."
>
<p class="mb-8 max-w-prose text-pretty font-normal text-neutral-600 dark:text-neutral-400 sm:text-xl">
La transformation de lancien garage en suite a été confiée à <a class="text-orange-500" target="_blank" href="https://www.delphine-eche.fr/">Delphine Eche</a><br/>
Nous avons toutes les factures de tous les artisans et la garantie décennale bien entendu.
</p>
</MainSection>
<div class="flex gap-4">
<div class="flex-1">
<GrandePhotoCentrale src={photoSalleDEau1} alt="Grand vasque sur meuble en bois massif sur-mesure" className="w-auto h-full max-h-[500px] object-contain mx-auto"/>
</div>
<div class="flex-1">
<GrandePhotoCentrale src={photoSalleDEau2} alt="Douche et WC suspendu" className="w-auto h-full max-h-[500px] object-contain mx-auto" />
</div>
</div>
<div class="mb-8">
Vous voulez en savoir plus ?
<PrimaryCTA title="Faire le tour des pièces" url="/pieces" />
</div>
</MainLayout>

View file

@ -1,4 +1,6 @@
---
import { websiteStructuredDescription } from "../data_files/constants";
import type {WebPage, WithContext } from "schema-dts";
import MainLayout from "@/layouts/MainLayout.astro";
import HeroSection from "@components/sections/landing/HeroSection.astro";
import HeroSectionAlt from "@components/sections/landing/HeroSectionAlt.astro";
@ -15,10 +17,24 @@ import photoRenovation2 from "@images/renovation-qualite.jpg";
import photoFondDImpasse from "@images/fond-d-impasse-albi.jpg";
import photoVuePiscine from "@images/vue-de-la-piscine.jpg";
import photoVueZenith from "@images/vue-zenith.jpg";
import PrimaryCTA from "../components/ui/buttons/PrimaryCTA.astro";
const structuredDescription = {
"@context": "https://schema.org",
"@type": "WebPage",
"@id": "https://achat-maison-albi.fr/",
"url": "https://achat-maison-albi.fr/",
"name": "Belle maison individuelle de 177 m2 à vendre à Albi",
"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.",
image: photoVuePiscine as unknown as string,
"isPartOf": websiteStructuredDescription,
"inLanguage": "fr-FR"
} satisfies WithContext<WebPage>
---
<MainLayout>
<MainLayout structuredData={structuredDescription}>
<HeroSection
title=`Maison individuelle de 177 m2 à <span
class="text-yellow-500 dark:text-yellow-400">Albi</span>`
@ -33,13 +49,13 @@ import photoVueZenith from "@images/vue-zenith.jpg";
<p class="mt-3 text-pretty text-lg leading-relaxed text-neutral-700 dark:text-neutral-400 lg:w-4/5 mx-auto">
Majoritairement de plein pied, la maison est organisée autour de sa grande terrasse orientée plein sud et accessible depuis toutes les pièces de vie, sans vis-à-vis.
Majoritairement de plain-pied, la maison est organisée autour de sa grande terrasse orientée plein sud et accessible depuis toutes les pièces de vie, sans vis-à-vis.
</p><p class="mt-3 text-pretty text-lg leading-relaxed text-neutral-700 dark:text-neutral-400 lg:w-4/5 mx-auto">
La cuisine refaite en 2017 est ouverte sur la grande pièce de vie lumineuse qui se termine par une cheminée fonctionnelle. Lentrée permet de passer directement de lavant de la maison à la terrasse et distribue efficacement la cuisine, le salon, les toilettes, lespace nuit et létage inférieur.
</p><p class="mt-3 text-pretty text-lg leading-relaxed text-neutral-700 dark:text-neutral-400 lg:w-4/5 mx-auto">
Lespace nuit est bien séparé, également lumineux et bien organisé : 2 grandes chambres et une belle salle deau refaite en 2018. Un passage par la salle de jeu, qui ouvre sur la terrasse, permet de rejoindre lespace enfant : 2 grandes chambres plein sud, reliées par une salle deau commune, et par un dégagement qui offre grands placards et toilette.
</p><p class="mt-3 text-pretty text-lg leading-relaxed text-neutral-700 dark:text-neutral-400 lg:w-4/5 mx-auto">
Létage inférieur de la maison, semi-enterré, a été entièrement refait en 2019. Anciennement un garage et une salle de jeux que nous avons transformé en un grand bureau équipé, connecté et sécurisé, ainsi quune suite avec salle d'eau, conçue pour héberger un couple avec enfants.
Létage inférieur de la maison a été entièrement refait en 2019. Anciennement un garage et une salle de jeux que nous avons transformé en un grand bureau équipé, connecté et sécurisé, ainsi quune suite avec salle d'eau, conçue pour héberger un couple avec enfants.
</p><p class="mt-3 text-pretty text-lg leading-relaxed text-neutral-700 dark:text-neutral-400 lg:w-4/5 mx-auto">
Piscine de 50 m3 et vue sur le Tarn. Le jardin permet de faire le tour de la maison et offre plusieurs recoins.
</p><p class="mt-3 text-pretty text-lg leading-relaxed text-neutral-700 dark:text-neutral-400 lg:w-4/5 mx-auto">
@ -54,6 +70,10 @@ import photoVueZenith from "@images/vue-zenith.jpg";
features={features}
/>
<div class="max-w-64 mx-auto">
<PrimaryCTA title="Tour des pièces" url="/pieces/" />
</div>
<FeaturesNavs
title=`Des espaces pour <span class="text-yellow-500 dark:text-yellow-400">toute la famille</span>.`
tabs={[

View file

@ -1,20 +1,26 @@
---
import { Image } from "astro:assets";
import MainLayout from "@/layouts/MainLayout.astro";
import MainSection from "@components/ui/blocks/MainSection.astro";
import LeftSection from "@components/ui/blocks/LeftSection.astro";
import RightSection from "@components/ui/blocks/RightSection.astro";
import FeaturesStats from "@components/sections/features/FeaturesStats.astro";
import BureauSection from "@components/sections/BureauSection.astro";
import photoSalonCheminee from "@images/salon-cheminee.jpg";
import photoSalonCuisine from "@images/salon-1.jpg";
import photoCuisine from "@images/cuisine-1.jpg";
import photoChambreEnfantEst from "@images/chambre-enfant-est-grand-angle.jpg";
import photoChambreEnfantOuest from "@images/chambre-enfant-ouest-grand-angle-2.jpg";
import photoSalleDeJeux from "@images/salle-de-jeux.jpg"
import photoSuite1 from "@images/suite-du-bas-1.jpg";
import photoParentale from "@images/chambre-parentale.jpg";
import photoSalleDEau from "@images/salle-d-eau-1.jpg";
import photoChambre2 from "@images/chambre-2.jpg";
import photoDeLaPiscine from "@images/vue-piscine.jpg"
import vueCathedrale from "@images/vue-albi-cathedrale-sainte-cecile.jpg"
import photoVueAerienne from "@images/vue-aerienne-face-1.jpg"
import photoTerrasse from "@images/terrasse-5.jpg"
import { websiteStructuredDescription } from "../data_files/constants";
import BureauSection from "../components/sections/BureauSection.astro";
interface Article {
isRightSection: boolean;
@ -32,13 +38,13 @@ interface Article {
imgTwoAlt?: string;
}
const articles: Article[] = [
const pieces: Article[] = [
{
isRightSection: true,
title: "Grande pièce de vie lumineuse",
subTitle: "Exposée plein sud, la pièce de vie principale est baignée de lumière, tout en restant fraiche lété. " +
"Elle offre un accès fluide à la terrasse à travers ses 3 portes-fenêtre." +
"Majoritairement de plein-pied, la maison est organisée autour de sa grande terrasse orientée plein sud et accessible depuis toutes les pièces de vie, sans vis-à-vis.",
"Majoritairement de plain-pied, la maison est organisée autour de sa grande terrasse orientée plein sud et accessible depuis toutes les pièces de vie, sans vis-à-vis.",
single: false,
imgOne: photoSalonCheminee,
imgOneAlt: "Vue du salon depuis la cuisine, avec la cheminée au fond",
@ -99,10 +105,21 @@ const articles: Article[] = [
},
{
isRightSection: false,
title: "Suite du bas",
subTitle: "Létage inférieur de la maison, semi-enterré, a été entièrement refait en 2019. Lancienne salle de jeux a été complètement rénovée et transformée en une suite avec salle d'eau, conçue pour héberger un couple avec enfants. La meilleure chambre de la maison ?",
title: "Salle de jeux",
subTitle:
"Troisième chambre avant lextension de 1990, cet espace riche en rangements relie lespace nuit principal, lespace des enfants et la terrasse. ",
img: photoSalleDeJeux,
imgAlt: "Photo de la salle de jeux, qui relie lespace nuit principal, lespace des enfants et la terrasse. ",
},
{
isRightSection: false,
title: "Suite avec salle deau",
subTitle: "Létage inférieur de la maison a été entièrement refait en 2019. Lancienne salle de jeux a été complètement rénovée et transformée en une suite avec salle d'eau, conçue pour héberger un couple avec enfants. La meilleure chambre de la maison ?",
img: photoSuite1,
imgAlt: "Grande suite du bas. La meilleure chambre de la maison ?",
btnTitle: "Entrer dans la suite",
btnURL: "/avec-une-belle-suite/",
btnExists: true
}
];
@ -131,7 +148,7 @@ const pageTitle: string = `Pièces de la maison | 177m2 à vendre à Albi`;
/>
{
articles.map(article => {
pieces.map(article => {
return article.isRightSection ? (
<RightSection
title={article.title}
@ -181,4 +198,62 @@ const pageTitle: string = `Pièces de la maison | 177m2 à vendre à Albi`;
},
]}
/>
<MainSection title="Et aussi" subTitle="" />
<div class="flex flex-col md:flex-row w-full">
<div class="flex-1 h-64 m-4">
<h3 class="text-xl font-bold m-2">Une piscine</h3>
<a href="/avec-piscine/">
<Image
src={photoDeLaPiscine}
alt="Une grande piscine de 50m3 dans un écrin composé de la terrasse et de verdure"
width={400}
densities={[1, 1.5, 2]}
class:list={["w-full object-cover object-center rounded-lg m-2"]}
loading="eager"
/>
</a>
</div>
<div class="flex-1 h-64 m-4">
<h3 class="text-xl font-bold m-2">Une terrasse</h3>
<a href="/avec-terrasse/">
<Image
src={photoTerrasse}
alt="Une grande piscine de 50m3 dans un écrin composé de la terrasse et de verdure"
width={400}
densities={[1, 1.5, 2]}
class:list={["w-full object-cover object-center rounded-lg m-2"]}
loading="eager"
/>
</a>
</div>
<div class="flex-1 h-64 m-4">
<h3 class="text-xl font-bold m-2">Limpasse</h3>
<a href="/dans-une-impasse/">
<Image
src={photoVueAerienne}
alt="Une grande piscine de 50m3 dans un écrin composé de la terrasse et de verdure"
width={400}
densities={[1, 1.5, 2]}
class:list={["w-full h-full object-cover object-center rounded-lg m-2 h-64"]}
loading="eager"
/>
</a>
</div>
<div class="flex-1 m-4">
<h3 class="text-xl font-bold m-2">Le quartier</h3>
<a href="/quartier-cantepau/">
<Image
src={vueCathedrale}
alt="Une grande piscine de 50m3 dans un écrin composé de la terrasse et de verdure"
width={400}
densities={[1, 1.5, 2]}
class:list={["w-full object-cover object-center rounded-lg m-2 h-64"]}
loading="eager"
/>
</a>
</div>
</div>
</MainLayout>

View file

@ -11,8 +11,21 @@ const navBarLinks = [
const footerLinks = [
{
section: "La maison",
links: [{ name: "Pièces", url: "/pieces/" }],
section: "Intérieur",
links: [
{ name: "Bureau", url: "/avec-un-grand-bureau/" },
{ name: "Suite", url: "/avec-une-belle-suite/" },
{ name: "Toutes les pièces", url: "/pieces/" },
],
},
{
section: "Extérieur",
links: [
{ name: "Terrasse", url: "/avec-terrasse/" },
{ name: "Piscine", url: "/avec-piscine/" },
{ name: "Impasse", url: "/dans-une-impasse/" },
{ name: "Quartier", url: "/quartier-cantepau/" },
],
},
{
section: "Contact",