Design system · privato
Wiki MetaCometa
Riferimento di tutti i componenti, token e regole del design system di webducks.it. Pagina privata, non indicizzata, accessibile solo da admin loggati.
Come usare
Ogni componente ha: nome classe (copiabile), descrizione, anteprima live, snippet di codice. Quando aggiungi una nuova sezione/componente in /tmp/build_webducks.py, aggiungi anche una voce qui per i futuri me/te.
Tokens
CSS custom-properties definite in :root. Usa var(--c-...) ovunque invece di hex inline.
<a class="mc-btn-action is-primary">Azione</a>
<p class="mc-eyebrow">Eyebrow</p>
font-family: var(--f-display); /* Young Serif, headings */ font-family: var(--f-body); /* DM Sans, body */
Palette completa
Layout & container
Tre container widths. Usa sempre uno di questi, mai max-width inline.
<div class="wp-block-group mc-container">…</div>
<div class="wp-block-group mc-container-narrow">…</div>
<div class="wp-block-group mc-container-wide">…</div>
Sezioni & sfondi
Le sezioni full-width usano sempre il gradiente del body. Solo .mc-bg-deep spezza la continuità. .mc-bg-warm e .mc-bg-soft sono mappate a trasparente per coerenza globale.
group_full(content, classname="mc-section")
group_full(content, classname="mc-section mc-bg-deep")
group_full(content, classname="mc-trust")
Tipografia & eyebrow
<h1 class="wp-block-heading mc-h-display">Title</h1>
Sezione · Cosa facciamo
<p class="mc-eyebrow">Cosa facciamo</p>
<h1>Per ogni <em class="mc-h-em">bambino</em></h1>
Body text editoriale. Il primo paragrafo riceve un drop-cap Young Serif di 3.2em.
<div class="mc-prose"><p>Lungo paragrafo…</p></div>
“Casa è dove qualcuno ti sceglie.”
<blockquote class="mc-pullquote">"…"</blockquote>
Bottoni
Sistema unificato .mc-btn-action + modificatore. Funziona come <a>, <button>, dentro wp:html.
<a href="…" class="mc-btn-action is-primary">Dona ora</a>
<a href="…" class="mc-btn-action is-secondary">Scopri</a>
<a href="…" class="mc-btn-action is-light">Continua</a>
<a href="…" class="mc-btn-action is-ghost-light">Skip</a>
Card
<div class="mc-card" style="padding:32px">…</div>
5×1000
Vale moltissimo.
<div class="mc-orange-card" style="padding:48px">…</div>
Scegli il tuo.
<div class="wp-block-group mc-cta-card">…</div>
<div class="mc-aziende-card-gradient" style="padding:56px;border-radius:18px">…</div>
<a href="/storia-xyz/" class="mc-story-card-link"> <img src="…" class="mc-story-card-img"/> <div class="mc-story-card-body">…</div> </a>
Form
<form class="mc-form" action="…"> <div><label>Nome</label><input/></div> … </form>
Componenti specializzati
<div class="mc-fr-mixed"> <a class="mc-fr-card is-featured">…</a> … <a class="mc-fr-card is-medium">…</a> </div>
<div class="mc-impact-editorial"> <div><div class="mc-impact-lead">25<span class="mc-impact-lead-suffix">anni</span></div></div> <div><div class="mc-impact-sentence"><p class="label"><span class="num">N</span> …</p></div></div> </div>
<div class="mc-allocation">
<div class="mc-allocation-bar">
<div class="mc-allocation-seg is-direct" style="flex:82"></div>
…
</div>
</div><div class="mc-faq-item" data-open="false">
<button class="mc-faq-q" aria-expanded="false">
<span>Q?</span><span class="mc-faq-toggle">+</span>
</button>
<div class="mc-faq-a-wrap">
<div class="mc-faq-a"><div class="mc-faq-a-inner">A.</div></div>
</div>
</div><div class="mc-hero-slideshow" id="mc-hero-slideshow"> <img class="mc-hero-slide is-active" src="…"/> … <div class="mc-hero-dots"></div> </div>
<section class="mc-section mc-stories-fw"> <img class="mc-stories-bg-photo mc-stories-photo-1"/> … </section>
<div class="mc-trust-strip"> <span class="mc-trust-label">…</span> <span class="mc-trust-region">Citta</span> </div>
Utilità & helper
<span class="mc-badge">Tag</span> <span class="mc-pill">Pill</span>
- Punto uno
- Punto due
<ul class="mc-volo-bullets"> <li>Item</li> </ul>
<a href="/storie/" class="mc-back-link">← Torna alle storie</a>
Regole & anti-pattern
Vetro & card uniformi
Card “di vetro”: sfondo translucido + blur(14px), bordo chiaro, ombra md. Tre tinte. Padding uniforme via --card-pad. (agg. 2026-06, §15b–c)
.mc-glass{border:1px solid;border-radius:18px;box-shadow:var(--shadow-md);color:var(--c-ink)}
.mc-glass-clear { background:rgba(255,251,244,.55); border-color:rgba(255,255,255,.55) }
.mc-glass-orange{ background:rgba(233,126,58,.20); border-color:rgba(233,126,58,.40) }
.mc-glass-violet{ background:rgba(79,45,127,.22); border-color:rgba(79,45,127,.40) }:root{ --card-pad: clamp(24px,3.2vw,40px); }
.tcard{ padding:var(--card-pad) } /* tutte le card-sezione di vetro */Marquee orizzontale grabbable
Riga di card che scorre in orizzontale, trascinabile (grab) + auto-scroll + loop infinito. Usato in home → “I nostri progetti”. (§15c)
Anteprima statica (cursor:grab + mask). Drag, auto-scroll e loop sono aggiunti dal JS qui sotto.
.mc-prog-rail{ overflow-x:auto; overflow-y:hidden; cursor:grab; scrollbar-width:none;
width:100vw; margin-left:calc(50% - 50vw);
-webkit-mask-image:linear-gradient(90deg,transparent,#000 4%,#000 96%,transparent) }
.mc-prog-rail::-webkit-scrollbar{ display:none }
.mc-prog-rail.is-grab { cursor:grabbing }
.mc-prog-rail.is-grab a{ pointer-events:none } /* no click accidentale dopo drag */
.mc-prog-track{ display:flex; gap:18px; width:max-content } /* card duplicate x2 nel DOM */var down=false, sx=0, sl=0, auto=true;
function wrap(){ var h=track.scrollWidth/2;
if(rail.scrollLeft>=h) rail.scrollLeft-=h; else if(rail.scrollLeft<=0) rail.scrollLeft+=h; }
// auto-scroll idle (NB: niente && -> WP lo converte in & -> SyntaxError; annida gli if)
requestAnimationFrame(function tick(){ if(auto){ if(!down){ rail.scrollLeft+=0.6; wrap(); } }
requestAnimationFrame(tick); });
// drag
rail.addEventListener('pointerdown',function(e){ down=true; sx=e.clientX; sl=rail.scrollLeft;
rail.classList.add('is-grab'); rail.setPointerCapture(e.pointerId); });
rail.addEventListener('pointermove',function(e){ if(down) rail.scrollLeft = sl-(e.clientX-sx); });
rail.addEventListener('pointerup', function(){ down=false; rail.classList.remove('is-grab'); });Full-bleed & template
Band a tutta larghezza e pagine senza margini laterali. (§15d)
/* band a tutta larghezza dentro un container (100vw include la scrollbar!) */
.full-bleed{ width:100vw; margin-left:calc(50% - 50vw) }
/* niente margine laterale sitewide (clip non rompe position:sticky, hidden si) */
html,body{ overflow-x:clip !important }<!-- template custom: twentytwentyfive//fullbleed -->
<!-- wp:template-part {"slug":"header"} /-->
<!-- wp:post-content {"align":"full","layout":{"type":"default"}} /-->
<!-- wp:template-part {"slug":"footer"} /-->Filtri contenuto WordPress
I filtri WP corrompono JS/CSS inline dentro wp:html. Verificati sul campo. (§15e)
if(auto && !down){ ... } // sorgente
if(auto && !down){ ... } // come arriva al browser -> SyntaxErrorGradienti multi-radial
Sfondi sezione morbidi e continui (§3): 4 ellissi radiali sparse + base solida (tecnica mc-aziende-card-gradient). (§15f)
.mc-grad-1{ background:
radial-gradient(ellipse 60% 55% at 15% 20%, rgba(233,126,58,.07), transparent 65%),
radial-gradient(ellipse 55% 50% at 90% 25%, rgba(79,45,127,.06), transparent 65%),
radial-gradient(ellipse 65% 50% at 30% 95%, rgba(242,182,69,.06), transparent 65%),
radial-gradient(ellipse 50% 50% at 85% 90%, rgba(220,205,239,.18), transparent 65%),
#FFFBF4; }