The home page is the primary conversion surface for Borrissol Espai Creatiu — a single-page landing assembled from ten sequential sections, each handled by its own Astro component. It is served in four languages atDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/constanza101/borrissol/llms.txt
Use this file to discover all available pages before exploring further.
/ (Catalan, the default locale), /es, /en, and /fr. Every language variant is a statically pre-rendered HTML file; no client-side routing is involved. All visible copy is resolved at build time through useTranslations(lang) — there are zero hardcoded strings in the component templates.
Section inventory
Each section lives insrc/components/sections/ and receives translated strings via the shared t() helper. The ordering below matches the DOM order in index.astro.
| Section | Component | Purpose |
|---|---|---|
| Hero | HeroSection.astro | H1 headline, SEO subtitle, full-bleed image with logo overlay and CTA |
| Offer | OfferSection.astro | Workshop technique cards (Tufting, Needle Felting, Punch Needle, Weaving) |
| Workshops | WorkshopsSection.astro | Tufting format pricing accordion + other workshop cards |
| Process | ProcessSection.astro | 5-step “zero to piece” visual flow |
| Testimonials | TestimonialsSection.astro | Google Maps review carousel with arrow navigation |
| Press Strip | PressStrip.astro | Condensed media coverage teaser linking to /press |
| About | AboutSection.astro | Studio founding story, founder video, recycled-yarn materials section |
| FAQ | FAQSection.astro | Native <details>/<summary> accordion — zero JavaScript |
| CTA | CTASection.astro | Final WhatsApp booking call-to-action |
| Footer | Footer.astro | Navigation links, legal copy, social links |
The DOM render order in
index.astro places Workshops before Process — WorkshopsSection renders immediately after OfferSection, followed by ProcessSection. The table above reflects the actual render order.H1 copy by language
The hero headline (hero.headline key in src/i18n/ui.ts) is the page H1. It is the same phrase translated into each locale:
| Locale | URL prefix | H1 |
|---|---|---|
| Catalan (default) | / | Art que connecta |
| Spanish | /es | Arte que conecta |
| English | /en | Art that connects |
| French | /fr | L’art qui connecte |
hero.seo) — visible text beneath the H1 — and an image overlay (hero.overlay) positioned over the bottom-left of the full-bleed hero photograph.
Language routing
Catalan default
src/pages/index.astro — served at /. No URL prefix. getLangFromUrl() returns 'ca' for this root route.ES / EN / FR
src/pages/[lang]/index.astro — a single dynamic route file that handles all three non-default locales via getStaticPaths, generating /es, /en, and /fr at build time./gallery and /press. The blog is Catalan-only and has no [lang] variant.
Anchor navigation
The top navbar links scroll to in-page sections using hash anchors. All section IDs are in English regardless of the active language, so the anchors are stable across locale switches:Additional UX features
WhatsApp FAB
WhatsAppFab.astro — a fixed floating action button stacked with the scroll-to-top button. Pre-filled WhatsApp messages are localised per language via wa.general / wa.cta keys in ui.ts.Cookie banner
CookieBanner.astro + PrivacySection.astro — implements Google Consent Mode v2 Advanced. GA4 loads cookieless by default; cookies are only granted after explicit accept. Consent state is persisted in localStorage.Scroll-to-top
Fixed button stacked below the WhatsApp FAB. Appears after the user scrolls past the hero, implemented in vanilla JS with no framework dependency.
Scroll reveal
Layout.astro sets up an IntersectionObserver that adds a .is-visible class to elements with reveal or load-anim classes as they enter the viewport. Respects prefers-reduced-motion.Structured data (JSON-LD)
Two JSON-LD schemas are injected bySeo.astro on the home page:
Component import order in index.astro
PrivacySection is rendered outside <main> — it is a visually hidden accordion that surfaces inline privacy/cookie policy text for compliance, without a dedicated /privacy page.
Page-level background
The home page sets a global background override so the hero blends into the page chrome while inner sections revert to--color-white via their own component styles: