feat: rinomina sezione Programmi in Servizi (route, tag, migrazione DB)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-05 20:23:48 +02:00
parent c975dcac12
commit 8ceea9b16f
20 changed files with 226 additions and 118 deletions
+40 -40
View File
@@ -5,7 +5,7 @@ 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 { services } from './services';
import { performanceClassPricing } from './pricing';
export type ContentType = 'text' | 'html' | 'image';
@@ -40,7 +40,7 @@ export const contentSeed: SeedEntry[] = [
H('footer.tagline', 'PERFORMANCE.&nbsp; BALANCE.&nbsp; LONGEVITY.'),
T('footer.about', 'Promuoviamo il movimento come cura di sé. Abitudini sostenibili per benessere fisico e mentale.'),
T('footer.col.training-title', 'Training'),
T('footer.col.programs-title', 'Programmi'),
T('footer.col.services-title', 'Servizi'),
T('footer.col.contact-title', 'Contact'),
H('footer.copyright', '<strong>Insanitylab</strong>, All Rights Reserved'),
T('footer.social-label', 'Seguici', []),
@@ -48,12 +48,12 @@ export const contentSeed: SeedEntry[] = [
T('footer.training.2.label', site.footerTraining[1].label, []),
T('footer.training.3.label', site.footerTraining[2].label, []),
T('footer.training.4.label', site.footerTraining[3].label, []),
T('footer.programs.1.label', site.footerPrograms[0].label, []),
T('footer.programs.2.label', site.footerPrograms[1].label, []),
T('footer.programs.3.label', site.footerPrograms[2].label, []),
T('footer.programs.4.label', site.footerPrograms[3].label, []),
T('footer.programs.5.label', site.footerPrograms[4].label, []),
T('footer.programs.6.label', site.footerPrograms[5].label, []),
T('footer.services.1.label', site.footerServices[0].label, []),
T('footer.services.2.label', site.footerServices[1].label, []),
T('footer.services.3.label', site.footerServices[2].label, []),
T('footer.services.4.label', site.footerServices[3].label, []),
T('footer.services.5.label', site.footerServices[4].label, []),
T('footer.services.6.label', site.footerServices[5].label, []),
// --- Contact form ---
T('form.field.first-name', 'Nome', []),
@@ -115,9 +115,9 @@ export const contentSeed: SeedEntry[] = [
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 unesperienza di allenamento completa e mirata.'),
// --- Home: servizi ---
T('home.services.title', 'Servizi'),
T('home.services.body', 'Questi sono i servizi delle classi di Insanity Lab selezionati per voi. Abbiamo scelto i migliori percorsi per offrirvi unesperienza di allenamento completa e mirata.'),
// --- Home: team (data-driven da team.ts) ---
H('home.team.title', 'Team<br />Trainer'),
@@ -223,40 +223,40 @@ 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ù →', []),
// --- Services: lista (/services) ---
T('services.meta.title', 'Servizi', []),
T('services.meta.description', 'I servizi InsanityLab: Personal Training, Performance Class, Coaching, Pilates Flow, Rehab e Nutrizione.', []),
T('services.hero.title', 'Servizi', []),
T('services.intro.title', 'Servizi'),
T('services.intro.body', "Questi sono i servizi delle classi di Insanity Lab selezionati per voi. Abbiamo scelto i migliori percorsi per offrirvi un'esperienza di allenamento completa e mirata."),
T('services.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)),
// --- Services: dettaglio (data-driven da services.ts) ---
...services.flatMap((p) => [
T(`service.${p.slug}.title`, p.title),
T(`service.${p.slug}.subtitle`, p.subtitle),
T(`service.${p.slug}.excerpt`, p.excerpt),
T(`service.${p.slug}.long-description`, p.longDescription),
...p.features.map((f, i) => T(`service.${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),
T(`service.${p.slug}.faq.${i + 1}.q`, item.q),
T(`service.${p.slug}.faq.${i + 1}.a`, item.a),
]),
I(`program.${p.slug}.image`),
I(`service.${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. <a href="/contact">Scrivici →</a>'),
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', []),
// --- Services: dettaglio, template ---
T('service.side.categories-label', 'Categorie'),
T('service.side.category.1', 'Fitness', []),
T('service.side.category.2', 'Salute', []),
T('service.side.category.3', 'Stile di vita', []),
T('service.side.category.4', 'Nutrizione', []),
T('service.side.others-label', 'Altri servizi'),
H('service.pricing.empty-note', 'Contattaci per i dettagli di questo servizio. <a href="/contact">Scrivici →</a>'),
T('service.pricing.per', 'al mese, semestrale', []),
T('service.pricing.entries-singular', 'ingresso settimanale', []),
T('service.pricing.entries-plural', 'ingressi settimanali', []),
T('service.pricing.buy-cta', 'Acquista', []),
// --- Pricing performance class (data-driven da pricing.ts; monthly/entries restano nel data file) ---
T('pricing.heading', performanceClassPricing.heading),
@@ -1,5 +1,5 @@
// Path SVG (stroke, viewBox 0 0 24 24) delle icone programmi, condivisi tra griglia home e sidebar
export const programIcons: Record<string, string> = {
// Path SVG (stroke, viewBox 0 0 24 24) delle icone servizi, condivisi tra griglia home e sidebar
export const serviceIcons: Record<string, string> = {
'personal-training': 'M4 12h3m10 0h3M9 8v8m6-8v8M7 10v4m10-4v4',
'performance-class': 'M13 3l-2 7h4l-6 11 2-8H7l4-10z',
'coaching': 'M12 3a4 4 0 110 8 4 4 0 010-8zm-7 18a7 7 0 0114 0',
@@ -1,4 +1,4 @@
export interface Program {
export interface Service {
slug: string;
title: string;
subtitle: string;
@@ -9,7 +9,7 @@ export interface Program {
hasPricing: boolean;
}
export const programs: Program[] = [
export const services: Service[] = [
{
slug: "personal-training",
title: "Personal Training",
@@ -99,6 +99,6 @@ export const programs: Program[] = [
},
];
export function getProgram(slug: string): Program | undefined {
return programs.find((p) => p.slug === slug);
export function getService(slug: string): Service | undefined {
return services.find((p) => p.slug === slug);
}
+8 -8
View File
@@ -13,7 +13,7 @@ export const site = {
navigation: [
{ label: "Insanitylab", href: "/about" },
{ label: "Training", href: "/training" },
{ label: "Programmi", href: "/programs" },
{ label: "Servizi", href: "/services" },
{ label: "Blog & Edugo", href: "/blog" },
{ label: "Contatti", href: "/contact" },
],
@@ -23,12 +23,12 @@ export const site = {
{ label: "Performance class", href: "/training#performance-class" },
{ label: "Fit remote", href: "/training#fit-remote" },
],
footerPrograms: [
{ label: "Personal Training", href: "/programs/personal-training" },
{ label: "Performance Class", href: "/programs/performance-class" },
{ label: "Coaching", href: "/programs/coaching" },
{ label: "Rehab", href: "/programs/rehab" },
{ label: "Pilates Flow", href: "/programs/pilates-flow" },
{ label: "Nutrizione", href: "/programs/nutrition" },
footerServices: [
{ label: "Personal Training", href: "/services/personal-training" },
{ label: "Performance Class", href: "/services/performance-class" },
{ label: "Coaching", href: "/services/coaching" },
{ label: "Rehab", href: "/services/rehab" },
{ label: "Pilates Flow", href: "/services/pilates-flow" },
{ label: "Nutrizione", href: "/services/nutrition" },
],
};
+1 -1
View File
@@ -1,6 +1,6 @@
export const trainings = [
{ id: "one-to-one", title: "One to One", caption: "Allenamento con un trainer dedicato", image: "training-one-to-one", description: "Allenati con un trainer dedicato che costruisce un percorso su misura per i tuoi obiettivi. Ogni sessione one to one è pensata per migliorare performance, tecnica e risultati. Supporto costante, attenzione totale e allenamenti personalizzati per dare il massimo.", cta: { label: "Contattaci", href: "/contact" } },
{ id: "small-groups", title: "Small Groups", caption: "Mini gruppi (max 3 persone) con trainer dedicato", image: "training-small-groups", description: "Allenati in mini gruppi da massimo 3 persone con un trainer dedicato. Unesperienza small group che unisce attenzione personalizzata, motivazione e condivisione. Programmi mirati e supporto costante per raggiungere i tuoi obiettivi insieme.", cta: { label: "Contattaci", href: "/contact" } },
{ id: "performance-class", title: "Performance Class", caption: "Classi fino a 8 persone con trainer certificato", image: "training-performance-class", description: "Allenati in classi fino a 8 persone guidate da trainer certificati. Sessioni dinamiche ad alta intensità pensate per migliorare forza, resistenza e performance. Energia, motivazione e allenamenti strutturati per dare il massimo in ogni workout.", cta: { label: "Scopri", href: "/programs/performance-class" } },
{ id: "performance-class", title: "Performance Class", caption: "Classi fino a 8 persone con trainer certificato", image: "training-performance-class", description: "Allenati in classi fino a 8 persone guidate da trainer certificati. Sessioni dinamiche ad alta intensità pensate per migliorare forza, resistenza e performance. Energia, motivazione e allenamenti strutturati per dare il massimo in ogni workout.", cta: { label: "Scopri", href: "/services/performance-class" } },
{ id: "fit-remote", title: "Fit Remote", caption: "Piano di allenamento su misura, ovunque ti alleni.", image: "training-fit-remote", description: "Con Fit Remote hai un piano di allenamento su misura, ovunque ti alleni. Programmi personalizzati creati sui tuoi obiettivi, da seguire in palestra, a casa o in viaggio. Supporto costante e allenamenti pensati per adattarsi al tuo stile di vita.", cta: { label: "Contattaci", href: "/contact" } },
] as const;