From 34fd3d2e1899ff7f0b6b8d6c7fbc2ddb23d5ae94 Mon Sep 17 00:00:00 2001 From: AdrianoDev Date: Sun, 5 Jul 2026 16:17:31 +0200 Subject: [PATCH] feat: tag contenuti home cards, team, metodo, partner, agenda --- src/components/Agenda.astro | 11 ++--- src/components/content/TImg.astro | 2 +- src/components/home/MethodSteps.astro | 17 ++++---- src/components/home/PartnersStrip.astro | 5 ++- src/components/home/ProgramsGrid.astro | 5 ++- src/components/home/TeamSection.astro | 23 +++++++---- src/components/home/TrainingCards.astro | 16 +++---- src/data/content-seed.ts | 55 +++++++++++++++++++++++++ src/pages/training.astro | 14 ++++--- 9 files changed, 108 insertions(+), 40 deletions(-) diff --git a/src/components/Agenda.astro b/src/components/Agenda.astro index db5839b..6dc3b68 100644 --- a/src/components/Agenda.astro +++ b/src/components/Agenda.astro @@ -1,20 +1,21 @@ --- import { agenda, disciplines, days, slots } from '../data/agenda'; +import T from './content/T.astro'; ---
-

Agenda

+
{disciplines.map((d, i) => ( - + ))}
- {days.map((d) =>
{d}
)} - {slots.map((slot) => ( + {days.map((_, i) => )} + {slots.map((slot, si) => ( <> -
{slot}
+ {days.map((_, dayIdx) => { const entry = agenda.find((e) => e.day === dayIdx && e.slot === slot); return entry diff --git a/src/components/content/TImg.astro b/src/components/content/TImg.astro index 6c92a75..3fcb915 100644 --- a/src/components/content/TImg.astro +++ b/src/components/content/TImg.astro @@ -4,7 +4,7 @@ import type { ImageMetadata } from 'astro'; import { getImageOverride } from '../../lib/content'; interface Props { tag: string; src: ImageMetadata; alt: string; - class?: string; loading?: 'lazy' | 'eager'; widths?: number[]; sizes?: string; + class?: string; loading?: 'lazy' | 'eager'; widths?: number[]; sizes?: string; height?: number; } const { tag, src, alt, class: cls, ...rest } = Astro.props; const override = getImageOverride(tag); diff --git a/src/components/home/MethodSteps.astro b/src/components/home/MethodSteps.astro index 2e5b670..17da6fe 100644 --- a/src/components/home/MethodSteps.astro +++ b/src/components/home/MethodSteps.astro @@ -1,26 +1,27 @@ --- -import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; -import { methodIntro, methodExtraNote, methodSteps } from '../../data/method'; +import { methodSteps } from '../../data/method'; +import T from '../content/T.astro'; +import TImg from '../content/TImg.astro'; const images = import.meta.glob<{ default: ImageMetadata }>('../../assets/img/method-*.{jpg,png}', { eager: true }); const imgOf = (name: string) => Object.entries(images).find(([p]) => p.includes(name))?.[1].default; ---
-

Il metodo
InsanityLab

-

Metodo Insanitylab')} /> + +

-

{methodExtraNote}

+
{methodSteps.map((s, i) => (
- {imgOf(s.image) && } + {imgOf(s.image) && } {s.n}
-

{s.title}

-

{s.text}

+ +
))}
diff --git a/src/components/home/PartnersStrip.astro b/src/components/home/PartnersStrip.astro index db60097..fea7bf5 100644 --- a/src/components/home/PartnersStrip.astro +++ b/src/components/home/PartnersStrip.astro @@ -1,13 +1,14 @@ --- -import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; import { partners } from '../../data/partners'; +import TImg from '../content/TImg.astro'; +import { t } from '../../lib/content'; const images = import.meta.glob<{ default: ImageMetadata }>('../../assets/img/partner-*.{jpg,png}', { eager: true }); const imgOf = (name: string) => Object.entries(images).find(([p]) => p.includes(name))?.[1].default; ---
- {partners.map((p) => imgOf(p.image) && {p.name})} + {partners.map((p, i) => imgOf(p.image) && )}
diff --git a/src/components/home/ProgramsGrid.astro b/src/components/home/ProgramsGrid.astro index 564b2b8..058fd6a 100644 --- a/src/components/home/ProgramsGrid.astro +++ b/src/components/home/ProgramsGrid.astro @@ -1,12 +1,13 @@ --- import { programs } from '../../data/programs'; import { programIcons as icons } from '../../data/program-icons'; +import T from '../content/T.astro'; ---
-

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) => ( diff --git a/src/components/home/TeamSection.astro b/src/components/home/TeamSection.astro index 64e1d19..baa0def 100644 --- a/src/components/home/TeamSection.astro +++ b/src/components/home/TeamSection.astro @@ -1,7 +1,9 @@ --- -import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; import { team, homeTeam } from '../../data/team'; +import T from '../content/T.astro'; +import TImg from '../content/TImg.astro'; +import { t } from '../../lib/content'; const images = import.meta.glob<{ default: ImageMetadata }>('../../assets/img/team-*.{jpg,png}', { eager: true }); const members = homeTeam.map((short) => team.find((m) => m.shortName === short)!).filter((m) => m.image); const imgOf = (name: string) => Object.entries(images).find(([p]) => p.includes(`${name}.`))?.[1].default; @@ -9,16 +11,19 @@ const imgOf = (name: string) => Object.entries(images).find(([p]) => p.includes(
-

Team
Trainer

- Scopri team + +
- {members.map((m, i) => ( -
- {m.name} -
{m.shortName}
-
- ))} + {members.map((m, i) => { + const slug = m.shortName.toLowerCase(); + return ( +
+ +
{m.shortName}
+
+ ); + })}
diff --git a/src/components/home/TrainingCards.astro b/src/components/home/TrainingCards.astro index ee5ec91..f8937a1 100644 --- a/src/components/home/TrainingCards.astro +++ b/src/components/home/TrainingCards.astro @@ -1,7 +1,9 @@ --- -import { Image } from 'astro:assets'; import type { ImageMetadata } from 'astro'; import { trainings } from '../../data/trainings'; +import T from '../content/T.astro'; +import TImg from '../content/TImg.astro'; +import { t } from '../../lib/content'; const images = import.meta.glob<{ default: ImageMetadata }>('../../assets/img/training-*.{jpg,png}', { eager: true }); const imgOf = (name: string) => Object.entries(images).find(([p]) => p.includes(name))?.[1].default; const tones = ['taupe', 'tan', 'dark', 'charcoal']; @@ -9,18 +11,18 @@ const tones = ['taupe', 'tan', 'dark', 'charcoal']; const isSwapRow = (i: number) => Math.floor(i / 2) % 2 === 1; ---
- {trainings.map((t, i) => { - const img = imgOf(t.image); + {trainings.map((tr, i) => { + const img = imgOf(tr.image); const card = (
-

{t.title}

-

{t.caption}

- Scopri → + + +
); const photo = img ? (
- {t.title} +
) : null; return isSwapRow(i) ? <>{photo}{card} : <>{card}{photo}; diff --git a/src/data/content-seed.ts b/src/data/content-seed.ts index dfecec8..9f54a09 100644 --- a/src/data/content-seed.ts +++ b/src/data/content-seed.ts @@ -1,5 +1,10 @@ import type { StyleGroup } from '../lib/style-presets'; import { site } from './site'; +import { trainings } from './trainings'; +import { team } from './team'; +import { methodIntro, methodExtraNote, methodSteps } from './method'; +import { partners } from './partners'; +import { disciplines, days, slots } from './agenda'; export type ContentType = 'text' | 'html' | 'image'; export interface SeedEntry { tag: string; type: ContentType; value: string; styleOptions?: StyleGroup[] } @@ -97,6 +102,56 @@ export const contentSeed: SeedEntry[] = [ H('home.quote.text', 'PERFORMANCE È SPINGERE OLTRE I PROPRI LIMITI, BALANCE È SAPERLI ASCOLTARE, LONGEVITY È COSTRUIRE NEL TEMPO CIÒ CHE DAVVERO CONTA.'), T('home.quote.cite', 'Insanitylab', []), I('home.quote.image'), + + // --- Home: training cards (data-driven da trainings.ts) --- + T('home.training-cards.link-label', 'Scopri', []), + ...trainings.flatMap((tr) => [ + T(`training.${tr.id}.title`, tr.title), + T(`training.${tr.id}.caption`, tr.caption), + T(`training.${tr.id}.description`, tr.description), + T(`training.${tr.id}.cta-label`, tr.cta.label, []), + I(`training.${tr.id}.image`), + ]), + + // --- Home: programmi --- + T('home.programs.title', 'Programmi'), + T('home.programs.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.'), + + // --- Home: team (data-driven da team.ts) --- + H('home.team.title', 'Team
Trainer'), + T('home.team.cta', 'Scopri team', []), + ...team.flatMap((m) => { + const slug = m.shortName.toLowerCase(); + return [ + T(`team.${slug}.name`, m.name, []), + T(`team.${slug}.role`, m.role, []), + T(`team.${slug}.bio`, m.bio), + I(`team.${slug}.image`), + I(`team.${slug}.image-about`), + ]; + }), + + // --- Home: metodo (data-driven da method.ts) --- + H('home.method.title', 'Il metodo
InsanityLab'), + H('method.intro', methodIntro.replace('Metodo Insanitylab', 'Metodo Insanitylab')), + T('method.extra-note', methodExtraNote, []), + ...methodSteps.flatMap((s) => [ + T(`method.step.${s.n}.title`, s.title), + T(`method.step.${s.n}.text`, s.text), + I(`method.step.${s.n}.image`), + ]), + + // --- Home: partner (data-driven da partners.ts) --- + ...partners.flatMap((p, i) => [ + T(`partner.${i + 1}.name`, p.name, []), + I(`partner.${i + 1}.image`), + ]), + + // --- Agenda (scope limitato: titolo, discipline, giorni, slot — celle escluse) --- + T('agenda.title', 'Agenda'), + ...disciplines.map((d, i) => T(`agenda.discipline.${i + 1}`, d, [])), + ...days.map((d, i) => T(`agenda.day.${i + 1}`, d, [])), + ...slots.map((s, i) => T(`agenda.slot.${i + 1}`, s, [])), // I task di estrazione aggiungono qui le entry di header/footer/pagine/data file. ]; diff --git a/src/pages/training.astro b/src/pages/training.astro index 7819879..7ddb083 100644 --- a/src/pages/training.astro +++ b/src/pages/training.astro @@ -6,6 +6,8 @@ import Agenda from '../components/Agenda.astro'; import { Image } from 'astro:assets'; import { trainings } from '../data/trainings'; import trialImg from '../assets/img/trial-class.jpg'; +import T from '../components/content/T.astro'; +import { t } from '../lib/content'; const images = import.meta.glob<{ default: ImageMetadata }>('../assets/img/training-*.{jpg,png}', { eager: true }); const imgOf = (name: string) => Object.entries(images).find(([p]) => p.includes(name))?.[1]?.default; export const prerender = true; @@ -23,13 +25,13 @@ export const prerender = true;
- {trainings.map((t, i) => ( -
- {imgOf(t.image) && {t.title}} + {trainings.map((tr, i) => ( +
+ {imgOf(tr.image) && {t(`training.${tr.id}.title`)}}
-

{t.title.toLowerCase()}

-

{t.description}

- {t.cta.label} +

{t(`training.${tr.id}.title`).toLowerCase()}

+ +
))}