Routes
The page is served at four URLs, one per locale:
The default-locale route lives at
src/pages/tufting.astro; the other three variants are generated via the src/pages/[lang]/tufting.astro dynamic route using getStaticPaths.
Page component
src/components/landings/TuftingLanding.astro
The component is composed from shared landing primitives:
LandingHero— eyebrow, headline, lead copy, primary CTA button, hero imageLandingSection— reusable titled content section (used for “What is tufting?” and the group formats band)Faq— native<details>/<summary>accordion, no JS, keyboard accessibleCourseSchema— emits theCourse+AggregateOfferJSON-LD blockFinalCta— bottom-of-page WhatsApp booking CTA
LandingSection) because it deliberately widens to calc(var(--layout-max-width) * 1.3) so the four price cards sit less cramped on a single row on desktop.
SEO metadata
Resolved fromsrc/i18n/ui.ts via the LandingPage layout:
Individual formats
Four formats are defined as an inline array inTuftingLanding.astro — real values from the i18n/ui.ts catalog. All formats include materials and the instructor’s guidance.
Each format card renders a
<dl> of specs (size, duration, price) and a WhatsApp CTA button with a pre-filled message. The i18n keys for those messages are:
The Pelusa and Floc formats share the same 50×50 cm canvas; the difference is time on the frame (4 h vs 6 h), which allows for a more refined design and finishing in Floc.
Group formats section
Below the individual formats the page renders a two-column grid linking to the two group-session products:Pelussetes
Express group tufting for birthdays, hen parties, celebrations and events. Each person creates their own 50×50 cm tapestry. 2 hours · from 68€/person · min. 5 people.
Team Building
The corporate version — a creative team activity where participants make a tufted wrist rest together. 2 hours · 68€/person · min. 5 people · materials included.
localizedPath(lang, '/pelussetes') and localizedPath(lang, '/team-building') so they resolve to the correct locale prefix at build time.
WhatsApp CTA
The primary hero CTA and the final-CTA section both usewaHref(t('wa.tuf.landing')), which encodes the landing’s generic pre-filled message:
JSON-LD: CourseSchema
<CourseSchema> is rendered outside the <article> element at the bottom of the file. It emits a Course schema with an AggregateOffer covering the full individual price range:
lowPrice: 78, highPrice: 181, priceCurrency: EUR, enabling Google’s course rich results.
FAQ
Three questions from thetuf.faq.* keys, rendered via the shared <Faq> component:
- Do I need prior experience? — None; the instructor guides the whole process from handling the gun to the finishing.
- Do I take the piece home the same day? — In individual format, yes during the session; drying time is confirmed at booking.
- What does the price include? — All materials (fabric, yarn, use of the tufting gun) and instructor guidance.