promo-eventi2: adotta i pattern di layout del sito (PageHero, section, sfondo bianco)
La prima versione unificava solo font/colori ma teneva il box centrato su sfondo crema. Ora la pagina di test usa il banner PageHero a tutta larghezza, sezioni .section/.container su sfondo bianco e bottoni .btn globali, come Servizi e Training. Aggiunto il tag promo.pagehero.title per il titolo del banner. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+89
-112
@@ -1,11 +1,12 @@
|
||||
---
|
||||
import Base from '../layouts/Base.astro';
|
||||
import PageHero from '../components/PageHero.astro';
|
||||
import T from '../components/content/T.astro';
|
||||
import { t, resolveContent } from '../lib/content';
|
||||
// Variante di test di /promo-eventi con stili UNIFICATI al design system del sito
|
||||
// (font Montserrat/Open Sans, palette --c-*). Struttura e contenuti identici: usa gli
|
||||
// stessi tag `promo.*`, così il confronto è solo sull'aspetto. Root class `.lp2` per non
|
||||
// far collidere gli stili is:global con quelli della pagina originale.
|
||||
// Variante di test di /promo-eventi ristrutturata sui pattern del sito: banner PageHero
|
||||
// a tutta larghezza, sezioni .section/.container su sfondo bianco, bottoni .btn globali,
|
||||
// font e palette dal design system. Contenuti identici (stessi tag `promo.*`). Gli stili
|
||||
// custom (griglia card, accordion FAQ) sono namespaced sotto `.promo2`.
|
||||
const BSPORT_URL = 'https://backoffice.bsport.io/login/signup?membership=3428';
|
||||
export const prerender = false;
|
||||
|
||||
@@ -19,36 +20,41 @@ const faqs = [1, 2, 3, 4, 5, 6];
|
||||
const wa = t('global.whatsapp');
|
||||
---
|
||||
<Base title="Promo ed eventi — InsanityLab" description="Edizione apertura: pacchetti a 5 incontri per One to One, Small Group, Reformer e Holistic Class. Acquisto online, pagamento sicuro via Stripe.">
|
||||
<div class="lp2">
|
||||
<div class="page">
|
||||
<PageHero title={t('promo.pagehero.title')} eyebrow={t('promo.hero.badge')} />
|
||||
|
||||
<section class="hero">
|
||||
<T tag="promo.hero.badge" as="div" class="badge" />
|
||||
<T tag="promo.hero.title1" as="h1" />
|
||||
<T tag="promo.hero.accent" as="p" class="accent" />
|
||||
<T tag="promo.hero.title2" as="h1" />
|
||||
<T tag="promo.hero.desc" as="p" class="desc" />
|
||||
<a class="btn-sand" href="#proposte"><T tag="promo.hero.cta" as="span" /></a>
|
||||
</section>
|
||||
<div class="promo2">
|
||||
|
||||
<section class="launch">
|
||||
<T tag="promo.launch.badge" as="div" class="badge" />
|
||||
<T tag="promo.launch.title" as="h1" />
|
||||
<T tag="promo.launch.accent" as="p" class="accent" />
|
||||
<T tag="promo.launch.desc" as="p" class="desc" />
|
||||
</section>
|
||||
<!-- Claim principale -->
|
||||
<section class="section">
|
||||
<div class="section-heading">
|
||||
<h2 class="claim">
|
||||
<T tag="promo.hero.title1" as="span" /> <em><T tag="promo.hero.accent" as="span" /></em> <T tag="promo.hero.title2" as="span" />
|
||||
</h2>
|
||||
<T tag="promo.hero.desc" as="p" class="claim-desc" />
|
||||
<a class="btn" href="#proposte"><T tag="promo.hero.cta" as="span" /></a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="why5">
|
||||
<T tag="promo.why5.text" as="p" />
|
||||
</section>
|
||||
<!-- Lancio + perché 5 -->
|
||||
<section class="section section--alt">
|
||||
<div class="container launch">
|
||||
<T tag="promo.launch.badge" as="p" class="eyebrow" />
|
||||
<h2><T tag="promo.launch.title" as="span" /></h2>
|
||||
<p class="launch-accent"><T tag="promo.launch.accent" as="span" /></p>
|
||||
<T tag="promo.launch.desc" as="p" />
|
||||
<T tag="promo.why5.text" as="p" class="why5" />
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="cards-wrap" id="proposte">
|
||||
<!-- Pacchetti -->
|
||||
<section class="section" id="proposte">
|
||||
<div class="container">
|
||||
<div class="cards">
|
||||
{cards.map((c) => (
|
||||
<div class:list={['card', c.featured && 'featured']}>
|
||||
{c.featured && <T tag={`promo.card.${c.id}.badge`} as="div" class="featured-badge" />}
|
||||
<T tag={`promo.card.${c.id}.eyebrow`} as="div" class="eyebrow" />
|
||||
<T tag={`promo.card.${c.id}.title`} as="div" class="title" />
|
||||
<T tag={`promo.card.${c.id}.title`} as="div" class="ptitle" />
|
||||
<div class="price-row">
|
||||
<T tag={`promo.card.${c.id}.price`} as="div" class="price" />
|
||||
<T tag={`promo.card.${c.id}.price-old`} as="div" class="price-old" />
|
||||
@@ -59,15 +65,18 @@ const wa = t('global.whatsapp');
|
||||
<T tag={`promo.card.${c.id}.feature.${m}`} as="li" />
|
||||
))}
|
||||
</ul>
|
||||
<a class="buy" href={BSPORT_URL} target="_blank" rel="noopener"><T tag="promo.buy-label" as="span" /></a>
|
||||
<a class:list={['btn', c.featured ? 'btn--dark' : 'btn--light', 'buy']} href={BSPORT_URL} target="_blank" rel="noopener"><T tag="promo.buy-label" as="span" /></a>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
<T tag="promo.validity-note" as="p" class="validity-note" />
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="faq-wrap">
|
||||
<T tag="promo.faq.title" as="h1" />
|
||||
<!-- FAQ -->
|
||||
<section class="section section--alt">
|
||||
<div class="container faq-wrap">
|
||||
<div class="section-heading"><T tag="promo.faq.title" as="h2" /></div>
|
||||
{faqs.map((n) => {
|
||||
const a = resolveContent(`promo.faq.${n}.a`);
|
||||
return (
|
||||
@@ -77,15 +86,15 @@ const wa = t('global.whatsapp');
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</section>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</Base>
|
||||
|
||||
<script>
|
||||
// Accordion FAQ: click (o Invio/Spazio) sul quesito apre/chiude la risposta.
|
||||
document.querySelectorAll('.lp2 .faq-block .faq-q').forEach((q) => {
|
||||
document.querySelectorAll('.promo2 .faq-block .faq-q').forEach((q) => {
|
||||
const block = q.closest('.faq-block');
|
||||
const toggle = q.querySelector('.faq-toggle');
|
||||
q.setAttribute('role', 'button');
|
||||
@@ -104,94 +113,62 @@ const wa = t('global.whatsapp');
|
||||
</script>
|
||||
|
||||
<!-- is:global perché i testi editabili sono renderizzati dal componente <T> (fuori dallo
|
||||
scope della pagina). Ogni regola è prefissata `.lp2`, quindi resta confinata a questa
|
||||
pagina di test. Stili ricondotti ai token del design system (var(--c-*), var(--font-*)). -->
|
||||
scope della pagina). Tutto è prefissato `.promo2`; la struttura usa le classi globali
|
||||
del sito (.section, .container, .btn, .eyebrow, .section-heading). -->
|
||||
<style is:global>
|
||||
.lp2 { background: var(--c-bg-alt); }
|
||||
.lp2 .page { max-width: 1000px; margin: 0 auto; background: var(--c-bg); font-family: var(--font-body); }
|
||||
/* Il testo del bottone contiene già la freccia: nascondo la ::after globale di .btn */
|
||||
.promo2 .btn::after { content: none; }
|
||||
|
||||
/* HERO */
|
||||
.lp2 .hero { background: var(--c-dark); padding: 72px 64px 84px; }
|
||||
.lp2 .badge {
|
||||
display: inline-block; padding: 7px 16px; border: 0.5px solid rgba(184,169,140,0.5);
|
||||
border-radius: 999px; margin-bottom: 24px; font-size: 11px; letter-spacing: 0.08em;
|
||||
color: var(--c-accent); font-weight: 600; text-transform: uppercase; font-family: var(--font-heading);
|
||||
/* Claim principale */
|
||||
.promo2 .claim { text-transform: none; letter-spacing: .01em; }
|
||||
.promo2 .claim em { font-style: italic; color: var(--c-accent-dark); }
|
||||
.promo2 .claim-desc { max-width: 520px; margin: 0 auto 28px; color: var(--c-text); }
|
||||
|
||||
/* Lancio */
|
||||
.promo2 .launch { max-width: 720px; }
|
||||
.promo2 .launch h2 { margin-top: 8px; }
|
||||
.promo2 .launch-accent { font-family: var(--font-heading); font-style: italic; font-size: 1.15rem; color: var(--c-accent-dark); margin: 0 0 20px; }
|
||||
.promo2 .why5 { font-family: var(--font-heading); font-style: italic; font-size: 1.15rem; line-height: 1.7; color: var(--c-heading); margin-top: 28px; padding-top: 24px; border-top: 1px solid #e4ded6; }
|
||||
|
||||
/* Pacchetti */
|
||||
.promo2 .cards { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; }
|
||||
.promo2 .card { background: var(--c-bg); border: 1px solid #e4ded6; border-radius: 4px; padding: 30px; position: relative; display: flex; flex-direction: column; }
|
||||
.promo2 .card.featured { border: 2px solid var(--c-accent); }
|
||||
.promo2 .featured-badge {
|
||||
position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: var(--c-accent);
|
||||
color: #fff; font-family: var(--font-heading); font-size: 11px; font-weight: 600; letter-spacing: .08em;
|
||||
text-transform: uppercase; padding: 5px 16px; border-radius: 999px; white-space: nowrap;
|
||||
}
|
||||
.lp2 .hero h1 { margin: 0; font-family: var(--font-heading); font-size: 44px; line-height: 1.2; font-weight: 600; color: #fff; letter-spacing: .02em; }
|
||||
.lp2 .hero .accent { margin: 4px 0; font-family: var(--font-heading); font-size: 34px; line-height: 1.3; font-style: italic; color: var(--c-accent); }
|
||||
.lp2 .hero p.desc { margin: 28px 0 32px; font-size: 16px; line-height: 1.7; color: #cfc6bd; max-width: 480px; }
|
||||
.lp2 .btn-sand {
|
||||
display: inline-flex; align-items: center; gap: 14px; background: var(--c-accent); color: #fff;
|
||||
border: none; padding: 15px 30px; border-radius: 999px; font-family: var(--font-heading);
|
||||
font-size: 13px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; cursor: pointer;
|
||||
text-decoration: none; transition: background .2s;
|
||||
}
|
||||
.lp2 .btn-sand:hover { background: var(--c-accent-dark); }
|
||||
|
||||
/* LAUNCH */
|
||||
.lp2 .launch { background: var(--c-bg-alt); padding: 72px 64px; }
|
||||
.lp2 .launch .badge { border-color: rgba(156,139,112,0.35); color: var(--c-accent-dark); }
|
||||
.lp2 .launch h1 { margin: 0; font-family: var(--font-heading); font-size: 38px; line-height: 1.25; font-weight: 600; color: var(--c-heading); letter-spacing: .02em; }
|
||||
.lp2 .launch .accent { margin: 8px 0 28px; font-family: var(--font-heading); font-size: 26px; line-height: 1.35; font-style: italic; color: var(--c-accent-dark); }
|
||||
.lp2 .launch p.desc { margin: 0; font-size: 16px; line-height: 1.7; color: var(--c-text); max-width: 540px; }
|
||||
|
||||
/* PERCHE 5 */
|
||||
.lp2 .why5 { padding: 48px 64px 8px; }
|
||||
.lp2 .why5 p { margin: 0; font-family: var(--font-heading); font-size: 18px; line-height: 1.7; font-style: italic; color: var(--c-heading); max-width: 620px; }
|
||||
|
||||
/* CARDS */
|
||||
.lp2 .cards-wrap { padding: 32px 64px 72px; }
|
||||
.lp2 .cards { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; }
|
||||
.lp2 .card { background: var(--c-bg); border: 0.5px solid #ddd5ca; border-radius: 14px; padding: 26px; position: relative; }
|
||||
.lp2 .card.featured { border: 2px solid var(--c-dark); }
|
||||
.lp2 .featured-badge {
|
||||
position: absolute; top: -12px; left: 50%; transform: translateX(-50%); background: var(--c-dark);
|
||||
color: #fff; font-size: 11px; padding: 4px 14px; border-radius: 999px; white-space: nowrap; font-weight: 600;
|
||||
font-family: var(--font-heading); letter-spacing: .04em;
|
||||
}
|
||||
.lp2 .card .eyebrow { font-family: var(--font-heading); font-size: 11px; letter-spacing: 0.15em; color: var(--c-text-light); margin: 0 0 4px; text-transform: uppercase; font-weight: 600; }
|
||||
.lp2 .card .title { font-family: var(--font-heading); font-size: 19px; font-weight: 600; color: var(--c-heading); margin: 0 0 14px; letter-spacing: .02em; }
|
||||
.lp2 .card .price-row { display: flex; align-items: baseline; gap: 10px; margin: 0 0 2px; }
|
||||
.lp2 .card .price { font-family: var(--font-heading); font-size: 26px; font-weight: 700; color: var(--c-heading); margin: 0; }
|
||||
.lp2 .card .price-old { font-size: 15px; color: var(--c-text-light); text-decoration: line-through; font-weight: 400; }
|
||||
.lp2 .card .unit { font-size: 12px; color: var(--c-text-light); margin: 0 0 18px; }
|
||||
.lp2 .card ul { list-style: none; padding: 0; margin: 0 0 20px; display: flex; flex-direction: column; gap: 9px; }
|
||||
.lp2 .card li { font-size: 13.5px; line-height: 1.5; color: var(--c-text); display: flex; gap: 8px; }
|
||||
.lp2 .card li::before { content: "—"; color: var(--c-accent); font-weight: 700; flex-shrink: 0; }
|
||||
.lp2 .card .buy {
|
||||
display: block; width: 100%; box-sizing: border-box; text-align: center; text-decoration: none;
|
||||
background: var(--c-dark); color: #fff; border: none; padding: 13px; border-radius: 999px;
|
||||
font-family: var(--font-heading); font-size: 12px; font-weight: 600; letter-spacing: 0.1em; text-transform: uppercase; cursor: pointer;
|
||||
transition: background .2s;
|
||||
}
|
||||
.lp2 .card .buy:hover { background: var(--c-dark-2); }
|
||||
.lp2 .card.featured .buy { background: var(--c-accent); }
|
||||
.lp2 .card.featured .buy:hover { background: var(--c-accent-dark); }
|
||||
|
||||
.lp2 .validity-note { text-align: center; font-size: 12px; color: var(--c-text-light); margin: 22px 0 0; }
|
||||
.promo2 .card .eyebrow { margin: 0 0 6px; }
|
||||
.promo2 .card .ptitle { font-family: var(--font-heading); font-size: 1.3rem; font-weight: 500; color: var(--c-heading); letter-spacing: .03em; margin: 0 0 16px; }
|
||||
.promo2 .card .price-row { display: flex; align-items: baseline; gap: 10px; margin: 0 0 2px; }
|
||||
.promo2 .card .price { font-family: var(--font-heading); font-size: 2rem; font-weight: 600; color: var(--c-heading); }
|
||||
.promo2 .card .price-old { font-size: 1rem; color: var(--c-text-light); text-decoration: line-through; }
|
||||
.promo2 .card .unit { font-size: .8rem; color: var(--c-text-light); margin: 0 0 20px; }
|
||||
.promo2 .card ul { list-style: none; padding: 0; margin: 0 0 24px; display: flex; flex-direction: column; gap: 10px; }
|
||||
.promo2 .card li { font-size: .92rem; line-height: 1.5; color: var(--c-text); display: flex; gap: 10px; }
|
||||
.promo2 .card li::before { content: "—"; color: var(--c-accent); font-weight: 700; flex-shrink: 0; }
|
||||
.promo2 .card .buy { margin-top: auto; justify-content: center; }
|
||||
.promo2 .validity-note { text-align: center; font-size: .8rem; color: var(--c-text-light); margin: 32px 0 0; }
|
||||
|
||||
/* FAQ */
|
||||
.lp2 .faq-wrap { padding: 72px 64px; }
|
||||
.lp2 .faq-wrap h1 { margin: 0 0 40px; font-family: var(--font-heading); font-size: 32px; line-height: 1.25; font-weight: 600; color: var(--c-heading); max-width: 480px; letter-spacing: .02em; }
|
||||
.lp2 .faq-block { border-top: 0.5px solid #ddd5ca; padding: 22px 0; }
|
||||
.lp2 .faq-block:last-child { border-bottom: 0.5px solid #ddd5ca; }
|
||||
.lp2 .faq-q { display: flex; justify-content: space-between; align-items: center; gap: 24px; cursor: pointer; }
|
||||
.lp2 .faq-q p { margin: 0; font-family: var(--font-heading); font-size: 16px; font-weight: 600; color: var(--c-heading); letter-spacing: .01em; }
|
||||
.lp2 .faq-q:focus-visible { outline: 2px solid var(--c-accent-dark); outline-offset: 4px; }
|
||||
.lp2 .faq-toggle {
|
||||
width: 30px; height: 30px; border-radius: 50%; border: 0.5px solid #c9c3b4; display: flex;
|
||||
.promo2 .faq-wrap { max-width: 760px; }
|
||||
.promo2 .faq-block { border-top: 1px solid #e4ded6; padding: 22px 0; }
|
||||
.promo2 .faq-block:last-child { border-bottom: 1px solid #e4ded6; }
|
||||
.promo2 .faq-q { display: flex; justify-content: space-between; align-items: center; gap: 24px; cursor: pointer; }
|
||||
.promo2 .faq-q p { margin: 0; font-family: var(--font-heading); font-size: 1rem; font-weight: 500; color: var(--c-heading); letter-spacing: .02em; }
|
||||
.promo2 .faq-q:focus-visible { outline: 2px solid var(--c-accent-dark); outline-offset: 4px; }
|
||||
.promo2 .faq-toggle {
|
||||
width: 30px; height: 30px; border-radius: 50%; border: 1px solid #d8cfc2; display: flex;
|
||||
align-items: center; justify-content: center; flex-shrink: 0; font-size: 16px; color: var(--c-heading);
|
||||
transition: background .2s ease, color .2s ease, border-color .2s ease;
|
||||
}
|
||||
.lp2 .faq-block.is-open .faq-toggle { background: var(--c-dark); color: #fff; border-color: var(--c-dark); }
|
||||
.lp2 .faq-a { display: none; margin: 14px 0 0; font-size: 14.5px; line-height: 1.7; color: var(--c-text-light); max-width: 620px; }
|
||||
.lp2 .faq-block.is-open .faq-a { display: block; }
|
||||
.lp2 .faq-a .hl { color: var(--c-accent-dark); font-weight: 600; }
|
||||
.promo2 .faq-block.is-open .faq-toggle { background: var(--c-accent); color: #fff; border-color: var(--c-accent); }
|
||||
.promo2 .faq-a { display: none; margin: 14px 0 0; font-size: .92rem; line-height: 1.7; color: var(--c-text-light); max-width: 640px; }
|
||||
.promo2 .faq-block.is-open .faq-a { display: block; }
|
||||
.promo2 .faq-a .hl { color: var(--c-accent-dark); font-weight: 600; }
|
||||
|
||||
@media (max-width: 700px) {
|
||||
.lp2 .hero, .lp2 .launch, .lp2 .why5, .lp2 .cards-wrap, .lp2 .faq-wrap { padding-left: 28px; padding-right: 28px; }
|
||||
.lp2 .cards { grid-template-columns: 1fr; }
|
||||
.lp2 .hero h1 { font-size: 32px; }
|
||||
.lp2 .launch h1 { font-size: 28px; }
|
||||
@media (max-width: 767px) {
|
||||
.promo2 .cards { grid-template-columns: 1fr; }
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user