diff --git a/src/data/content-seed.ts b/src/data/content-seed.ts index 936b7a8..d4db795 100644 --- a/src/data/content-seed.ts +++ b/src/data/content-seed.ts @@ -5,6 +5,8 @@ import { team } from './team'; import { methodIntro, methodExtraNote, methodSteps } from './method'; import { partners } from './partners'; import { disciplines, days, slots } from './agenda'; +import { programs } from './programs'; +import { performanceClassPricing } from './pricing'; export type ContentType = 'text' | 'html' | 'image'; export interface SeedEntry { tag: string; type: ContentType; value: string; styleOptions?: StyleGroup[] } @@ -221,6 +223,53 @@ export const contentSeed: SeedEntry[] = [ T('about.timeline.stage2.text', 'Contenuto in arrivo: il cliente fornirà il testo di questa tappa.'), T('about.timeline.stage3.label', 'INSANITYLAB OGGI', []), T('about.timeline.stage3.text', 'Contenuto in arrivo: il cliente fornirà il testo di questa tappa.'), + // --- Programs: lista (/programs) --- + T('programs.meta.title', 'Programmi', []), + T('programs.meta.description', 'I programmi InsanityLab: Personal Training, Performance Class, Coaching, Pilates Flow, Rehab e Nutrizione.', []), + T('programs.hero.title', 'Programmi', []), + T('programs.intro.title', 'Programmi'), + T('programs.intro.body', "Questi sono i programmi delle classi di Insanity Lab selezionati per voi. Abbiamo scelto i migliori percorsi per offrirvi un'esperienza di allenamento completa e mirata."), + T('programs.card.more-label', 'Per saperne di più →', []), + + // --- Programs: dettaglio (data-driven da programs.ts) --- + ...programs.flatMap((p) => [ + T(`program.${p.slug}.title`, p.title), + T(`program.${p.slug}.subtitle`, p.subtitle), + T(`program.${p.slug}.excerpt`, p.excerpt), + T(`program.${p.slug}.long-description`, p.longDescription), + ...p.features.map((f, i) => T(`program.${p.slug}.feature.${i + 1}`, f)), + ...p.faq.flatMap((item, i) => [ + T(`program.${p.slug}.faq.${i + 1}.q`, item.q), + T(`program.${p.slug}.faq.${i + 1}.a`, item.a), + ]), + I(`program.${p.slug}.image`), + ]), + + // --- Programs: dettaglio, template --- + T('program.side.categories-label', 'Categorie'), + T('program.side.category.1', 'Fitness', []), + T('program.side.category.2', 'Salute', []), + T('program.side.category.3', 'Stile di vita', []), + T('program.side.category.4', 'Nutrizione', []), + T('program.side.others-label', 'Altri programmi'), + H('program.pricing.empty-note', 'Contattaci per i dettagli di questo programma. Scrivici →'), + T('program.pricing.per', 'al mese, semestrale', []), + T('program.pricing.entries-singular', 'ingresso settimanale', []), + T('program.pricing.entries-plural', 'ingressi settimanali', []), + T('program.pricing.buy-cta', 'Acquista', []), + + // --- Pricing performance class (data-driven da pricing.ts; monthly/entries restano nel data file) --- + T('pricing.heading', performanceClassPricing.heading), + T('pricing.intro', performanceClassPricing.intro), + ...performanceClassPricing.groups.flatMap((g, gi) => [ + T(`pricing.group.${gi + 1}.label`, g.label), + ...g.plans.flatMap((plan, pi) => [ + T(`pricing.group.${gi + 1}.plan.${pi + 1}.note`, plan.note, []), + T(`pricing.group.${gi + 1}.plan.${pi + 1}.installments`, plan.installments, []), + T(`pricing.group.${gi + 1}.plan.${pi + 1}.best`, plan.best, []), + ]), + ]), + // I task di estrazione aggiungono qui le entry di header/footer/pagine/data file. ]; diff --git a/src/pages/programs/[slug].astro b/src/pages/programs/[slug].astro index 260fcc4..ae079db 100644 --- a/src/pages/programs/[slug].astro +++ b/src/pages/programs/[slug].astro @@ -1,59 +1,62 @@ --- import Base from '../../layouts/Base.astro'; import PageHero from '../../components/PageHero.astro'; -import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; import { programs } from '../../data/programs'; import { performanceClassPricing } from '../../data/pricing'; import { programIcons } from '../../data/program-icons'; +import T from '../../components/content/T.astro'; +import TImg from '../../components/content/TImg.astro'; +import { t } from '../../lib/content'; export const prerender = true; export function getStaticPaths() { return programs.map((p) => ({ params: { slug: p.slug }, props: { program: p } })); } const { program } = Astro.props; +const slug = program.slug; const others = programs.filter((p) => p.slug !== program.slug); const images = import.meta.glob<{ default: ImageMetadata }>('../../assets/img/program-*.jpg', { eager: true }); const imgOf = (slug: string) => Object.entries(images).find(([p]) => p.includes(`program-${slug}.`))?.[1]?.default; const heroImg = imgOf(program.slug); -// Categorie come da Figma (Performance class.pdf), non quelle del blog -const categories = ['Fitness', 'Salute', 'Stile di vita', 'Nutrizione']; +// Categorie come da Figma (Performance class.pdf), non quelle del blog → tag program.side.category.1-4 +const categoryIndexes = [1, 2, 3, 4]; // Ordine card pricing come da Figma: tan, taupe, dark const tones = ['tan', 'taupe', 'dark']; --- - - + +
-

{program.title.toUpperCase()}

-

{program.longDescription}

+

{t(`program.${slug}.title`).toUpperCase()}

+
    - {program.features.map((f) =>
  • {f}
  • )} + {program.features.map((_, i) => )}
{heroImg && ( - {program.title} + )}
- {program.faq.map((item, i) => ( + {program.faq.map((_, i) => (
- {item.q} -

{item.a}

+ +
))}
@@ -64,25 +67,25 @@ const tones = ['tan', 'taupe', 'dark'];
-

{performanceClassPricing.heading}

-

{performanceClassPricing.intro}

+ +
- {performanceClassPricing.groups.map((g) => ( + {performanceClassPricing.groups.map((g, gi) => (
- {g.open ? '+' : '–'} {g.label} + {g.open ? '+' : '–'} {g.plans.length === 0 ? ( -

Contattaci per i dettagli di questo programma. Scrivici →

+ ) : (
{g.plans.map((p, i) => (

{p.monthly}€

-

al mese, semestrale

-

{p.entries} {p.entries === 1 ? 'ingresso settimanale' : 'ingressi settimanali'}

-

{p.note}

-

{p.installments}

-

{p.best}

- Acquista + +

{p.entries} {p.entries === 1 ? t('program.pricing.entries-singular') : t('program.pricing.entries-plural')}

+ + + + {t('program.pricing.buy-cta')}
))}
diff --git a/src/pages/programs/index.astro b/src/pages/programs/index.astro index 90f0530..9fb8554 100644 --- a/src/pages/programs/index.astro +++ b/src/pages/programs/index.astro @@ -1,34 +1,36 @@ --- import Base from '../../layouts/Base.astro'; import PageHero from '../../components/PageHero.astro'; -import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; import { programs } from '../../data/programs'; +import T from '../../components/content/T.astro'; +import TImg from '../../components/content/TImg.astro'; +import { t } from '../../lib/content'; const images = import.meta.glob<{ default: ImageMetadata }>('../../assets/img/program-*.jpg', { eager: true }); const imgOf = (slug: string) => Object.entries(images).find(([p]) => p.includes(`program-${slug}.`))?.[1]?.default; export const prerender = true; --- - - + +
-

Programmi

-

Questi sono i programmi delle classi di Insanity Lab selezionati per voi. Abbiamo scelto i migliori percorsi per offrirvi un'esperienza di allenamento completa e mirata.

+ +
{programs.map((p, i) => ( ))}