Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
11 KiB
Inventario contenuti — pagine vetrina (2026-07-05)
Documento di riferimento per il piano 2026-07-05-contenuti-taggati-pannello-editor.md. Elenca, file per file, i testi visibili e le immagini da estrarre nel sistema di tag. I valori esatti si copiano SEMPRE dal file sorgente al momento dell'estrazione; qui compaiono abbreviati per identificazione.
Nota nomenclatura: i nomi tag canonici sono quelli nella sezione "Interfaces → Produces" dei task del piano (segmenti kebab-case, es. home.hero.title-line-1); dove questo inventario usa camelCase va convertito.
Pagine
src/pages/index.astro (home)
Solo orchestrazione componenti. Hardcoded: home.meta.title ("Performance. Balance. Longevity.", prop title di Base), home.training.title ("Training"), home.training.subtitle ("Porta i tuoi allenamenti al livello successivo: trova il percorso…"). Nessuna immagine diretta.
src/pages/about.astro
Meta (2): about.meta.title ("Insanitylab"), about.meta.description ("Mission, storia, team e metodo…"). Hero: about.hero.title ("Insanitylab", via PageHero).
Sezioni testo: mission (title + body), direzione (title + body + cta "Scopri"), approccio (title + body + cta "Contattaci"), about (title + body), convenzioni (title + body + item1-3 in <ul class="conv"> + riga finale con {site.email} · {site.phone} interpolati → spezzare in about.convenzioni.cta-text + tag global), team (title + body + staff-intro), metodo (title + body + closing), studios (title + body1-3), vision (title + body1-2).
Immagini (glob, alt hardcoded): about.mission.image (about-training-group.jpg), about.about.image (about-pushup.jpg), about.convenzioni.image (about-conventions.jpg), about.metodo.image (about-team-group.jpg), about.studios.image (about-studios.jpg), about.vision.image (about-vision.jpg). Griglia team: 9 foto da imageAbout (tag team.<slug>.image-about).
src/pages/contact.astro
contact.meta.title ("Contatti"), contact.meta.description, contact.hero.title ("Contattaci"), contact.hero.image (contact-hero.jpg, background PageHero), contact.map.button ("Carica la mappa (Google Maps)"), contact.map.note ("La mappa viene caricata da Google solo dopo il tuo consenso."), label info (address-label "Indirizzo", phone-label "Telefono", email-label "E-mail" — i valori sono i tag global.contact.*), contact.invite ("Per informazioni o per richiedere una consulenza iniziale…"). Iframe Maps generato via JS (title tecnico, escluso).
src/pages/training.astro
training.meta.title, training.meta.description, training.hero.title ("training"), training.intro.title ("Training"), training.intro.subtitle ("Porta i tuoi allenamenti al livello successivo: programmi completi…" — variante diversa dalla home), training.trial.title ("Prenota la lezione di prova"), training.trial.body, training.trial.cta ("Prenota"), training.trial.image (trial-class.jpg). Blocchi per-training: testi dai tag training.<id>.* (vedi trainings.ts); nota <h2>{t.title.toLowerCase()}</h2> (lowercase a runtime, conservare).
src/pages/404.astro
notfound.meta.title, notfound.eyebrow ("Errore 404"), notfound.title ("Pagina non trovata"), notfound.body, notfound.cta ("Torna alla home").
src/pages/programs/index.astro
programs.meta.title, programs.meta.description, programs.hero.title ("Programmi"), programs.intro.title, programs.intro.body ("Questi sono i programmi delle classi di Insanity Lab…"), programs.card.more-label ("Per saperne di più →", ripetuto). Card e immagini (program-<slug>.jpg, alt = title) da programs.ts.
src/pages/programs/[slug].astro
Hardcoded: program.side.categories-label ("Categorie"), program.side.category.1-4 ("Fitness", "Salute", "Stile di vita", "Nutrizione"), program.side.others-label ("Altri programmi"), program.pricing.empty-note (html con link "Contattaci per i dettagli… Scrivici →"), program.pricing.per ("al mese, semestrale"), program.pricing.entries-singular/-plural ("ingresso settimanale"/"ingressi settimanali"), program.pricing.buy-cta ("Acquista").
Dinamici: meta = title/excerpt del programma; hero = title.toUpperCase() (conservare la trasformazione); corpo/features/faq/pricing da data. Immagine program-<slug>.jpg come hero bg e inline.
Componenti condivisi
Header.astro
Logo /img/logo-dark.png (public) con alt "InsanityLab" (header.logo.alt). Nav: label da site.navigation → tag global.nav.<i>.label (5 voci: "Insanitylab", "Training", "Programmi", "Blog & Edugo", "Contatti"). Aria-label esclusi.
Footer.astro
Logo light + alt; footer.tagline (html, "PERFORMANCE. BALANCE. LONGEVITY."); footer.about ("Promuoviamo il movimento come cura di sé…"); riga contatti con <br> (comporre dai tag global.contact.*); orari (global.hours.1/2); titoli colonne training/programs/contact; footer.copyright ("Insanitylab, All Rights Reserved" — <strong> e anno dinamico restano fuori dal tag); footer.social-label ("Seguici"); label link da site.footerTraining (4) e site.footerPrograms (6) → footer.training.<i>.label, footer.programs.<i>.label.
ContactForm.astro
Placeholder: first-name "Nome", last-name "Cognome" (solo full), phone "Telefono" (solo full), email "E-mail", message "Messaggio". Submit "Invia messaggio". Messaggi nello <script> client (passare via data-*): success "Messaggio inviato, ti ricontatteremo al più presto.", error-generic "Errore di invio, riprova più tardi.", error-network "Errore di rete, riprova più tardi.".
Agenda.astro + agenda.ts
agenda.title ("Agenda"); da agenda.ts: agenda.discipline.<i> (7: Events, Crossfit, Cardio, Box, Meditation, Yoga Classes, Body Balance), agenda.day.<i> (7: Lunedì…Domenica), agenda.slot.<i> (5: 10.00…20.00). Celle (28 voci discipline/time/trainer) ESCLUSE: dati placeholder Prowess, in attesa orario reale dal cliente.
PageHero.astro
Nessun testo proprio (props title/eyebrow/bgImage passate dalle pagine con i rispettivi tag). Per bgImage da override serve accettare anche URL stringa.
Componenti home
HeroSlider.astro
home.hero.title-line-1/-2/-3 ("PERFORMANCE." / "BALANCE." / "LONGEVITY."), home.hero.cta ("Scopri"), home.hero.image (hero-1.png, alt "Atleti InsanityLab"). Frecce slider: aria, escluse.
InfoColumns.astro
3 colonne: home.info.col<n>.title ("PERFORMANCE." / "BALANCE." / "LONGEVITY.") + home.info.col<n>.image (info-performance/balance/longevity.jpg, background via getImage → usare contentImageUrl).
FeatureBlocks.astro
3 blocchi × (title, body, cta "Scopri") → home.feature.<performance|balance|longevity>.title/.body/.cta + .image (feature-*.jpg, alt = title).
QuoteBanner.astro
home.quote.text (html — congelare nel seed l'output della regex che avvolge le parole chiave in <strong>, poi rimuovere la regex), home.quote.cite ("Insanitylab"), home.quote.image (quote-bg.jpg, background). Testo renderizzato 2× per il marquee (seconda copia aria-hidden).
TrainingCards.astro
home.training-cards.link-label ("Scopri →"). Card: testi/immagini dai tag training.<id>.*. Usato in home e in training.astro.
ProgramsGrid.astro
home.programs.title ("Programmi"), home.programs.body (uguale a programs.intro.body ma tag separato). Griglia da programs.ts + SVG da program-icons.ts (icone escluse dal tagging).
TeamSection.astro
home.team.title (html, "Team
Trainer"), home.team.cta ("Scopri team"). Membri: filtro homeTeam su team.ts, foto team.<slug>.image, figcaption = shortName.
MethodSteps.astro
home.method.title (html, "Il metodo
InsanityLab"). Intro/note/steps dai tag method.* (intro html con <strong> congelato, rimuovere il set:html con wrapping runtime). Immagini step alt="" (decorative).
PartnersStrip.astro
Solo loghi: partner.<i>.name (alt) + partner.<i>.image da partners.ts.
Componente about
about/Timeline.astro
about.storylab.title ("Storylab"), about.storylab.body, about.timeline.label ("INSANITYLAB 2021-2024"), about.timeline.open-text, about.timeline.stage<1-3>.label ("INSANITYLAB 2025"/"2026"/"OGGI") + .text (placeholder "Contenuto in arrivo…" — testi Storylab attesi dal cliente). Struttura <details>/<summary> da conservare.
Data file
- site.ts: phone "351 7535977", email "info@insanitylab.it", address "Via Leandro Alberti, 76", cityLine "40139 Bologna", hours (2), socials (3, label+url — url restano nel data file), navigation (5), footerTraining (4), footerPrograms (6).
- team.ts: 9 membri (slug da shortName lowercase): donata, nicola, eva (founder); alessandro, eleonora, antonello, alice, davide, giulia. Campi: name, role, bio →
team.<slug>.name/.role/.bio; immagini:image(4: donata, nicola, eleonora, antonello) eimageAbout(tutti e 9, fileteam-*-dark). - programs.ts: 6 slug: personal-training, performance-class, coaching, pilates-flow, rehab, nutrition. Campi: title, subtitle, excerpt, longDescription, features[] (4-5), faq[] (3-6 coppie q/a). Solo performance-class ha hasPricing. →
program.<slug>.title/.subtitle/.excerpt/.long-description/.feature.<i>/.faq.<i>.q/.a. - pricing.ts: heading "Acquista la tua performance class", intro, 3 gruppi (label; solo il gruppo 1 "semestrale" ha 3 plans). Per plan: monthly/entries (numerici, restano nel data file), note, installments, best →
pricing.group.1.plan.<i>.note/.installments/.best. - method.ts: intro (html), extraNote, 4 step (title, text, image method-step-1..4) →
method.intro,method.extra-note,method.step.<n>.title/.text/.image. - trainings.ts: 4 id: one-to-one, small-groups, performance-class, fit-remote. Campi title, caption, description, cta.label (href resta) + image →
training.<id>.title/.caption/.description/.cta-label/.image. - partners.ts: 4: "Ticket Welfare Edenred", "Welbee", "AON", "Howden" →
partner.<i>.name/.image. - program-icons.ts: path SVG, esclusi dal tagging.
Note trasversali
- Tag
type: 'html'necessari per: footer.tagline ( ), home.team.title e home.method.title (<br>), home.quote.text e method.intro (<strong>congelato), program.pricing.empty-note (link<a>). - Trasformazioni runtime da conservare nel template (non nel valore):
.toLowerCase()(training h2),.toUpperCase()(hero dettaglio programma), anno copyright. - Duplicazioni intenzionali (tag distinti, valori oggi identici): programs.intro.body / home.programs.body / pricing.intro; home.training.subtitle / training.intro.subtitle (varianti).
- Loghi header/footer stanno in
public/img/(non passano dalla pipeline asset): TImg non applicabile — per l'override bastacontentImageUrl(tag, '/img/logo-dark.png')su<img>. - Conteggi indicativi: ~150 tag testo da template, ~200 da data file, ~60 slot immagine.