diff --git a/astro.config.mjs b/astro.config.mjs index 091aedd..32b7959 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -17,5 +17,7 @@ export default defineConfig({ // Modifiche 02: "Pilates Flow" → "Profilazione". "Rehab" esce dalla griglia Servizi e // diventa un riquadro Training, ma la pagina dettaglio resta su /services/rehab. '/services/pilates-flow': { status: 301, destination: '/services/profilazione' }, + // "Personal Training" rinominato "One to One" (nuovo slug); Small Group è una pagina a sé. + '/services/personal-training': { status: 301, destination: '/services/one-to-one' }, }, }); diff --git a/src/assets/img/program-personal-training.jpg b/src/assets/img/program-one-to-one.jpg similarity index 100% rename from src/assets/img/program-personal-training.jpg rename to src/assets/img/program-one-to-one.jpg diff --git a/src/assets/img/program-performance-class.jpg b/src/assets/img/program-performance-class.jpg index febde9d..e196d0f 100644 Binary files a/src/assets/img/program-performance-class.jpg and b/src/assets/img/program-performance-class.jpg differ diff --git a/src/assets/img/program-small-group.jpg b/src/assets/img/program-small-group.jpg new file mode 100644 index 0000000..9306886 Binary files /dev/null and b/src/assets/img/program-small-group.jpg differ diff --git a/src/data/content-seed.ts b/src/data/content-seed.ts index 3c7660b..a3e0077 100644 --- a/src/data/content-seed.ts +++ b/src/data/content-seed.ts @@ -30,6 +30,7 @@ export const contentSeed: SeedEntry[] = [ T('global.nav.3.label', site.navigation[2].label, []), T('global.nav.4.label', site.navigation[3].label, []), T('global.nav.5.label', site.navigation[4].label, []), + T('global.nav.6.label', site.navigation[5].label, []), // --- Header --- T('header.logo.alt', 'InsanityLab', []), @@ -230,7 +231,6 @@ export const contentSeed: SeedEntry[] = [ T('services.meta.title', 'Servizi', []), T('services.meta.description', 'I servizi InsanityLab: Personal Training, Performance Class, Coaching, Profilazione, Osteopatia 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ù →', []), @@ -277,7 +277,6 @@ export const contentSeed: SeedEntry[] = [ 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.hero.title', 'training', []), - T('training.intro.title', '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.'), T('training.trial.title', 'Prenota la lezione di prova'), T('training.trial.body', "La lezione di prova è l'occasione perfetta per conoscere il metodo, vivere l'esperienza in prima persona e capire il percorso più adatto a te. Inizia oggi il tuo percorso: prenota la tua lezione di prova."), diff --git a/src/data/services.ts b/src/data/services.ts index 6e0eba6..625dfca 100644 --- a/src/data/services.ts +++ b/src/data/services.ts @@ -14,12 +14,12 @@ export interface Service { export const services: Service[] = [ { - slug: "personal-training", - title: "Personal Training", - subtitle: "One to One / Small Group", - excerpt: "Il personal training InsanityLab è un percorso one-to-one su misura, seguito da un professionista dedicato, per raggiungere in modo sicuro ed efficace obiettivi di forma fisica, performance e benessere.", - longDescription: "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, con supporto costante, attenzione totale e allenamenti personalizzati. Disponibile anche in formula small group (massimo 3 persone) per unire attenzione personalizzata, motivazione e condivisione.", - features: ["Trainer dedicato", "Percorso su misura", "Valutazione iniziale e monitoraggio", "Formula one to one o small group (max 3)"], + slug: "one-to-one", + title: "One to One", + 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.", + longDescription: "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, con supporto costante, attenzione totale e allenamenti personalizzati.", + features: [], faq: [ { q: "Come si svolge la prima seduta?", a: "Con una consulenza conoscitiva iniziale: raccogliamo l’anamnesi, definiamo gli obiettivi e impostiamo il percorso più adatto." }, { q: "Con quale frequenza ci si allena?", a: "La frequenza viene definita insieme al trainer in base a obiettivi, disponibilità e livello di partenza." }, @@ -27,6 +27,21 @@ export const services: Service[] = [ ], hasPricing: false, }, + { + slug: "small-group", + title: "Small 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.", + 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: "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." }, + ], + hasPricing: false, + grid: false, + }, { slug: "performance-class", title: "Performance Class", @@ -80,7 +95,7 @@ export const services: Service[] = [ subtitle: "Approccio manuale globale non invasivo", excerpt: "L’osteopatia è una delle colonne portanti dell’approccio integrato di InsanityLab. Non è un servizio aggiunto: è parte della visione.", longDescription: "L’osteopatia è indicata sia in modo preventivo, per chi vuole mantenere il proprio equilibrio corporeo, sia in modo curativo, per chi sta affrontando un problema specifico. È particolarmente utile in sinergia con l’allenamento, perché permette di lavorare su compensi e rigidità che altrimenti limiterebbero i progressi. Nel nostro approccio rientrano anche l’osteopatia neonatale e pediatrica.", - features: ["Dolori acuti e cronici (cervicale, lombare, articolazioni)", "Tensioni muscolari e fasciali", "Problemi posturali", "Cefalee", "Disturbi viscerali correlati a tensioni strutturali", "Recupero post-traumatico"], + features: [], faq: [ { q: "L’osteopatia è preventiva o curativa?", a: "Entrambe: è utile sia per mantenere l’equilibrio corporeo sia per affrontare un problema specifico, in sinergia con l’allenamento." }, { q: "Trattate anche neonati e bambini?", a: "Sì, il nostro approccio comprende anche l’osteopatia neonatale e pediatrica." }, @@ -109,7 +124,7 @@ export const services: Service[] = [ subtitle: "Recupero post-infortunio, patologie muscolo-scheletriche", excerpt: "Accompagniamo 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.", longDescription: "Il Rehab InsanityLab significa accompagnare il corpo nel recupero della sua funzionalità attraverso il movimento guidato. Non è fisioterapia in senso clinico: è 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. Il servizio lavora con un ampio spettro di condizioni e ogni situazione viene valutata singolarmente con metodologie evidence based.", - features: ["Recupero post-chirurgico e post-traumatico ortopedico", "Problemi posturali e motori", "Lombalgia e dolori cronici", "Ipertensione e patologie metaboliche", "Lipedema", "Gravidanza e periodo post-parto", "Attività motoria adattata per anziani (AFA)"], + features: [], faq: [ { q: "Chi segue il percorso Rehab?", a: "Professionisti specializzati in rieducazione funzionale ed esercizio adattato, in sinergia con medici specialisti, fisioterapisti e osteopati." }, { q: "Serve una diagnosi medica?", a: "Se disponibile è utile portarla alla prima consulenza; il percorso si integra con le indicazioni dei sanitari." }, @@ -125,7 +140,7 @@ export const services: Service[] = [ subtitle: "Classi fino a 8 persone con trainer certificato", excerpt: "Mobilità articolare, respirazione, equilibrio. Da sola o integrata nei tuoi allenamenti, adatta a tutti i livelli. Sessioni da 40 minuti.", longDescription: "La Holistic Class lavora su mobilità articolare, respirazione ed equilibrio. Puoi seguirla da sola o integrarla nei tuoi allenamenti; è adatta a tutti i livelli e ogni sessione dura 40 minuti. Comprende lavoro di Pilates Flow, Mobility e Yoga.", - features: ["Pilates Flow", "Mobility", "Yoga", "Sessioni da 40 minuti", "Adatta a tutti i livelli"], + features: ["Pilates Flow", "Mobility", "Yoga"], faq: [ { q: "A chi è adatta la Holistic Class?", a: "A chiunque voglia migliorare mobilità, respirazione ed equilibrio, a ogni livello di partenza." }, { q: "Posso integrarla con altri allenamenti?", a: "Sì: funziona sia come percorso a sé sia come complemento al tuo programma di allenamento." }, diff --git a/src/data/site.ts b/src/data/site.ts index 87cb008..86073e8 100644 --- a/src/data/site.ts +++ b/src/data/site.ts @@ -16,6 +16,7 @@ export const site = { { label: "Servizi", href: "/services" }, { label: "Blog & Edugo", href: "/blog" }, { label: "Contatti", href: "/contact" }, + { label: "Promo ed eventi", href: "/promo-eventi" }, ], footerTraining: [ { label: "One to one", href: "/training#one-to-one" }, diff --git a/src/data/trainings.ts b/src/data/trainings.ts index d838db5..d3ab22c 100644 --- a/src/data/trainings.ts +++ b/src/data/trainings.ts @@ -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 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: "Contattaci", href: "/contact" } }, + { 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: "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" } }, diff --git a/src/lib/db.ts b/src/lib/db.ts index ddd7c8c..36c22a6 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -98,7 +98,6 @@ export function createDb(path?: string): Database.Database { ['services.meta.title', 'Programmi'], ['services.meta.description', 'I programmi InsanityLab: Personal Training, Performance Class, Coaching, Pilates Flow, Rehab e Nutrizione.'], ['services.hero.title', 'Programmi'], - ['services.intro.title', 'Programmi'], ["services.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."], ['service.side.others-label', 'Altri programmi'], ['service.pricing.empty-note', 'Contattaci per i dettagli di questo programma. Scrivici →'], @@ -111,6 +110,18 @@ export function createDb(path?: string): Database.Database { } }); renameTx(); + + // Modifiche 03: "Personal Training" → "One to One" (nuovo slug one-to-one). Rinomina i tag + // esistenti prima del seed per preservare le modifiche da pannello; il title di default viene + // aggiornato solo se non modificato. La nuova pagina "Small Group" (slug small-group) è un + // servizio nuovo e viene inserita dal seed più sotto. Idempotente. + const oneToOneTx = db.transaction(() => { + renameUpd.run('service.one-to-one.', 'service.personal-training.'.length + 1, 'service.personal-training.%'); + renameDel.run('service.personal-training.%'); + db.prepare("UPDATE content_blocks SET value = 'One to One' WHERE tag = 'service.one-to-one.title' AND value = 'Personal Training'").run(); + }); + oneToOneTx(); + const ins = db.prepare('INSERT OR IGNORE INTO content_blocks (tag, type, value, guid) VALUES (?, ?, ?, ?)'); const syncTx = db.transaction(() => { for (const e of contentSeed) ins.run(e.tag, e.type, e.value, randomUUID()); }); syncTx(); diff --git a/src/pages/promo-eventi.astro b/src/pages/promo-eventi.astro new file mode 100644 index 0000000..601483e --- /dev/null +++ b/src/pages/promo-eventi.astro @@ -0,0 +1,256 @@ +--- +import Base from '../layouts/Base.astro'; +// Landing promo/lancio integrata nel sito (header e footer del sito, non standalone). +// I bottoni "Acquista" portano al gestionale bsport: l'utente crea l'account, +// inserisce i dati e paga via Stripe dentro la piattaforma. Link centralizzato qui: +// quando avremo gli ID membership per singolo prodotto basterà mappare BSPORT_URL card per card. +const BSPORT_URL = 'https://backoffice.bsport.io/login/signup?membership=3428'; +export const prerender = false; +--- + +
+
+ +
+
insanity.lab · bologna savena
+

Allenati con metodo.

+

Scegli come

+

vuoi farlo.

+

Allenati con flessibilità, senza vincoli, da subito.
Acquisto online in pochi secondi, pagamento sicuro via Stripe.

+ LE NOSTRE PROPOSTE → +
+ +
+
solo per il lancio
+

Il nostro metodo nasce per durare.

+

Per l'apertura, un'eccezione. Solo per poco.

+

In-Sanity Lab lavora per percorsi strutturati — trimestrali, semestrali — perché i risultati veri si costruiscono nel tempo. Per la nuova apertura, ci sarà un'eccezione: 5 incontri pensati come un vero mini-percorso, non semplici lezioni sciolte.

+
+ +
+

Non è una prova. È un percorso in miniatura — per capire come lavoriamo prima di impegnarti su un programma trimestrale o semestrale.

+
+ +
+
+ +
+
Personal training
+
One to One
+
+
163 €
+
300 €
+
+
5 incontri
+
    +
  • Screening iniziale, definizione dei tuoi obiettivi
  • +
  • Check-up con profilazione fisica, il tuo punto di partenza
  • +
  • PT dedicato, presente a ogni sessione
  • +
  • In-sanity plan, il tuo programma personalizzato
  • +
+ ACQUISTA → +
+ + + +
+
Pilates class
+
Reformer
+
+
100 €
+
140 €
+
+
5 incontri
+
    +
  • Core, postura e mobilità su macchina Reformer
  • +
  • Lavoro a basso impatto sulle articolazioni
  • +
  • Percorso breve, non lezioni isolate
  • +
+ ACQUISTA → +
+ +
+
Holistic class
+
Pilates Mat, Mobility, Yoga
+
+
50 €
+
100 €
+
+
5 incontri
+
    +
  • Mobilità articolare, respirazione, equilibrio
  • +
  • Da solo, o integrato nei tuoi allenamenti
  • +
  • Adatto a tutti i livelli
  • +
+ ACQUISTA → +
+ +
+

Disponibile solo per l'apertura · Valido entro 2 mesi dal primo incontro e comunque non oltre il 1° dicembre 2026

+
+ +
+

Tutto quello che vuoi sapere prima di acquistare.

+ +
+

Come funziona il pacchetto a incontri per One to One e Small Group?

+
+

Acquisti il pacchetto online con pagamento sicuro via Stripe. Ricevi una conferma via email. Poi ci scrivi su WhatsApp (351 753 5977) per prenotare le singole sessioni in base agli orari disponibili. 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.

+
+ +
+

Come funziona il percorso Reformer o Holistic Class?

+
+

Acquisti il pacchetto online con pagamento sicuro via Stripe. Ricevi una conferma via email. Poi vai nella schermata Home, clicca il servizio che hai acquistato e seleziona autonomamente la class nel giorno e nell'orario che desideri. In caso di problemi contattaci su WhatsApp (351 753 5977)! Gli incontri sono validi 2 mesi dalla data del primo incontro e comunque non oltre il 1° dicembre 2026.

+
+ +
+

Posso usare gli incontri su servizi diversi?

+
+

Ogni pacchetto è dedicato a un singolo servizio (One to One, Small Group, Reformer o Holistic Class). Se vuoi accedere a più servizi puoi acquistare pacchetti separati per ciascuno.

+
+ +
+

Posso regalare un pacchetto a qualcun altro?

+
+

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 WhatsApp (351 753 5977) per organizzare le sessioni.

+
+ +
+

Il pagamento è sicuro?

+
+

Sì. Il pagamento avviene tramite Stripe, una delle piattaforme di pagamento online più sicure al mondo. I tuoi dati bancari non vengono mai condivisi con insanity.lab — tutto è gestito in modo cifrato da Stripe.

+
+ +
+

Posso chiedere un rimborso?

+
+

Per richieste di rimborso o problemi con l'acquisto scrivici su WhatsApp o via email. Valutiamo ogni situazione in modo diretto e umano.

+
+
+ +
+

Via Leandro Alberti 76 e Via De Mattiolo 5, 40139 Bologna  ·  351 753 5977  ·  info@insanitylab.it

+
+ +
+
+ + + + + diff --git a/src/pages/services/[slug].astro b/src/pages/services/[slug].astro index 3a31714..fc2538a 100644 --- a/src/pages/services/[slug].astro +++ b/src/pages/services/[slug].astro @@ -29,10 +29,12 @@ const tones = ['tan', 'taupe', 'dark'];

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

- -
    - {service.features.map((_, i) => )} -
+ + {service.features.length > 0 && ( +
    + {service.features.map((_, i) => )} +
+ )} {heroImg && ( )} @@ -97,6 +99,7 @@ const tones = ['tan', 'taupe', 'dark'];