Modifiche chieste dal cliente il 17 agosto
Il documento MODIFICHE_PER_SITO.pdf porta cinque cose.
1. "Small Group" si chiama "Personalized Training Group". Il nome vive anche
nel database dei contenuti, dove `resolveContent` legge prima della copia
nel codice: `scripts/testi-17-agosto.mjs` aggiorna le 19 righe rimaste,
una volta sola, correggendo anche gli articoli ("Lo Small Group" -> "Il
Personalized Training Group"). Lo slug della scheda resta `small-group`:
cambiarlo romperebbe i link gia' girati su WhatsApp.
2. Dalla pagina Servizi le card instradano dove serve. "One to One" apre la
vista Training con One to One, Personalized Training Group e Rehab;
"Class" quella con Holistic e Reformer. Le viste sono `/training/<vista>`;
una vista inventata e' 404, non l'elenco intero, altrimenti un indirizzo
rotto continuerebbe a sembrare buono.
3. La Performance Class non si eroga piu': la scheda che la spiegava
risponde 404, la card "Class" resta in griglia. Con la scheda e' caduta la
tabella prezzi, che era solo sua.
4. Il Check-up racconta Base e Avanzato: trafiletto nuovo nella card e
sezione "Check-up Avanzato" nella scheda, con la Wellness Tower e i cinque
punti. Il calendario delle class si apre ora anche dalla card Class in
griglia e dalla scheda Reformer, oltre che da Holistic.
5. "Promo ed eventi" diventa una pagina di scelta: le promozioni restano su
/promo-eventi/promo, l'inaugurazione del 19 settembre sta su
/promo-eventi/eventi. Il testo dice che il programma della giornata manca
ancora, ed e' editabile dal pannello.
Corretti due link del footer che portavano a schede inesistenti
(`/services/personal-training` non e' mai stato uno slug).
181 test verdi (157 + 24 nuovi), build ok, `astro check` invariato.
This commit is contained in:
+16
-2
@@ -146,8 +146,22 @@ export function avvisiAttivi(now: Date, list: AvvisoCalendario[] = avvisi): Avvi
|
||||
.sort((x, y) => Date.parse(x.to) - Date.parse(y.to));
|
||||
}
|
||||
|
||||
/** Servizi dalla cui pagina si apre il calendario della sala. */
|
||||
export const SERVIZI_CON_CALENDARIO = ['performance-class', 'holistic-class'];
|
||||
/**
|
||||
* Le schede servizio da cui si apre il calendario della sala.
|
||||
*
|
||||
* Sono le due class che si fanno davvero: la Performance Class è uscita di scena il
|
||||
* 17/08/2026 (il cliente non la eroga più) e con lei la sua scheda.
|
||||
*/
|
||||
export const PAGINE_CON_CALENDARIO = ['holistic-class', 'reformer-class'];
|
||||
|
||||
/**
|
||||
* Le card della griglia /services che portano il bottone del calendario.
|
||||
*
|
||||
* È un elenco a parte, e non un doppione del precedente: nella griglia la card si chiama
|
||||
* «Class» ma ha slug `performance-class`, e da lì si va alla vista Training con Holistic e
|
||||
* Reformer. Il calendario è lo stesso, il punto da cui si apre no.
|
||||
*/
|
||||
export const CARD_CON_CALENDARIO = ['performance-class'];
|
||||
|
||||
export interface CalendarioMostrato {
|
||||
cal: Calendario;
|
||||
|
||||
@@ -222,7 +222,7 @@ export const contentSeed: SeedEntry[] = [
|
||||
T('about.storylab.title', 'Storylab'),
|
||||
T('about.storylab.body', 'Scopri la nostra storia: come nasce InsanityLab, perché abbiamo deciso di creare qualcosa di diverso e chi sono i visionari che hanno trasformato questa idea in un nuovo modo di vivere benessere, movimento e salute.'),
|
||||
T('about.timeline.label', 'INSANITYLAB 2021-2024', []),
|
||||
T('about.timeline.open-text', "Il percorso di crescita di InsanityLab si è sviluppato attraverso tappe precise e coerenti con la visione iniziale. Nato nel 2021 con un piccolo team e grandi ambizioni, il progetto ha conosciuto una forte evoluzione nel 2024, anno in cui il servizio si è ampliato attraverso nuovi format come gli small group e una sempre maggiore specializzazione nella profilazione fisica del cliente, grazie a sistemi avanzati di valutazione e monitoraggio. Parallelamente, anche l'area dedicata alla riabilitazione e all'esercizio preventivo si è consolidata, ponendo le basi per un importante salto di qualità."),
|
||||
T('about.timeline.open-text', "Il percorso di crescita di InsanityLab si è sviluppato attraverso tappe precise e coerenti con la visione iniziale. Nato nel 2021 con un piccolo team e grandi ambizioni, il progetto ha conosciuto una forte evoluzione nel 2024, anno in cui il servizio si è ampliato attraverso nuovi format come i Personalized Training Group e una sempre maggiore specializzazione nella profilazione fisica del cliente, grazie a sistemi avanzati di valutazione e monitoraggio. Parallelamente, anche l'area dedicata alla riabilitazione e all'esercizio preventivo si è consolidata, ponendo le basi per un importante salto di qualità."),
|
||||
T('about.timeline.stage1.label', 'INSANITYLAB 2025', []),
|
||||
T('about.timeline.stage1.text', 'Contenuto in arrivo: il cliente fornirà il testo di questa tappa.'),
|
||||
T('about.timeline.stage2.label', 'INSANITYLAB 2026', []),
|
||||
@@ -231,7 +231,7 @@ export const contentSeed: SeedEntry[] = [
|
||||
T('about.timeline.stage3.text', 'Contenuto in arrivo: il cliente fornirà il testo di questa tappa.'),
|
||||
// --- Services: lista (/services) ---
|
||||
T('services.meta.title', 'Servizi', []),
|
||||
T('services.meta.description', 'I servizi InsanityLab: Personal Training, Performance Class, Coaching, Profilazione, Osteopatia e Nutrizione.', []),
|
||||
T('services.meta.description', 'I servizi InsanityLab: Personal Training, Class, Coaching, Check-up, Osteopatia e Nutrizione.', []),
|
||||
T('services.hero.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ù →', []),
|
||||
@@ -247,6 +247,13 @@ export const contentSeed: SeedEntry[] = [
|
||||
T(`service.${p.slug}.faq.${i + 1}.q`, item.q),
|
||||
T(`service.${p.slug}.faq.${i + 1}.a`, item.a),
|
||||
]),
|
||||
...(p.extra
|
||||
? [
|
||||
T(`service.${p.slug}.extra.title`, p.extra.title),
|
||||
T(`service.${p.slug}.extra.body`, p.extra.body),
|
||||
...p.extra.items.map((it, i) => T(`service.${p.slug}.extra.item.${i + 1}`, it)),
|
||||
]
|
||||
: []),
|
||||
I(`service.${p.slug}.image`),
|
||||
]),
|
||||
|
||||
@@ -277,8 +284,9 @@ export const contentSeed: SeedEntry[] = [
|
||||
|
||||
// --- Training: meta, hero, intro, trial ---
|
||||
T('training.meta.title', 'Training', []),
|
||||
T('training.meta.description', 'One to One, Small Group, Rehab, Holistic Class, Reformer Class e Coaching: trova il training InsanityLab più adatto a te.', []),
|
||||
T('training.meta.description', 'One to One, Personalized Training Group, Rehab, Holistic Class, Reformer Class e Coaching: trova il training InsanityLab più adatto a te.', []),
|
||||
T('training.hero.title', 'training', []),
|
||||
T('training.tutti.cta-label', 'Vedi tutti i training', []),
|
||||
T('training.intro.subtitle', 'Porta i tuoi allenamenti al livello successivo: programmi completi e percorsi su misura. Trova il training più adatto alle tue esigenze.'),
|
||||
|
||||
// --- Contact ---
|
||||
@@ -293,6 +301,28 @@ export const contentSeed: SeedEntry[] = [
|
||||
T('contact.info.email-label', 'E-mail'),
|
||||
T('contact.invite', 'Per informazioni o per richiedere una consulenza iniziale, compila il form. Un team specializzato ti accoglierà e ti ricontatterà al più presto, oppure lasciaci il tuo contatto.'),
|
||||
|
||||
// --- Promo ed eventi: scelta (/promo-eventi) ---
|
||||
T('promo-eventi.meta.title', 'Promo ed eventi', []),
|
||||
T('promo-eventi.meta.description', 'Le promozioni in corso e gli eventi di InsanityLab, a partire dall’inaugurazione del nuovo spazio.', []),
|
||||
T('promo-eventi.hero.title', 'Promo ed eventi', []),
|
||||
T('promo-eventi.intro', 'Scegli cosa vuoi vedere: le promozioni attive in questo momento oppure gli eventi in programma al centro.'),
|
||||
T('promo-eventi.promo.label', 'Promo'),
|
||||
T('promo-eventi.promo.desc', 'I pacchetti e le offerte del periodo, con prezzi e condizioni.'),
|
||||
T('promo-eventi.promo.nessuna', 'Nessuna promozione in corso', []),
|
||||
T('promo-eventi.promo.cta', 'Vedi le promo', []),
|
||||
T('promo-eventi.eventi.label', 'Eventi'),
|
||||
T('promo-eventi.eventi.desc', 'Le date da segnare: aperture, presentazioni e appuntamenti in sede.'),
|
||||
T('promo-eventi.eventi.cta', 'Vedi gli eventi', []),
|
||||
|
||||
// --- Eventi (/promo-eventi/eventi) ---
|
||||
T('eventi.meta.title', 'Eventi', []),
|
||||
T('eventi.meta.description', 'Gli eventi InsanityLab: inaugurazione del nuovo spazio il 19 settembre 2026, con aperitivo e dj set.', []),
|
||||
T('eventi.hero.title', 'Eventi', []),
|
||||
T('eventi.inaugurazione.title', 'Inaugurazione — 19 settembre 2026'),
|
||||
T('eventi.inaugurazione.body', 'Apriamo le porte del nuovo spazio con un aperitivo e dj set. Sarà l’occasione per conoscere lo staff, visitare la struttura e prenotare una prova gratuita dei nostri servizi. Il programma completo della giornata sarà pubblicato a breve.'),
|
||||
T('eventi.cta.label', 'Scrivici su WhatsApp', []),
|
||||
T('eventi.torna.label', '← Torna a promo ed eventi', []),
|
||||
|
||||
// --- 404 ---
|
||||
T('notfound.meta.title', 'Pagina non trovata', []),
|
||||
T('notfound.eyebrow', 'Errore 404', []),
|
||||
@@ -327,10 +357,10 @@ export const contentSeed: SeedEntry[] = [
|
||||
T('promo.card.1.feature.2', 'Check-up con profilazione fisica, il tuo punto di partenza'),
|
||||
T('promo.card.1.feature.3', 'PT dedicato, presente a ogni sessione'),
|
||||
T('promo.card.1.feature.4', 'In-sanity plan, il tuo programma personalizzato'),
|
||||
// Card 2 — Small Group (in evidenza)
|
||||
// Card 2 — Personalized Training Group (in evidenza)
|
||||
T('promo.card.2.badge', 'Più scelto', []),
|
||||
T('promo.card.2.eyebrow', 'Personal training', []),
|
||||
T('promo.card.2.title', 'Small Group'),
|
||||
T('promo.card.2.title', 'Personalized Training Group'),
|
||||
T('promo.card.2.price', '125 €', []),
|
||||
T('promo.card.2.price-old', '220 €', []),
|
||||
T('promo.card.2.unit', '5 incontri', []),
|
||||
@@ -373,12 +403,12 @@ export const contentSeed: SeedEntry[] = [
|
||||
// presenti nei DB non verrebbero riscritti dall'INSERT OR IGNORE del seed).
|
||||
T('promo.faq.0.q', 'Come faccio ad acquistare i pacchetti?'),
|
||||
H('promo.faq.0.a', 'Clicca sull\'icona del pacchetto che desideri acquistare e compila tutti i campi richiesti per completare la registrazione.<br><br>Una volta terminata l\'iscrizione, riceverai un\'email con le istruzioni per scaricare la nostra app <span class="hl">Bsport</span>. Dopo aver effettuato l\'accesso, entra nella sezione <span class="hl">Club</span>: qui troverai tutti i pacchetti disponibili. Seleziona quello che preferisci e completa l\'acquisto direttamente dall\'app effettuando il pagamento.<br><br>Se hai bisogno di aiuto scrivi su <span class="hl">WhatsApp ({{whatsapp}})</span> e sarai presto ricontattato!'),
|
||||
T('promo.faq.1.q', 'Come funziona il pacchetto a incontri per One to One e Small Group?'),
|
||||
T('promo.faq.1.q', 'Come funziona il pacchetto a incontri per One to One e Personalized Training Group?'),
|
||||
H('promo.faq.1.a', 'Per acquistare il pacchetto online segui le istruzioni riportate nella risposta della prima domanda. Una volta avvenuto con successo l\'acquisto, potrai contattarci scrivendoci su <span class="hl">WhatsApp ({{whatsapp}})</span> per prenotare lo screening iniziale ovvero il colloquio conoscitivo per la definizione dei tuoi obiettivi. Verrai ricontattato subito tramite messaggio o chiamata! Gli incontri sono validi 2 mesi dalla data del primo incontro e comunque non oltre il 1° dicembre 2026.'),
|
||||
T('promo.faq.2.q', 'Come funziona il percorso Reformer o Holistic Class?'),
|
||||
H('promo.faq.2.a', 'Per acquistare il pacchetto online segui le istruzioni riportate nella risposta della prima domanda. Una volta scaricata l\'app <span class="hl">Bsport</span> e acquistato il pacchetto potrai procedere a selezionare autonomamente la class che preferisci nel giorno e nell\'orario che desideri. Gli orari delle class saranno pubblicati entro Settembre. In caso di problemi contattaci su <span class="hl">WhatsApp ({{whatsapp}})</span>! Gli incontri sono validi 2 mesi dalla data del primo incontro e comunque non oltre il 1° dicembre 2026.'),
|
||||
T('promo.faq.3.q', 'Posso usare gli incontri su servizi diversi?'),
|
||||
H('promo.faq.3.a', 'Ogni pacchetto è dedicato a un singolo servizio (<span class="hl">One to One</span>, <span class="hl">Small Group</span>, <span class="hl">Reformer</span> o <span class="hl">Holistic Class</span>). Se vuoi accedere a più servizi puoi acquistare pacchetti separati per ciascuno.'),
|
||||
H('promo.faq.3.a', 'Ogni pacchetto è dedicato a un singolo servizio (<span class="hl">One to One</span>, <span class="hl">Personalized Training Group</span>, <span class="hl">Reformer</span> o <span class="hl">Holistic Class</span>). Se vuoi accedere a più servizi puoi acquistare pacchetti separati per ciascuno.'),
|
||||
T('promo.faq.4.q', 'Posso regalare un pacchetto a qualcun altro?'),
|
||||
H('promo.faq.4.a', 'Sì. Puoi acquistare il pacchetto a tuo nome — per la fatturazione — e farlo utilizzare a un\'altra persona: perfetto se vuoi fare un regalo a un amico o un familiare. Ti basterà comunicarci chi userà gli incontri quando ci scriverai su <span class="hl">WhatsApp ({{whatsapp}})</span> per organizzare le sessioni.'),
|
||||
T('promo.faq.5.q', 'Il pagamento è sicuro?'),
|
||||
|
||||
+39
-8
@@ -13,12 +13,24 @@ export interface Service {
|
||||
/** false = pagina dettaglio esiste ma la voce non compare nella griglia /services
|
||||
* (usata come approfondimento dai riquadri Training: Rehab, Holistic, Reformer). */
|
||||
grid?: boolean;
|
||||
/** Dove porta la card (foto e "Per saperne di più"). Assente = la scheda del servizio.
|
||||
* Serve per le card che instradano a una vista di /training invece che a una scheda. */
|
||||
href?: string;
|
||||
/** false = nessuna pagina dettaglio: /services/<slug> risponde 404.
|
||||
* La voce resta in griglia con il proprio `href`. */
|
||||
page?: boolean;
|
||||
/** Sezione in coda alla scheda, oltre alla descrizione principale.
|
||||
* Tag: service.<slug>.extra.title | .body | .item.N */
|
||||
extra?: { title: string; body: string; items: string[] };
|
||||
}
|
||||
|
||||
export const services: Service[] = [
|
||||
{
|
||||
slug: "one-to-one",
|
||||
title: "One to One",
|
||||
// La card di /services porta alla vista Training con One to One, Personalized Training
|
||||
// Group e Rehab: è come il cliente vuole instradare chi cerca l'allenamento seguito.
|
||||
href: "/training/one-to-one",
|
||||
heroTitle: "Personal Training",
|
||||
subtitle: "Allenamento con un trainer dedicato",
|
||||
excerpt: "L’allenamento One to One di InsanityLab è un percorso su misura, seguito da un professionista dedicato, per raggiungere in modo sicuro ed efficace obiettivi di forma fisica, performance e benessere.",
|
||||
@@ -33,13 +45,13 @@ export const services: Service[] = [
|
||||
},
|
||||
{
|
||||
slug: "small-group",
|
||||
title: "Small Group",
|
||||
title: "Personalized Training Group",
|
||||
subtitle: "Mini gruppi (max 4 persone) con trainer dedicato",
|
||||
excerpt: "Lo Small Group di InsanityLab è un allenamento in mini gruppi da massimo 4 persone con un trainer dedicato, che unisce attenzione personalizzata, motivazione e condivisione.",
|
||||
longDescription: "Allenati in mini gruppi da massimo 4 persone con un trainer dedicato. Un’esperienza small group che unisce attenzione personalizzata, motivazione e condivisione: programmi mirati e supporto costante per raggiungere i tuoi obiettivi insieme, senza rinunciare alla cura del singolo.",
|
||||
excerpt: "Il Personalized Training Group di InsanityLab è un allenamento in mini gruppi da massimo 4 persone con un trainer dedicato, che unisce attenzione personalizzata, motivazione e condivisione.",
|
||||
longDescription: "Allenati in mini gruppi da massimo 4 persone con un trainer dedicato. Un’esperienza Personalized Training Group che unisce attenzione personalizzata, motivazione e condivisione: programmi mirati e supporto costante per raggiungere i tuoi obiettivi insieme, senza rinunciare alla cura del singolo.",
|
||||
features: [],
|
||||
faq: [
|
||||
{ q: "Quante persone ci sono in un Small Group?", a: "Massimo 4 persone per gruppo, così il trainer può seguire ciascuno con attenzione." },
|
||||
{ q: "Quante persone ci sono in un Personalized Training Group?", a: "Massimo 4 persone per gruppo, così il trainer può seguire ciascuno con attenzione." },
|
||||
{ q: "Con quale frequenza ci si allena?", a: "La frequenza viene definita insieme al trainer in base a obiettivi, disponibilità e livello di partenza." },
|
||||
{ q: "È adatto a chi parte da zero?", a: "Sì: il percorso è costruito sul livello dei partecipanti, con progressioni graduali e supervisione costante." },
|
||||
],
|
||||
@@ -47,8 +59,14 @@ export const services: Service[] = [
|
||||
grid: false,
|
||||
},
|
||||
{
|
||||
// La Performance Class non si fa più (cliente, 17/08/2026): la scheda che la spiegava
|
||||
// sparisce (`page: false` → /services/performance-class risponde 404) mentre la card
|
||||
// "Class" resta in griglia e porta alla vista Training con Holistic e Reformer.
|
||||
// Il pricing è caduto con la scheda: era l'unico servizio ad averlo.
|
||||
slug: "performance-class",
|
||||
title: "Class",
|
||||
href: "/training/class",
|
||||
page: false,
|
||||
subtitle: "Gruppo max 8 persone",
|
||||
excerpt: "La Performance Class è un allenamento in piccoli gruppi, basato su una programmazione progressiva che combina forza e condizionamento per ottenere risultati concreti e costanti nel tempo.",
|
||||
longDescription: "La Performance Class è un allenamento in piccoli gruppi con programmazione progressiva e scientifica, pensato per migliorare forza, composizione corporea e performance attraverso sessioni strutturate che combinano forza, ipertrofia e condizionamento metabolico. Non si improvvisa: ogni sessione ha un posto preciso all’interno di un piano più ampio.",
|
||||
@@ -61,7 +79,7 @@ export const services: Service[] = [
|
||||
{ q: "Che tipo di risultati o miglioramenti si ottengono?", a: "Miglioramento di forza, composizione corporea e performance, con risultati concreti e costanti nel tempo." },
|
||||
{ q: "Qual è l’intensità del lavoro?", a: "Alternata: fasi di bassa, media e alta intensità all’interno della stessa sessione, adattate al livello dei partecipanti." },
|
||||
],
|
||||
hasPricing: true,
|
||||
hasPricing: false,
|
||||
},
|
||||
{
|
||||
slug: "coaching",
|
||||
@@ -81,9 +99,9 @@ export const services: Service[] = [
|
||||
// NB: sostituisce "Pilates Flow" (il Pilates confluisce nella Holistic Class in Training).
|
||||
// Copy BOZZA basata sul metodo ISL (profilazione fisica) — da confermare col cliente.
|
||||
slug: "profilazione",
|
||||
title: "Profilazione",
|
||||
subtitle: "Check-up e valutazione fisica",
|
||||
excerpt: "La profilazione fisica è il punto di partenza del metodo InsanityLab: una valutazione completa che definisce lo stato di salute iniziale e le priorità del percorso.",
|
||||
title: "Check-up",
|
||||
subtitle: "Base e avanzato",
|
||||
excerpt: "Il Check-up Base fotografa la tua condizione di partenza e rappresenta il punto di inizio del metodo InsanityLab. Attraverso la profilazione e la valutazione fisica definiamo lo stato di salute iniziale e le priorità del percorso.\n\nIl Check-up Avanzato va oltre: con macchinari di ultima generazione misuriamo composizione corporea, parametri vitali, spirometria, HRV — un’analisi completa e scientifica che guida le nostre scelte.",
|
||||
longDescription: "Attraverso check-up, plicometria e analisi antropometriche misuriamo composizione corporea, postura e stato di forma. I dati raccolti guidano la costruzione di un programma personalizzato e permettono di monitorare i progressi nel tempo.",
|
||||
features: ["Check-up fisico iniziale", "Plicometria e analisi antropometriche", "Definizione delle priorità del percorso", "Monitoraggio periodico dei progressi"],
|
||||
faq: [
|
||||
@@ -91,6 +109,19 @@ export const services: Service[] = [
|
||||
{ q: "Che cosa comprende?", a: "Check-up fisico, plicometria e analisi antropometriche; alcune misurazioni avanzate sono disponibili su richiesta." },
|
||||
],
|
||||
hasPricing: false,
|
||||
// Il testo della scheda descrive il Check-up Base; l'Avanzato è la parte aggiunta il
|
||||
// 17/08/2026 su richiesta del cliente, con la Wellness Tower e i sensori HRV.
|
||||
extra: {
|
||||
title: "Check-up Avanzato",
|
||||
body: "Con la Wellness Tower, tecnologia di ultima generazione, andiamo oltre: bioimpedenza, scansione posturale 3D e spirometria restituiscono un quadro completo e oggettivo del tuo corpo. A completare il quadro, misuriamo anche l’HRV attraverso sensori dedicati — un dato chiave per capire come il tuo corpo recupera e si adatta al carico di lavoro. Ogni dato raccolto guida scelte più precise nella costruzione del programma e nel monitoraggio dei progressi.",
|
||||
items: [
|
||||
"Composizione corporea di precisione (massa grassa, magra, metabolismo basale)",
|
||||
"Scansione posturale 3D e analisi di simmetria",
|
||||
"Spirometria e parametri cardiovascolari",
|
||||
"Analisi HRV tramite sensori dedicati",
|
||||
"Report immediato, confrontabile nel tempo",
|
||||
],
|
||||
},
|
||||
},
|
||||
{
|
||||
// NB: sostituisce "Rehab" nella pagina Servizi (il Rehab si sposta in Training).
|
||||
|
||||
+4
-4
@@ -21,17 +21,17 @@ export const site = {
|
||||
],
|
||||
footerTraining: [
|
||||
{ label: "One to one", href: "/training#one-to-one" },
|
||||
{ label: "Small group", href: "/training#small-groups" },
|
||||
{ label: "Personalized Training Group", href: "/training#small-groups" },
|
||||
{ label: "Rehab", href: "/training#rehab" },
|
||||
{ label: "Holistic class", href: "/training#holistic-class" },
|
||||
{ label: "Reformer class", href: "/training#reformer-class" },
|
||||
{ label: "Coaching", href: "/training#coaching" },
|
||||
],
|
||||
footerServices: [
|
||||
{ label: "Personal Training", href: "/services/personal-training" },
|
||||
{ label: "Class", href: "/services/performance-class" },
|
||||
{ label: "Personal Training", href: "/training/one-to-one" },
|
||||
{ label: "Class", href: "/training/class" },
|
||||
{ label: "Coaching", href: "/services/coaching" },
|
||||
{ label: "Profilazione", href: "/services/profilazione" },
|
||||
{ label: "Check-up", href: "/services/profilazione" },
|
||||
{ label: "Osteopatia", href: "/services/osteopatia" },
|
||||
{ label: "Nutrizione", href: "/services/nutrition" },
|
||||
],
|
||||
|
||||
+28
-1
@@ -1,8 +1,35 @@
|
||||
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: "Scopri", href: "/services/one-to-one" } },
|
||||
{ id: "small-groups", title: "Small Group", caption: "Mini gruppi (max 4 persone) con trainer dedicato", image: "training-small-groups", description: "Allenati in mini gruppi da massimo 4 persone con un trainer dedicato. Un’esperienza small group che unisce attenzione personalizzata, motivazione e condivisione. Programmi mirati e supporto costante per raggiungere i tuoi obiettivi insieme.", cta: { label: "Scopri", href: "/services/small-group" } },
|
||||
{ id: "small-groups", title: "Personalized Training Group", caption: "Mini gruppi (max 4 persone) con trainer dedicato", image: "training-small-groups", description: "Allenati in mini gruppi da massimo 4 persone con un trainer dedicato. Un’esperienza Personalized Training Group che unisce attenzione personalizzata, motivazione e condivisione. Programmi mirati e supporto costante per raggiungere i tuoi obiettivi insieme.", cta: { label: "Scopri", href: "/services/small-group" } },
|
||||
{ id: "rehab", title: "Rehab", caption: "Recupero funzionale attraverso il movimento guidato", image: "training-rehab", description: "Il Rehab InsanityLab accompagna il corpo nel recupero della sua funzionalità attraverso il movimento guidato: il ponte tra la fine del percorso medico-riabilitativo e il ritorno a una vita attiva piena, con la stessa cura scientifica ma in un contesto di allenamento.", cta: { label: "Scopri", href: "/services/rehab" } },
|
||||
{ id: "holistic-class", title: "Holistic Class", caption: "Classi fino a 8 persone con trainer certificato", image: "training-holistic-class", description: "Mobilità articolare, respirazione, equilibrio. Da sola o integrata nei tuoi allenamenti, adatta a tutti i livelli. Sessioni da 40 minuti che uniscono Pilates Flow, Mobility e Yoga.", cta: { label: "Scopri", href: "/services/holistic-class" } },
|
||||
{ id: "reformer-class", title: "Reformer Class", caption: "Classi fino a 5 persone con macchinari reformer", image: "training-reformer-class", description: "Core, postura e mobilità su macchina reformer. Lavoro a basso impatto sulle articolazioni, adatto a tutti i livelli. Lezioni da 40 minuti in classi fino a 5 persone.", cta: { label: "Scopri", href: "/services/reformer-class" } },
|
||||
{ id: "coaching", title: "Coaching", caption: "Programma su misura e monitoraggio, anche online", image: "training-coaching", description: "Con il coaching hai un programma di allenamento su misura e un monitoraggio costante, ovunque ti alleni: in palestra, a casa o in viaggio. Il percorso sviluppa autonomia e continuità, adattandosi al tuo stile di vita (anche online, formula Fit Remote).", cta: { label: "Scopri", href: "/services/coaching" } },
|
||||
] as const;
|
||||
|
||||
/**
|
||||
* Le viste di /training: la pagina mostra tutti i training, oppure il solo sottoinsieme
|
||||
* chiesto dal cliente (documento MODIFICHE_PER_SITO.pdf del 17/08/2026).
|
||||
*
|
||||
* Da /services la card «One to One» porta a One to One / Personalized Training Group / Rehab,
|
||||
* la card «Class» a Holistic Class / Reformer Class: chi clicca cerca quella famiglia di
|
||||
* servizi, e vedersi comparire l'elenco intero costringe a cercare di nuovo.
|
||||
*/
|
||||
export const VISTE_TRAINING: Record<string, { titolo: string; blocchi: readonly string[] }> = {
|
||||
'one-to-one': { titolo: 'Allenamento seguito', blocchi: ['one-to-one', 'small-groups', 'rehab'] },
|
||||
class: { titolo: 'Class', blocchi: ['holistic-class', 'reformer-class'] },
|
||||
};
|
||||
|
||||
/**
|
||||
* I training da mostrare per una vista. `undefined` = pagina intera.
|
||||
*
|
||||
* Una vista sconosciuta restituisce `null`, e la pagina risponde 404: mostrare l'elenco
|
||||
* completo al posto di un filtro sbagliato farebbe passare per buono un indirizzo rotto —
|
||||
* il link continuerebbe a "funzionare" mentre porta altrove.
|
||||
*/
|
||||
export function trainingDaMostrare(vista?: string): typeof trainings[number][] | null {
|
||||
if (!vista) return [...trainings];
|
||||
const v = VISTE_TRAINING[vista];
|
||||
if (!v) return null;
|
||||
return v.blocchi.map((id) => trainings.find((t) => t.id === id)!).filter(Boolean);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user